« coroid-server用(さきゅばす用)ffmpegのビルド手順 on Linux | トップページ | coroid ver.0.4.1 検索機能の実装 »

2010/05/31

[読書]GNU開発ツール/西田亙

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 検索機能の実装 »

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/18902/48507485

この記事へのトラックバック一覧です: [読書]GNU開発ツール/西田亙:

« coroid-server用(さきゅばす用)ffmpegのビルド手順 on Linux | トップページ | coroid ver.0.4.1 検索機能の実装 »

other sites

  • follow us in feedly
  • github
  • stackoverflow

ソフトウェアエンジニアとして影響を受けた書籍

  • Christain Bauer: HIBERNATE イン アクション

    Christain Bauer: HIBERNATE イン アクション
    理論と実践が双方とも素晴らしい製品であるHibernate。本書はそのプロダクトを書名に冠していますが、Hibernateを使うつもりがなく、ORマッピングの解説書として読むにしても十分な良書です。Second EditionとしてJava Persistence With Hibernateという書籍も出版されていますが、残念ながら現在のところ 和訳はされていません。-インアクションは2.xの、Java Persistence-は3.1の頃のものなので、最新版とはちょっと違うところもあることに注意。 (★★★★★)

  • アンドリュー・S・タネンバウム: 分散システム 原理とパラダイム 第2版

    アンドリュー・S・タネンバウム: 分散システム 原理とパラダイム 第2版
    クライアント/サーバシステムを構築する上で必要となる知識が総論されてます。Web技術者も、フレームワーク部分を開発するのであれば必読。 (★★★★★)

  • Joel Spolsky∥著: ジョエル・オン・ソフトウェア

    Joel Spolsky∥著: ジョエル・オン・ソフトウェア
    前述の書籍「ソフトウエア開発プロフェッショナル」をより砕いたもの、という感じでしょうか。 前書きではプログラマでなくSE向けの本のように書かれているが、プログラマが読んでも面白い本であると思われます。 SEになった新人(あるいはそういう会社に入る/入りたての人)にとっては、これからどういったことが仕事を遂行していく上で起こりえるのか、どのように考えて行なっていけばいいのか決定する助けになると思います。 元は″Joel on Software″というブログの記事で、web上でも一部日本語で読めます。 http://japanese.joelonsoftware.com/ (★★★)

  • ドナルド・C・ゴース,ジェラルド・M・ワインバーグ: ライト、ついてますか

    ドナルド・C・ゴース,ジェラルド・M・ワインバーグ: ライト、ついてますか
    問題解決(一昔前のの流行語で言うところの『ソリューション』)能力は、システムエンジニアのスキルとして備えるべきもののうちのひとつです。しかし、これは難しい。学校で出されるテストと違い、唯一の、(問題提出者が想定している)解を求めるだけが「問題解決」では無いからです。そもそも、何が問題なのか、それは本当に問題なのか、それは本当に解決すべき問題なのか、その問題解決方法は正しいのか、などを解決しなければ、「その解は正しいのか」に辿りつくことができません。この本の最も良いところのひとつは、本があまり厚くないこと。すぐに読めるし、何回も読み返す気になるでしょう。 (★★★★★)

  • スティーブ・マコネル: ソフトウエア開発プロフェッショナル

    スティーブ・マコネル: ソフトウエア開発プロフェッショナル
    コードコンプリートで有名なスティーブマコネルの著書。新人SEに読んで欲しい。個人として業界の中でどうあるべきか、組織としてどうあるべきか、SEのプロ意識とは?SEの心構え概論、といったところでしょうか。また、業界における資格の重要性についても説かれています。この業界では資格が特に軽んじられる傾向がありますが、この傾向はどんな弊害をもたらすのか、将来的にこの業界は資格に対してどのような姿勢で臨んでいくべきなのか。日経BP社では(他の出版社もだが)最近、似たような類いのあまり面白くない書籍が乱出版されていますが、この本は別格だと思うので安心して購入して欲しいと思います。 (★★★★★)

無料ブログはココログ