[読書]GNU開発ツール/西田亙
まともにプログラミングできるLinux PC環境が整ったので、C言語を再開してみようかな、と思っています。
元々Javaを始めたきっかけが、仕事で使うのがCばかりで、オブジェクト指向とかその辺りのことが全く知識として得られないからでした(ですので、実際には多分まだCの方が書いたコーディング行数は多いと思うのですが…学生時代もCオンリーでしたし)。
で、本書です。今までgccでのプログラミング経験はあるものの、あまりgccコマンドが何をやっているのか知っておらず、ldコマンドなんかも自分で叩いたことはありませんでした。事始めとして、そういった部分を学んでみようと思い、本書を購入しました。
書籍紹介より:
プログラムが誕生するまでには、4つのビルド工程が必要ですが、普段はgccコマンドが裏方でこっそりと処理しているため、私達の目に触れることはありません。その挙動は、-vオプションを与えることで明らかになります。
gcc -v hello.c を実行した際に表示される、呪文のようなメッセージ群を解読するところから、本書は始まります。
まさに自分が知りたい内容です。
本書は"コンピュータアーキテクチャシリーズ"というシリーズ全6章のうちの前半2章、だそうです。が、現時点では本書以降はまだ出版されていません。
ちなみに自費出版だそうで、購入は著者のサイト、もしくはジュンク堂ネットストアHONで注文できます(Amazon等では購入できない様です)。ジュンク堂実店舗でも扱っているところがあるようで、このページで在庫ありの店舗が確認できます。
内容としては、前述の書籍紹介引用部の通り、gccが内部で行っているプリプロセス(cc1 -E)、コンパイル(cc1)、アセンブル(as)、リンク(collect2)の動作を理解し、手動でビルドしてみよう、というものです。リンクは静的リンク、動的リンクそれぞれの方式が解説されています。
gccコマンドを手で入力したり(あるいは簡単なMakefileを手動で作成する程度)、用意された./configure && makeコマンドを叩くくらいしか経験のない私のような人は、一度体系的にこの辺りを学んでみてはどうでしょうか。
ところで、本書がターゲットとしているgccのバージョンはgcc3.3.5で、gcc2.95やgcc4.0.4のことは少し触れられているものの、Ubuntu10.04のデフォルトバージョンであるgcc4.4.3で試してみてうまくいかない箇所がありました。以下にこの部分について記載します。
p.131 実行例16 では、自分が作成したhello.oとlibc.aをリンクしてみて、これだけではリンクが不十分であるという説明があります。undefined referenceが存在するからなのですが、この結果がgcc4.4.3では大きく異なります。
このundefined referenceを解決するために、p.137でlibgcc.aもリンクするようにしています。しかし、Ubuntu10.04のgcc4.4.3ではこれだけでは不十分でした。
gcc -v -static hello.c を実行すると分かるのですが、Ubuntuのgccでは、-lc(libc.a), -lgcc(libgcc.a)の他、-lgcc_ehというライブラリもリンクされており、手動でリンクする場合にもこれを追加する必要がありました。従って、p.137 実行例21の実行コマンドは、
ld hello.o --start-group /usr/lib/libc.a `gcc -print-libgcc-file-name` `gcc -print-file-name=libgcc_eh.a` --end-group; echo $?
となります。ここで登場する-lgcc_eh(libgcc_eh.a), --start-group/--end-groupとは何ぞや?という疑問については、Googleに聞いてください…
また、p.138にcrtファイル群の説明がありますが、この中のcrtbegin.oというファイルが、当環境ではcrtbeginT.oという名前のようでした(ただし、この差異は本題とは関係なさそうです)。
« coroid-server用(さきゅばす用)ffmpegのビルド手順 on Linux | トップページ | coroid ver.0.4.1 検索機能の実装 »
この記事へのコメントは終了しました。
« coroid-server用(さきゅばす用)ffmpegのビルド手順 on Linux | トップページ | coroid ver.0.4.1 検索機能の実装 »
コメント