Glibc 2 HOWTO Eric Green, ejg3@cornell.edu v1.5, 8 February 1998 岡本 一幸 Kazuyuki Okamoto, ikko-@pacific.rim.or.jp 遠藤俊徳 Toshinori Endo, tendo@nucleus.harvard.edu (v1.5か ら) v1.5, 1998年9月15日 GNU C ライブラリ (glibc参照) glibc Glibc 2 HOWTOはLinuxシステム上で のGNU C Library第2版 (libc 6)のインストールと使用について説明します。 ______________________________________________________________________ 目次 1. はじめに 1.1 glibc2について 1.2 この文書について 1.3 この文書の最近の変更 2. インストール方法の選択 3. ライブラリの取得 4. テストライブラリとしてのインストール 4.1 コンパイルとインストール 4.1.1 必要条件 4.1.2 ソースの展開 4.1.3 設定 4.1.4 コンパイルとインストール 4.2 ダイナミックローダのアップデート 4.3 gccの設定 4.4 ヘッダーファイルへのリンクのアップデート 4.5 インストール完了の確認 5. メインのCライブラリとしてのインストール 5.1 ソースからのライブラリ構築 5.1.1 必要条件 5.1.2 ソースの展開 5.1.3 設定 5.1.4 コンパイル 5.2 インストールの準備 5.3 バイナリパッケージからのインストール 5.4 ソースからのインストール 5.5 gcc specsファイルの更新 5.6 インストール完了の確認 6. メインライブラリでないlibcを使ったコンパイル 6.1 メインでないlibcを使う場合の注意 6.2 テスト用glibcを使ったコンパイル 6.3 glibcがメインライブラリのときのlibc5を使ったコンパイル 7. C++プログラムのコンパイル 7.1 テスト用glibcを使うlibg++のインストール 7.2 メインライブラリとしてglibcを使う場合のlibg++のインストール 7.3 メインライブラリでないlibcを使ったC++プログラムのコンパイル 8. バグレポート 9. specs ファイルの例 10. その他 10.1 他の情報 10.1.1 Webページ 10.1.2 ニュースグループ 10.1.3 メーリングリスト 10.2 謝辞 10.3 フィードバック ______________________________________________________________________ 1. はじめに 1.1. glibc2について Glibc2はGNU Cライブラリの最新版です。現在、変更なしで動作するのは、 GNU HurdシステムとLinux i386, m68k, alphaシステムです。PowerPC, MIPS, Sparc, Sparc 64, Arm用のLinux向けには2.1版で対応の予定です。将来的に は、ほかのアーキテクチャーとオペレーティングシステム用にも順次対応の予 定です。 Linuxでは, glibc2 はLinux libc 5の後継、つまりlibcバージョン6 として用 いられます。Linux libc開発者たちはlibc5を(glibc2で)置き換えてしまお うとしています。 2.0.6の段階で、glibcは十分な品質を持つと見なされてい ます。バージョン2.1 (近い将来発表予定)は、より多くの機種へ移植され、 新しい機能も追加されて、中心的に用いられるようになるでしょう。 glibc2には、下記の3つのアドオンを追加できます Crypt UFCの暗号化パッケージ。輸出規制のため、分離されている。 LinuxThreads POSIX1003.1c pthreadインターフェースの実装。 Locale data localeデータファイル構築に必要なデータを含む。 glibcの国際化機能 を使用するときに使われる。 cryptとLinuxThreadsのアドオンは追加することを強く薦めます。使わないと ほかのシステムと互換性に問題が生じる可能性があるからです。(使いたくな い場合は、configure実行時に--disable-sanity-checksオプションを指定する 必要があります)。 1.2. この文書について このHOWTOは既存のLinuxシステムへのglibc2ライブラリのインストールについ て記載されています。Intelベースのlibc5を使用したシステムのユーザ向けに 書かれていますが、ほかのシステムやほかのライブラリ(glibc1など)を使用し ているユーザも、ファイル名やアーキテクチャ名を適当に置き換えることによ り記載された情報を使えるはずです。 このHOWTOの最新版はLinux Documentation Projectの一部として、下記のいず れかのサイトから入手可能です 。 Linux Documentation Project . 1.3. この文書の最近の変更 バージョン1.5と1.4の違い o Ed Baileyによる索引の付加 o 著者のemailアドレスの変更 バージョン1.4と1.3の違い o 現在の状況を実験段階から正式公開段階へ変更 o 移植作業中システムのリストの更新 o 最新バージョンを2.0.6へ更新 2. インストール方法の選択 glibcをインストールするにはいくつかの方法があり、既存のライブラリをデ フォルトとして使用したまま、テスト用に glibc2をインストールすることも できます。この方法では、プログラムをコンパイルする際に、オプション指定 によって新しいライブラリを使うことができます。この方法を使えば、将来簡 単にglibcを削除することができます(ただしglibcにリンクされたプログラム は、ライブラリを削除すると動作しなくなります)。このインストール方法 は、バイナリディストリビューションは存在しないので、ライブラリをソース からコンパイルする必要があります。インストール方法は ``テストライブラ リとしてのインストール'' で述べられています。 この文書に記載されたもう一つのインストール方法は、glibcをメインライブ ラリとして使う場合です。この方法では、古いライブラリをリンクするような オプション指定をしない限り、新しくコンパイルされるプログラムは全 てglibcを使うようにリンクされます。この場合は、ライブラリをバイナリか らインストールすることも自分でコンパイルすることもできます。最適化のレ ベルや設定を変更したい場合は、ソースディストリビューションを入手して、 コンパイルする必要があります。このインストール手順は ``メインのCライブ ラリとしてのインストール'' で述べられています。 Frodo Looijaardは、独自のglibcのインストール方法を述べています。彼の方 法はglibcを第2のライブラリとしてglibcを使ったクロスコンパイルの設定に ついてのものです。この方法によるインストールの手順は、この文書中の「テ ストライブラリとしてのインストール」より複雑ですが、 glibcをリンクする 際のコンパイラ指定がより簡単です。この方法は彼の Linuxへのglibc2のイン ストール に記載されています。 現在Debian1.3を使っているが、glibcを使うためだけに不安定なバージョンに アップグレードするのがいやな場合、 Debian での libc5 から libc6への移 行 Mini-HOWTO を参考にしてください。Debianパッケージを使ったシステムの アップグレードの仕方が記載されています。 glibc2を重要なシステムにインストールするときは、テストインストールを 行ったがいいかも知れません。 関数プロトタイプや型が変更されているた め、コンパイルするためには、修正が必要かも知れないからです。 3. ライブラリの取得 glibc2はglibcパッケージと3つのアドオンパッケージ、LinuxThreads, Locale Cryptからなります。ソースは以下のサイトで取得可能です。 o o o o 全コンパイルとインストールには、約150MBのディスクスペースが必要です。 コアライブラリパッケージのみの基本バイナリインストールでは約50MBが必要 です。 2.0.6のバイナリパッケージはまだ準備中です。2.0.4バイナリパッケージは i386とm68k用があります。alpha用は2.0.1があります。これらは下記から取得 できます。 o Intel x86: o o o Alpha: o o o m68k: o o cryptアドオンには輸出規制があります。米国以外のユーザは、 から取得してください。 Red Hatディストリビューションを使用している場合、glibc2用のRPMを から取得できます。Glibc2はあたらし いRedHatディストリビューション5.0ではメインのCライブラリになっていま す。 Debianディストリビューションを使用している場合、glibc2用のパッケージを で入手できます。ファ イル名はlibc6となっています。Debianのhammバージョンでは。glibc2が基本 パッケージの一部なっており、Debian2.0がリリースされるときには、メイン のlibcとなる予定です。 4. テストライブラリとしてのインストール この節では、glibc2をテストライブラリとしてインストールする方法について 説明します。オプション指定をしない限り、コンパイルしたものは、既存のラ イブラリにリンクされます。かなりの数のファイルにパスを記述する必要があ るので、ソースからインストールを行わなくてはならないでしょう。 4.1. コンパイルとインストール 4.1.1. 必要条件 o 約150MBの空ディスクスペース o GNU make 3.75 o gcc >= 2.7.2 (2.7.2.1以上が望ましい) (訳注 ix86-Linuxで は、glibc-2.0.6のコンパイルにはgcc-2.8.1以上が必要です) o binutils 2.8.1 (alpha用にはsnapshotが必要) o bash 2.0 o autoconf 2.12 (configure.inを変更するときのみ) o texinfo 3.11 フルライブラリとアドオンのコンパイルに、i586@133, 64MB RAMで約3時間、 フル装備のi686@200では約30分かかります。 4.1.2. ソースの展開 コンパイルにはいる前に、アーカイブからソースを展開する必要があります。 もっとも良いのは次の方法です。 tar xzf glibc-2.0.6.tar.gz cd glibc-2.0.6 tar xzf ../glibc-linuxthreads-2.0.6.tar.gz tar xzf ../glibc-crypt-2.0.6.tar.gz tar xzf ../glibc-localedata-2.0.6.tar.gz これによりlinuxthreads,crypt,localedataディレクトリがglibc-2.0.6に置か れ、configureがこれらのアドオンを認識できるようになります。 4.1.3. 設定 glibc-2.0.6ディレクトリに compileという名のディレクトリを作成し、 cdし ます。作業は全てそこで行います。これにより後片付けが楽になります。(ま だ、make cleanが完璧に動作するようになっていないからです。) mkdir compile cd compile ../configureを実行します。アドオンパッケージを使うためには、 --enable- add-ons=--enable-add-ons=linux-threads,crypt,localedata のように指定す る必要があります。インストール先のディレクトリも指定する必要がありま す。/usr/i486-linuxglibc2というのが良いでしょう。最終的に、コマンドラ インは次のようになるでしょう。 ../configure --enable-add-ons=linuxthreads,crypt,localedata --prefix=/usr/i486-linuxglibc2 4.1.4. コンパイルとインストール コンパイルとチェックは下記の通りです。 make make check make checkがうまくいったらライブラリをインストールします。 make install 4.2. ダイナミックローダのアップデート 1. 新しいld.soから/lib/ld-linux.so.2へリンクを張ります。 ln -s /usr/i486-linuxglibc2/lib/ld-linux.so.2 /lib/ld-linux.so.2 このライブラリだけが、プログラムにリンクされるもののなかで唯一場所の固 定されているものです。/libへのリンクを使うことで、安定版のglibcができ たときに、メインのCライブラリとしてのアップグレードが容易になります。 /etc/ld.so.confを編集します。この際に。ライブラリのあるディレクトリ名 の後に/libを加える必要があります。つまり/libのようになり、前述 の例で言えば、/usr/i486-linuxglibc2/libとなります。 /etc/ld.so.confを 編集後、 ldconfig -v 4.3. gccの設定 インストールの最後のステップは、gccが新しいライブラリを認識できるよう にするための/usr/lib/gcc-libの修正です。まず、既存の設定をコピーする必 要があります。どの設定が現在使われているものかを調べるには、gccの-vオ プションを用います。 % gcc -v Reading specs from /usr/lib/gcc-lib/i486-unknown-linux/2.7.2.2/specs gcc version 2.7.2.2 この場合は、i486-unknown-linuxがシステム、2.7.2.2がバージョンです。 /usr/lib/gcc-lib/<システム>をテストシステムディレクトリにコピーしま す。 cd /usr/lib/gcc-lib/ cp -r i486-unknown-linux i486-linuxglibc2 テスト用の新しいシステムディレクトリとバージョンディレクトリに移動しま す。 cd /usr/lib/gcc-lib/i486-linuxglibc2/2.7.2.2 そして、そのディレクトリのファイルspecsを編集します。このファイルの中 の/lib/ld-linux.so.1を/lib/ld-linux.so.2 に変更します。ま た、%{...:-lgmon}と書かれた部分を削除します。 glibcはプロファイリング にgmonライブラリを使用しないからです。サンプルのspecsファイルは ``specsファイルのサンプル'' セクションを参照してください。 4.4. ヘッダーファイルへのリンクのアップデート 新しいディレクトリの下に、ほかのディレクトリへのリンクを張ります。 cd /usr/i486-linuxglibc2/include ln -s /usr/src/linux/include/linux ln -s /usr/src/linux/include/asm ln -s /usr/X11R6/include/X11 ncursesなど、新しいディレクトリにヘッダーファイルを入れるべきライブラ リを使用している場合、/usr/includeからファイルをコピーするかリンクを張 ります。(ライブラリによっては、glibc2と一緒に再コンパイルしないと適切 に動作しないものがあります。その場合、そのパッケージを単にコンパイルし て/usr/i486-linuxglibc2にインストールしてください) 4.5. インストール完了の確認 インストール完了を確認するために、次のプログラムをglibc.cファイルとし て作成してください。 #include main() { printf("hello world!\n"); } そして、"-b -nostdinc -I/include -I/usr/lib/gcc-lib// /include" というオプションでコンパイルします。 % gcc -b i486-linuxglibc2 -nostdinc -I/usr/i486-linuxglibc2/include -I/usr/lib/gcc-lib/i486-linuxglibc2/2.7.2.2/include glibc.c -o glibc (訳注)私のシステムでは下記のようにしないと正しくリンクされませんでし た。 gcc -b i686-linuxglibc2 -nostdinc -I/usr/i686-linuxglibc2/include -I/usr/local/lib/gcc-lib/i686-linuxglibc2/2.8.1/include glibc.c -o glibc -L/usr/i686-linuxglibc2/lib (-Lオプションがみそ) lddを使って、プログラムが古いlibcではなく新しいglibc2にリンクされたこ とを確認します。 % ldd glibc libc.so.6 => /usr/i486-linuxglibc2/lib/libc-2.0.6.so (0x4000d000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) コンパイルができて、正しいリンクが確認でき、実行したときに "hello world!"というメッセージが出れば、インストールは成功です。 5. メインのCライブラリとしてのインストール このセクションでは、glibc2をメインのCライブラリとしてインストールする 方法を説明します。新しくコンパイルされるプログラムは、オプション指定を しない限り、このライブラリにリンクされるようになります。 RedhatかDebianを使っていて、適切なebファイルをダウンロードしたのであれ ば、RedhatかDebianのインストールインストラクションをご覧下さい。その場 合、このセクションは読み飛ばしてかまいません。 5.1. ソースからのライブラリ構築 この節では、ソースからglibc2とアドオンをコンパイルする方法を説明しま す。最適化レベルや設定を変更したい場合、およびバイナリパッケージのない 場合、ライブラリのコンパイルが必要になります。 5.1.1. 必要条件 o 約150MBの空きディスク容量 o GNU make 3.75 o gcc >= 2.7.2 (2.7.2.1が望ましい) (訳注: gcc-2.8.1以上が必要です。) o binutils 2.8.1 (alpha用にはsnapshotが必要) o bash 2.0 o autoconf 2.12 (configure.inを変更する場合) o texinfo 3.11 i586@133, 64 MB RAMのシステムでは、全ライブラリとアドオンのコンパイル に約3時間かかります。フル装備のi686@200では、約30分です。 5.1.2. ソースの展開 コンパイルするためには、アーカイブを展開してソースを取り出す必要があり ます。最良の方法は次の通りです。 tar xzf glibc-2.0.6.tar.gz cd glibc-2.0.6 tar xzf ../glibc-linuxthreads-2.0.6.tar.gz tar xzf ../glibc-crypt-2.0.6.tar.gz tar xzf ../glibc-localedata-2.0.6.tar.gz これにより、linuxthreads, crypt, localedataディレクトリがglibc-2.0.6 ディレクトリ内に置かれ、configureがこれらのアドオンを認識できるように なります。 5.1.3. 設定 glibc-2.0.6ディレクトリ内にcompileというディレクトリを作成し、そこへ cdして、全ての作業をこの中で行います。これにより、インストール後の消去 作業が楽になります。(プログラム開発者が、'make clean'をまだ完全に働く ようにはしていないからです。) mkdir compile cd compile 次に../configureを実行します。アドオンパッケージを使うためには、 --enable-add-ons=linux-threads,crypt,localedataのようにしてオプション 指定する必要があります。インストールするパスを指定する必要もあるかもし れません。標準的なlinuxディストリビューションに合わせるには、 --prefix=/usrを指定します。(linuxシステムで/usrがprefixとして指定され るとconfigureはlibc.soやほかの重要なライブラリを/libに格納し、ほかの pathを適切に調整します。)最終的なコマンドラインは次のようになるでしょ う。 ../configure --enable-add-ons=linuxthreads,crypt,localedata --prefix=/usr 5.1.4. コンパイル コンパイルとチェックは次の通りです。 make make check 5.2. インストールの準備 ソースからインストールする場合にせよ、バイナリからインストールする場合 にせよ、新しいライブラリの準備のために、いくつかのファイルを待避する必 要があります。新しくコンパイルされるプログラムは、glibcにリンクされま すが、古いプログラムのうち、動的にリンクされたものはlibc5に依存してい るため、単に古いバージョンを上書きするわけには行かないのです。 1. 古いファイルを待避するための新しいディレクトリを作成します。 mkdir -p /usr/i486-linuxlibc5/lib 2. 古いヘッダーファイルを/usr/includeから待避させます。 mv /usr/include /usr/i486-linuxlibc5/include 3. 新しいincludeディレクトリを作成し、ほかのincludeディレクトリへのリ ンクを作成します。 mkdir /usr/include ln -s /usr/src/linux/include/linux /usr/include/linux ln -s /usr/src/linux/include/asm /usr/include/asm ln -s /usr/X11R6/include/X11 /usr/include/X11 ln -s /usr/lib/g++-include /usr/include/g++ ディストリビューションによっては、リンク先を調整する必要があるかもしれ ません。少なくとも、Slackwareはg++ヘッダーファイルを /usr/local/g++-includeに置いてあり、Debianでは/usr/include/g++に置いて あって、/usr/lib/g++-includeを/usr/include/g++にリンクしてあります。後 者の場合は、元のg++ includeディレクトリを/usr/includeに戻しておいた方 が良いでしょう。 上記以外の全てのヘッダーファイルやリンクの回復を行います。ncursesなど の非標準ライブラリのいくつかは、ファイルか独自のincludeディレクトリへ のリンクを/usr/includeに置いています。そういったライブラリを適切に使用 するためには、それらのファイルやリンクの設定を適切が行われている必要が あるのです。 4. 新しいライブラリディレクトリ(/usr/i486-linuxlibc5/lib)を /etc/ld.so.confファイルの先頭に加えます。 glibcがインストールされた あと奇妙なメッセージが出るのを避けるためには、 ld.so 1.8.8以降を 使った方がよいでしょう。 5. 古いCライブラリを新しいディレクトリに移動/コピーします。 mv /usr/lib/libbsd.a /usr/i486-linuxlibc5/lib mv /usr/lib/libc.a /usr/i486-linuxlibc5/lib mv /usr/lib/libgmon.a /usr/i486-linuxlibc5/lib mv /usr/lib/libm.a /usr/i486-linuxlibc5/lib mv /usr/lib/libmcheck.a /usr/i486-linuxlibc5/lib mv /usr/lib/libc.so /usr/i486-linuxlibc5/lib mv /usr/lib/libm.so /usr/i486-linuxlibc5/lib cp /lib/libm.so.5.* /usr/i486-linuxlibc5/lib cp /lib/libc.so.5.* /usr/i486-linuxlibc5/lib /usrが/とは別のパーティションにある場合、 libm.so.5とlibc.so.5は、移動 せずにコピーしてください。これらはlinuxを起動する際に使われるプログラ ムが必要とするファイルであり、ルートドライブパーティションになくてはな らないからです。 6. /usr/lib/*.oファイルを新しいディレクトリに移動します。 mv /usr/lib/crt1.o /usr/i486-linuxlibc5/lib mv /usr/lib/crti.o /usr/i486-linuxlibc5/lib mv /usr/lib/crtn.o /usr/i486-linuxlibc5/lib mv /usr/lib/gcrt1.o /usr/i486-linuxlibc5/lib 7. ライブラリを移動したら、ライブラリキャッシュを更新します。 ldconfig -v 5.3. バイナリパッケージからのインストール glibcをコンパイル済バイナリを使ってインストールするときは、次のように する必要があります。 cd / gzip -dc glibc-2.0.bin.i386.tar.gz | tar tvvf - gzip -dc glibc-crypt-2.0.bin.i386.tar.gz | tar tvvf - ldconfig -v 異なったアーキテクチャかバージョンを使用している場合は、適当なファイル 名に読み替えてください。 5.4. ソースからのインストール ライブラリをソースからインストールするには次のようにします。 make install ldconfig -v 5.5. gcc specsファイルの更新 インストールの最終段階は、バイナリからの場合もソースからの場合も、リン クが適切に行われるようにするためのgcc specsファイルの更新です。 gccが どのspecsファイルを使っているかを調べるには、次のようにしてください。 % gcc -v reading specs from /usr/lib/gcc-lib/i486-unknown-linux/2.7.2.2/specs gcc version 2.7.2.2 上の例では、i486-unknown-linuxがシステム名、2.7.2.2がバージョン番号で す。/usr/lib/gcc-lib/<システム>を古いシステムディレクトリにコピーしま す。 cd /usr/lib/gcc-lib/ cp -r i486-unknown-linux i486-linuxlibc5 次に、元のディレクトリとバージョンディレクトリに移動します。 cd /usr/lib/gcc-lib/i486-unknown-linux/2.7.2.2 そして、そのディレクトリのspecsファイルをコピーします。このファイル中 で、/lib/ld-linux.so.1と書かれた部分を/lib/ld-linux.so.2に変更します。 また、%{...:-lgmon}という記述を全て削除します。glibcはプロファイリング にgmonライブラリを使わないためです。specsファイルの例は ``specsファイ ルの例'' 節を参照してください。 5.6. インストール完了の確認 インストール完了を確認するために、次のプログラムをファイルとして作成し てください。 #include main() { printf("hello world!\n"); } そして、コンパイルします。 % gcc glibc.c -o glibc lddを使って、プログラムが、古いlibcでなく新しいglibc2にリンクされてい ることを確認します。 % ldd glibc libc.so.6 => /lib/libc.so.6 (0x4000e000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) コンパイルがうまく行き、プログラムを実行したときに"hello world!"と表示 されればインストール成功です。 (訳注)make を使用してコンパイルする場合、設定にも因りますが、 /usr/bin/ccが呼ばれてリンクがうまく行かないことがあります。この場 合、gccを/usr/bin/ccにコピーするか、環境変数(またはmakeマクロ)CCを gccを指すように変更してください。 6. メインライブラリでないlibcを使ったコンパイル プログラムのコンパイルの際、メインライブラリ以外のライブラリを使という こともあるでしょう。このセクションでは、このような場合にどうしたら良い のかを、前の2節のディレクトリとインストール名を使って説明します。実際 に使用するときは、各自の設定に合わせて名前を読み替えて下さい。 6.1. メインでないlibcを使う場合の注意 システムブートプロセスが使用するプログラムをコンパイルする時は、注意が 必要です。プログラムが動的にリンクされていて、かつルートでないパーティ ションがマウントされる前に使用されるプログラムである場合には、リンクさ れる全てのライブラリがルートパーティションになくてはなりません。前節の メインライブラリとしてglibcをインストールする場合の説明に従えば、古 いlibcはルートパーティション上の/libに残されるので、ブートプロセス中、 全てのプログラムが適正に動作するはずです。しかし、/usrが別のパーティ ションにあって、glibcをテストライブラリとして/usr/i486-linuxglibc2にイ ンストールした場合、 glibcを使ってコンパイルされた新しいプログラム は、/usr パーティションがマウントされるまで動作しません。 6.2. テスト用glibcを使ったコンパイル テスト用にインストールされたglibcを使ってコンパイルするときは、glibc のincludeを指すようにincludeパスを再設定する必要がありま す。"-nostdinc" 指定によって、通常のパスを無効に し、"-I/usr/i486-linuxglibc2/include" を指定することで、glibc includeを指定できます。gcc includeも指定する指定する必要があります。こ れは/usr/lib/gcc-lib/i486-linuxglibc2/ 2.7.2.2/include にあります。(テ スト用ライブラリがi486-linuxglibc2で gccのバージョンが2.7.2.2の場合) テスト用glibcへプログラムをリンクする場合は、gccの設定を指定する必要が あります。これには、"-b i486-linuxglibc2"オプションを使います。 多くのプログラムでは、makefileの$CFLAGSと $LDFLAGSオプションを下記のよ うに設定することで新しいオプションの指定ができます。 CFLAGS = -nostdinc -I/usr/i486-linuxglibc2/include -I/usr/lib/gcc-lib/i486-linuxglibc2/2.7.2.2/include -b i486-linuxglibc2 LDFLAGS = -b i486-linuxglibc2 configureスクリプトを使っている場合、configureを実行する前に $CFLAGSと$LDFLAGSシェル変数を定義します(csh/tcshの場 合env/setenv,sh/bash等ではset/exportを使用)。これによって生成され るmakefileは適切な$CFLAGSと $LDFLAGSを含んでいるはずです。ただし、全て のスクリプトがこれらの変数を確認するわけではないので、 configureを実行 した後、makefileを確認し、必要に応じて編集してください。 コンパイルしようとしているプログラムが、gccのみを使用しているときは (cppやbinutilsディレクトリを直接使用しなければ)、下記のスクリプトを 使えば毎回全オプションを指定せずに済みます。 #!/bin/bash /usr/bin/gcc -b i486-linuxglibc2 -nostdinc \ -I/usr/i486-linuxglibc2/include \ -I/usr/lib/gcc-lib/i486-linuxglibc2/2.7.2.2/include "$@" You can then use this script instead of "gcc" when compiling. gccの代 わりにこのスクリプトを使用してください。 6.3. glibcがメインライブラリのときのlibc5を使ったコンパイル glibcをメインライブラリとしてインストールしてあるときに、古いライブラ リを使ってプログラムをコンパイルするには、古いライブラリ用にパスを再設 定する必要があります。これには、"-nostdinc"オプションを指定して通常の パスを無効にし、"-I/usr/i486-linuxlibc5"を使ってglibc(*) のincludeディ レクトリを指定します。また、"-I/usr/lib/gcc- lib/i486-linuxlibc5/2.7.2.2/include" を指定してgcc特有のincludeファイ ルディレクトリを指定します。なお、パス名は各自の設定やgccバージョンに 合わせて調整してください。 (*訳注) libc5の間違いと思われます。 古いlibcにプログラムをリンクするには、gccの設定を指定する必要がありま す。これは、オプション"-b i486-linuxlibc5"を指定すればOKです。 多くのプログラムでは。makefile中で$CFLAGSと $LDFLAGSに新しいオプション を加えればよいはずです。 CFLAGS = -nostdinc -I/usr/i486-linuxlibc5/include -I/usr/lib/gcc-lib/i486-linuxlibc5/2.7.2.2/include -b i486-linuxlibc5 LDFLAGS = -b i486-linuxlibc5 configureスクリプトを使っているときは、configure実行前に、シェル変数 $CFLAGSと$LDFLAGSを定義します (csh/tcshではenv/setenv, sh/bash等で はset/exportを使用)。自動生成されたmakefileには、適切に$CFLAGSと $LDFLAGSが記述されているはずですが、全てのconfigureスクリプトがこれを 行ってくれるわけではないので、 configure実行後makefileを確認し、必要に 応じて編集してください。 もし、コンパイルしようとしているプログラムがgccのみを呼び出しているな らば(cppやbinutilsを直接必要としていないならば)、下記のスクリプトを 使えば、毎回オプションを指定しなくてもすみます。 #!/bin/bash /usr/bin/gcc -b i486-linuxlibc5 -nostdinc \ -I/usr/i486-linuxlibc5/include \ -I/usr/lib/gcc-lib/i486-linuxlibc5/2.7.2.2/include "$@" You can then use this script instead of "gcc" when compiling. コンパイル時に"gcc"の代わりにこれを使えば良いわけです。 7. C++プログラムのコンパイル libg++は数学ライブラリの一部を使用しているので、libmにリンクされていま す。既存のlibg++は古いライブラリを使用するようにコンパイルされているで しょうから、libg++をglibcを使って再コンパイルするか、バイナリ版を入手 する必要があります。最新のlibg++ソースと、glibcにリンクされたバイナリ (x86用)は にあります。 7.1. テスト用glibcを使うlibg++のインストール glibcをテストライブラリとしてインストールした場合、glibcと同じディレク トリにlibg++のファイルもインストールする必要があります(前節の例では /usr/i486-linuxglibc2)。バイナリパッケージからインストールする場合は (私自身はこのようにしてlibg++をコンパイルしたことがありませんが、もし そのようなものがあるとすれば、おすすめします)、ファイルをテンポラリ ディレクトリに展開してから、usr/libのファイルを<インストール先ディレク トリ>/lib/へ usr/libディレクトリのファイルを<インストール先ディレクト リ>/lib/ディレクトリへ(はじめにinclude/g++ のリンクを削除しておくこと をお忘れなく!)そして、usr/bin/ のファイルを<インストール先ディレクト リ>/bin/ディレクトリへ移動します。 7.2. メインライブラリとしてglibcを使う場合のlibg++のインストール glibcをメインライブラリとしてインストールした場合で、g++プログラムを以 前のCライブラリとともに使用したいならば、まず、古いlibg++ファイルを古 い libcディレクトリに移動します。たぶん一番簡単な方法は、前節で説明し たようにしてlibc5を使ってlibg++をコンパイルしてインストールし、次に glibc版を通常どおりインストールすることです。 7.3. メインライブラリでないlibcを使ったC++プログラムのコンパイル C++プログラムをメインでないlibcとともに使用した場合、g++のincludeディ レクトリをincludeするように指定する必要があります。上の例で言えば、テ スト用glibcなら/usr/i486-linuxglibc2/include/g++、メインのglibcなら /usr/i486-linuxlibc5/include/g++になります。このためには通常、 $CXXFLAGS変数指定を付加します。 CXXFLAGS = -nostdinc -I/usr/i486-linuxglibc2/include -I/usr/lib/gcc-lib/i486-linuxglibc2/2.7.2.2/include -I/usr/i486-linuxlibc5/include/g++ -b i486-linuxglibc2 8. バグレポート もしライブラリにバグがあると思うときは、まずにFAQに目を通してくださ い。ほかの人がすでにこの問題を見つけていて、簡単な解決方法が示されてい るかもしれません。また、INSTALLファイル内の"GNU Cライブラリをインスト ールするための推奨ツール (Recommended Tools to Install the GNU C Library)"の項目も確認してください。バグによっては、 glibc自身のもので はなく、ほかのツールに原因のある可能性があるからです。 バグを見つけたらまず、それが本当にバグかどうか確かめてください。確認の ための良い方法は、GNU Cライブラリが他のライブラリと同じ動作をするかど うか確めることです。もし動作が同じなら、おそらく間違っているのはあなた で、(必ずしもそうとは言えませんが)ライブラリは正しいのでしょう。そう でなければ、たぶんんどちらかのライブラリが間違っているのでしょう。 次に、 に行き、バグ データベースを確認して、同じ問題が報告済でないかどうか確認します。分 かっているバグについては、(libcと共に配布されている)BUGSも確認すべきで す。 新しいバグだということが確認できたら、問題を再現できる最低限のテストケ ースの範囲まで問題の幅を狭めてください。Cライブラリの場合は、可能な限 り、一つのライブラリ関数呼び出しにまで問題を狭めるべきです。これはさほ ど難しくないでしょう。 簡単なテストケースに絞ることができたら、最後のステップはバグを報告する ことです。バグを報告するときは、テストケース、実際に得られた結果と期待 される結果、そして(もしあれば)この問題の原因と考えられる要因、テスト に使ったシステムの種類、GNU CライブラリとGNU Cコンパイラ、 GNU Binutilsのバージョンを送ってください。configureによって生成された config.statusとconfig.makeも含めてください。これらは、configureを実行 したときのカレントディレクトリにあります。 GNU Cライブラリのバグは、GNU libcに付属のglibcbugシェルスクリプトを 使って へ送ってください(古いアドレス もまだ使えます)。あるいは、 から、GNATS WEBインターフェー スを使って投稿することもできます。 提案や質問はメーリングリスト へ送ってくだ さい。もし、gnewsgroup gnu.bug.glibc を読んでいない場合、 に請求すれば、リストを取り寄せることができま す。 GNU Cライブラリのバグレポートを に送ることは 避けてください。こちらは、GNU CCのバグレポートのためのものです。 GNU CCは別の人々によってメンテナンスされており、GNU Cライブラリとは別物だ からです。 9. specs ファイルの例 ここでは、gccがコンパイルとリンクに使用する glibc2 用のspecs ファイル の例を紹介します。このファイルは、/usr/lib/gcc-lib/ <新しいシステム ディレクトリ>/にあります。 x86システムを使用している 場合、このセクションの内容をそのままファイルにコピーすれば良いでしょ う。 *asm: %{V} %{v:%{!V:-V}} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*} *asm_final: %{pipe:-} *cpp: %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{!m386:-D__i486__} %{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT} *cc1: %{profile:-p} *cc1plus: *endfile: %{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s *link: -m elf_i386 %{shared:-shared} %{!shared: %{!ibcs: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} %{static:-static}}} *lib: %{!shared: %{pthread:-lpthread} %{profile:-lc_p} %{!profile: -lc}} *libgcc: -lgcc *startfile: %{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:%{profile:gcrt1.o%s} %{!profile:crt1.o%s}}}} crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s} *switches_need_spaces: *signed_char: %{funsigned-char:-D__CHAR_UNSIGNED__} *predefines: -D__ELF__ -Dunix -Di386 -Dlinux -Asystem(unix) -Asystem(posix) -Acpu(i386) -Amachine(i386) *cross_compile: 0 *multilib: . ; 10. その他 10.1. 他の情報 10.1.1. Webページ o FSFのGNU C ライブラリホームページ o LinuxでGNU Libc2を使う o Linuxにglibc-2をインストールする o Debianでのlibc5からlibc6の移行Mini-HOWTO 10.1.2. ニュースグループ o comp.os.linux.development.system o comp.os.linux.development.apps o linux.dev.kernel o gnu.bugs.glibc 10.1.3. メーリングリスト Glibc2 Linuxディスカッションリスト このリストは新しいGNU Cライブラリであるglibc2をインストールした Linuxユーザ間での情報交換を意図したものです。トピックは互換性か ら、Linux/glibcセットでのコンパイルについての質問のものまで含み ます。購読するには、Majordomo@ricardo.ecn.wfu.edu宛に subscribe glibc-linux <あなたのemailアドレス> と書いてメールを送ってくださ い。 10.2. 謝辞 掲載した情報のほとんどは、GNU Libc WEBページ GNU Libc web page とUlrich Drepper's glibc2 アナウンス、および彼のコメントから とってきたものです。 Andreas Jaeger は、バ グレポートの節についての情報の一部を提供してくれました。 以下は情報提供およびこの文書についてのフィードバックをしてくれた人たち です。 o Allex o Mark Brown o Ulrich Drepper o Scott K. Ellis o Aron Griffis o Andreas Jaeger o Frodo Looijaard o Ryan McGuire o Shaya Potter o Les Schaffer o Andy Sewell o Gary Shea o Stephane o Jan Vandenbos 翻訳は下記の人たちが行っています。 o 中国語: Allex o フランス語: Olivier Tharan o 日本語: Kazuyuki Okamoto (訳注) 日本語v1.5に置いて、下記の人たちから助言と協力を頂きました。 (敬称略) o 岡本一幸 o 中野@成蹊大 o 中野@asahi-net o 川岸良治 10.3. フィードバック 私自身は、このHOWTOを書くこと、Linux 用 glibc2のホームページ glibc 2 for Linux を維持していること、 glibc2 を使っていること以外、glibc プロジェクトには関与していません。 メールで送られてきた問い合わせにはなるべく答えられるよう努力はしている ものの、私は glibc2 について知識が十分にありません。フィードバック、訂 正、提案などは歓迎しますので ejg3@cornell.edu 宛にお願いします。 (訳注) 日本語訳 (v1.5)に関しては、遠藤俊徳 へお 願いします。 Copyright (c) 1997 by Eric Green. (原文) Copyright (c) 1997 by Kazuyuki Okamoto (日本語訳) Copyright (c) 1998 by Toshinori Endo (日本語訳) この文書はLDPライセンスに基づいて配布可能です。