Linkers & Loaders

Linkers & Loaders レビュー記事

[ ブックレビューコーナー 目次 ]

株式会社オーム社 様のご厚意により, 書籍 "Linkers & Loaders" を ブックレビューコーナー にご献本いただきました. この本のレビューをして頂くべく, Linux Users ML や本サイトにおいて 公募 を行い, これにご希望頂いた方々より感想などをレビュー記事にまとめていただきました.

ここに, レビューアの方々から寄せられたレビュー記事を公開します. (原稿到着順)

株式会社オーム社 様および レビューアの皆様のご厚意に感謝いたします.

なお, 以下のレビューは初版を対象としています.


Reviewed by 永江達也 (nail@mtj.biglobe.ne.jp) さん

「言語処理系 (コンパイラ & リンカなど) を学ぶ学生に最適の教科書」

Linux の使用歴
3 年
UNIX の使用歴
15 年
Linux Box の主な用途
お遊び
Linux 以外に利用している OS
Windows 2000
Linux と Linux 以外の OS の使用頻度の比
3 : 7

はじめに

この業界に入り, 10 年近くデバッガの開発に従事していた事もあって, 今回のブックレビューに参加しました. 近年はダイナミック・リンクライブラリなどの登場によって, Linker と Loader の処理が重要になっています. 本書は, その謎を解き明かす糸口を読者に提供してくれます.

最初に感じた事

長い間この業界にいますが, そういえばコンパイラ関連の解説本は結構あり Yacc や lex の本など入手済みですが, Linker や Loader などの解説本は初めて手にした次第です. それも和訳本ですから, 大変ありがたい話です. 言語処理系の新人向け入門書としては, 取りかかりやすいかと感じます.

コンピュータを学ぶ人の教科書としての位置付けは?

各章毎におすすめを記入して見ました.

  入門者向け専門家向け
第 1 章リンクとロード
第 2 章アーキテクチャに関する問題
第 3 章オブジェクトファイル
第 4 章記憶領域の割り当て
第 5 章シンボルの管理
第 6 章ライブラリ
第 7 章再配置
第 8 章ロードとオーバーレイ
第 9 章共有ライブラリ
第 10 章動的なリンクとロード
第 11 章高度なテクニック

Windows 系の OS の事や UNIX 系の OS と多岐にわたる内容が記載され 後半の章では, それぞれに踏み込んだ説明がなされています. そのために, 後半の章を読んで理解するには入門者には高度な内容となっています. しかしながら, 業界人であれば 第 8 章, 第 10 章, 第 11 章あたりは読んで理解しても損は無い内容が詰まっています.
また, 各章の終わりに「演習」「課題」がありますが, それだけを読むとかなり高度な質問となっています. 大学などで真剣に学ぶ学生の皆様には大変有意義なテキストとなるはずです.

本書の演習で利用する Perl のソースファイルが, 下記の URL にあります.

合わせて, 原文の英語も公開されているので, まさに学生向き.
かさねて言語処理系でもリンカ等の研究に足を踏み出す方には, お勧めの本かと思います.

個人的な趣味としての感想

シンボル情報に関する豊富な解説を期待してしまいました. 特に, 行情報シンボルなどデバッガで利用するシンボルの管理方法など ELF ファイルのシンボル情報について詳しい解説があれば gdb 等のデバッガのソース解析に有効利用できるかと大変期待していました. しかし内容的にもさらっと流れたような感じでしたので趣味の領域としてはヒットしませんでしたが, シンボル情報の関する解説のある本は他には無いのではないかと思います. マニアな世界ですが, デバッガを作る新人さんにもこの本はお勧めです.

この本の続編に期待したい事

この本を読んでオーム社殿に期待したい所を最後に記述します.
教材としての更なる活用を考えた場合に


Reviewed by 佐藤正博 (m@sa.to) さん (HomePage)

「やる気のある人にはお勧め」

Linux の使用歴
5 年 (Slackware -> Plamo -> Vine)
UNIX の使用歴
8 年半
Linux Box の主な用途
自宅で, メール読み書きや web browsing など
Linux 以外に利用している OS
MacOS, Windows (主に職場で)
Linux と Linux 以外の OS の使用頻度の比
99 : 1 (自宅), 0 : 100 (職場 :-p)

全体的な感想

本書は, アプリケーションを作成したり実行したりするときに縁の下で行われている, リンク処理およびロード処理について解説したものである. オブジェクトファイルやライブラリの構造, 具体的なリンク処理やロード処理など, この領域のトピックスが広範囲に渡って取り上げられ, 詳しく説明されていると思う. また, 類書を書店でほとんど見かけないことを考えると, 本書はリンク処理やロード処理に関する, 日本語で読める貴重な資料であるといえる.

なお, 本書の原書にはサポートページ (http://linker.iecc.com/) がある. そしてこのサポートページからリンクをたどると, 原書の原稿を公開しているページへ行くことができる. 興味がある人は, サポートページからリンクをたどって見に行って欲しい.

本書を勧めたい人

リンク処理やロード処理に興味はあるけど, 何から手を付ければ良いのか分からないというような人には, 勉強のスタートとして本書を勧める. あるいは, リンク処理やロード処理について断片的に持っている知識を整理したい人にも, 本書は役に立つだろう. また, 例えば ld のソースコードを読むような場合でも, 本書の内容を予備知識として持っておけば, 理解が進むのではないかと思う.

ただ, 趣味でプログラムを書き, ブラックボックスとしてコンパイラやライブラリを使用する私にとっては, 予想はしていたが, 本書のレベルは非常に高かった. したがって私のように, 既存のコンパイラやリンカを利用してアプリケーションを作る だけ の人には, 敢えて本書は勧めない. オブジェクトファイルの構造に関して多少の知識を持っていても, 良いプログラムを書くことはできないと思うからだ.

良い点

本書のレベルは高いが, その難しい内容を理解させるための工夫がいろいろとなされている. 1 つは, 概念図が適当に用いられている点である. アルゴリズムやデータ構造の解説の際に, 文字だけではなく図を併用し, 分かりやすく説明している.

もう 1 つの工夫としては, 各章の最後に演習や課題がある点が挙げられる. 読者にその意欲があるのなら, 演習や課題を通じて自分の理解度をチェックできると思う.

また, 巻末には本書の参考文献が数多く挙げられており, さらに発展的な勉強をする際のポインタとして使えるだろう. また, 参考文献に日本語訳されたものがある場合には, それについても記載されており, 親切である.

悪い点

上で, 演習や課題があることを良い点として挙げた. しかし, それらに対する解答が, 本書には掲載されていない. 一部の課題については, サポートページ からリンクされたページ内で解を見ることができる. しかし本稿執筆時において, 未だ全ての課題についての解答が用意されておらず, 残念だ.

また細かい点ではあるが, 本文中でタイプライタ体で印刷されている 「__」(2 つ続いたアンダースコア) が 1 つに繋がっていて, 見づらかった.

最後に

本書のレベルは低くない. しかし本書では, リンク処理やロード処理が, 広範囲に渡って詳しく説明されている. この分野に興味を持ち, 理解したいという意欲のある人には, 貴重な 1 冊になるだろう.


Reviewed by 小森 博司 (komori@ca2.so-net.ne.jp) さん

「リンカとローダに関する "教科書" として手元に置いておいても損は無い」

Linux の使用歴
3 年程度
UNIX の使用歴
8 年程度
Linux Box の主な用途
サーバ用途
Linux 以外に利用している OS
Windows XP, 2000, NT
Linux と Linux 以外の OS の使用頻度の比
Win32 : Linux = 7 : 3 くらい (仕事が Win32 なので)

内容

自分でプログラムを書いてはいても, コンパイルが通ってしまえばリンクやロードはシステムにお任せ, という人が殆どであろう.

本書では, "お任せ先" のリンカやローダに関して解説している. リンカもローダもユーザアプリケーションと OS との境界線上に位置するプログラムなので, 取り扱っているトピックは非常に多い (詳細は目次を参照).

そのため, どうしても前後の内容が関連しあってしまい, 1 回目の通読では全体像が分からないかもしれない (私は分からなかった). ということで, 内容を理解するには "2 パス" で読むことをお勧めする.

その点を別にすれば, UNIX, Win32, SPARC, x86 と云うメジャーなプラットフォーム以外も記載して比較しているなど, 理解を助ける工夫が随所に見られて好感が持てる. また, 翻訳も (直訳調だが), それほど悪くない.

全体的な印象

良くも悪くも "教科書のような本" と言える.

"コンピュータアーキテクチャ" の類の授業を受けたことがあれば話が早いだろうが, 必要なことは網羅してあるが具体的な部分に欠け, "何だか分かったような分からないような……" という感想を持ってしまう本だ. 読んだことも忘れてしまい, あるときふと思い出して読み直してみると, 実はそれまで疑問に思っていたことが全て書かれていた……というような, アレである.

例えば, OS の授業を Andrew S. Tanenbaum 氏の本で受けて, そのときには "ふーん" という印象しか持たなかったのに, カーネルのソースを読むようになってからは何度も何度も読み返した……と書けば伝わるかもしれない.

もちろん "教科書" なので, 具体的なコマンドやツールの使い方は書かれていない. あくまでもコンセプトの理解が第一目的である.

想定読者 (前提知識)

本書はとても薄い (約 240 ページ程度). これは, 主に読者が基本的な知識をすでに持っていることを前提にして, 基礎的な項目をばっさりとカットしている (あるいは簡単にしか触れていない) ためである.

読者は

  1. プロセスのユーザメモリ空間のレイアウト
  2. アセンブラによる基本的な関数呼び出しの仕組み (あるいは何らかの Application Binary Interface に対する知識)
  3. スタックフレームの使用方法
  4. OS によるメモリ管理 (プロセス管理も少々)
  5. できればデバッガによるデバッグ経験 (実行中のプロセスのメモリを直接見られるので理解が進むはず)

の知識を要求される. これらに関する基本的な知識を持っていないと, 本書を読み進めるのはかなり大変であろう (正直, 私はかなり苦労した).

基礎的な項目をカットした本書の構成には賛否が分かれるところだ. "XXXX 入門" の類と本書の間にはかなりレベルの違いがあり, なかなかその間を埋める良書が見当たらない現状を考えると, 残念な点ではある.

評価

正直, この本に対する評価は難しい.

によって, 読者にとっての価値が全く異なってしまうからである. 個人的には一読をお勧めしたいが, 万人向けとはとても言えない.

ただ, リンカやローダに関して書かれた本はほとんど見たことが無く, その意味で本書は貴重であることは確かである. "教養のため" 一読して手元に置いておくことは, 全てのプログラマにとって悪くない選択であると言える. "教養" を知っているか知らないかでコードの効率が全く変わってしまうこともあるのだ.

おわりに

その昔, "LD_PRELOAD 環境変数を設定し自作の共有オブジェクトで問題のある関数 (この場合は setlocale()) を置き換えてしまう" という方法を知り, とても不思議に思っていた.

cf. "How to Japanize Netscape 3.0 Gold for X11" (http://www.bpel.tutics.tut.ac.jp/~take/Netscape/) 中の "Linux (x86) での日本語表示の設定" (http://www.bpel.tutics.tut.ac.jp/~take/Netscape/Linux.html)

本書はこの疑問に (ある程度) 答えてくれた. それだけでも本書を読んだ価値があったと私は考えている.


Reviewed by 朝木卓見 (asataku@osk3.3web.ne.jp) さん

「Linker と Loader の機能の概要を理解する専門的な入門書」

Linux の使用歴
7 年くらい
UNIX の使用歴
11 年くらい
Linux Box の主な用途
メール, Web browsing, プログラミングなど
Linux 以外に利用している OS
MS-Windows NT, Solaris
Linux と Linux 以外の OS の使用頻度の比
自宅ではLinuxのみ. 会社ではほとんど Linux 以外

本書の対象読者

本書では対象読者としては 「技術の向上を目指すプログラマ」 「言語の設計者や開発者」があげられています. C 言語程度のプログラミング言語を知っていること, 複数のオブジェクトファイルのリンクを行えること (Makefile が書けるなら十分), アドレッシングモードや仮想記憶関連の専門用語を知っていること が本書の内容を理解するのには必要ではないでしょうか. また, Linker や Loader は, マシン語が処理の対象となるため, i386 や SPARC などのアーキテクチャについての知識があることが望ましいでしょう. アセンブリ言語を読んで, 大まかな理解ができると, 本書を読み解く大きな助けとなります.

一読して

本書では IBM 370, SPARC, Intel x86 のそれぞれのアーキテクチャと, a.out, UNIX ELF, IBM 360 オブジェクト形式, Microsoft Portable Executable 形式, Intel/Microsoft OMF ファイルなどの オブジェクト形式について説明してます. UNIX や Linux だけではなく, MS-DOS などの形式もカバーしているため, Linker や Loader に興味があれば利用する OS を問わない部分は好感が持てます.

しかし, 256 ページとそんなに厚くない本書でそれらの形式をカバーするために, それぞれの説明は必要最小限しかなされていません. Linux/ELF などの特定の形式に特化した, 詳細な説明はありません. すべての形式はほぼ平等に扱われています. そのため, 記述の具体性が若干欠けるのではないかと思います. 図も十分に使われてはいますが, この辺りの説明に図があれば, とか, この辺りの説明がもっと詳しければ, などと思うこともしばしばありました. 説明内容をしっかりと理解するためには, 何度か読み返して, 良く考えることが必要でした. とはいえ, それぞれの概略を理解するのであれば, 記述が足りない, 他の資料を見る必要があるなどということはなく, 各章の説明も十分になされています.

各章末の演習問題では perl で簡単な Linker を作る演習が出題されています. その他の演習問題も, 本文の内容を良く読み, 良く理解しておくことが必要であり, 難易度としては高めではあるものの, 理解を深める良い助けとなっています.

問題点

非常に密度の高い本ではありますが, それだけに残念なのは専門用語の解説の不足です. たとえば, ライブラリの形式でも本書では 「静的ライブラリ」「静的共有ライブラリ」「動的共有ライブラリ」の 3 種を取り上げていますが, それぞれがどのようなものであるかについての説明は少なく, 比較も行っていません. 特に「静的共有ライブラリ」などは, Linux/a.out での共有ライブラリの作成の難しさを知っているような人であれば どのようなライブラリをさしているのかを想像できるでしょうが, Linux/ELF 以降しか知らないような人には理解が難しいのではないでしょうか. 全般に, 理解のための基礎となる知識の説明には欠けている印象があります.

最後に

本書は Linker や Loader について, 十分な知識がない人がその動作を理解するには最適な書ではないでしょうか. 本書で概略を理解し, 各形式に特化したより詳しい知識を得たい人には参考文献を参照することで, その規格などを得ることもできます. 厚さのわりにはちょっと高いかなと思う値段の本ですが, その内容から考えると十分に妥当な値段でしょう. ある程度の前提知識を必要とはするものの, 「 Linker や Loader についての専門的な知識の入門書」としては満足のいく出来です.


Reviewed by 河野 充 (mikohno@kc4.so-net.ne.jp) さん

「敷居は高いが, 貴重な情報源」

Linux の使用歴
のべ 3 年
UNIX の使用歴
のべ 3 年
Linux Box の主な用途
今は単なる server
Linux 以外に利用している OS
MS Windows 2000
Linux と Linux 以外の OS の使用頻度の比
2 : 3

序論

従来, linker / loader の解説書というと, ほとんど製品 (特定開発環境) 付属のドキュメントか, 情報工学の教科書程度しかなかったと思うが, 本書 (Linkers & Loaders) はおそらく初めての実践バイブル的位置付けの本ではないだろうか.

机上の理論だけにとどまらず, さまざまなターゲットに実装された現実の linker / loader の情報をまとめるということは, かなり難しいことだろう. linker / loader は常にターゲットに依存するので, それらの資料をまとめるには多大な経験と手間が必要だろうからだ.

この本はそうした難題を克服することにある程度成功しているようだ. ターゲットだけでなく, ほとんど主要な技術トピックにも一通り触れており, 著者の造詣の深さには感心するばかりである (私に感心してもらっても仕方ないが). 最初に一般的な技術概要に触れて, それから各ターゲットに展開し, 最後に課題でまとめる, というふうに構成も一貫している. 最終章の方はやや駆け足な感も否めないが, リンク時の最適化や Java のクラスリンクロードについて触れると紙面が足りないということかもしれない.

本論

という前フリから予想されるとおり (?), 一般的な技術書としてはやや敷居が高い. 一応, linker とは, loader とは, といった基本的なところから議論を積み立てて, 共有ライブラリ, 動的リンクまで説明していく流れは正しいと思う. それでもなぜ難しいと感じるのか.

一つは, 想定読者レベルの高さだと思われる. 一応プログラミングの経験がある, 特に linker / loader について何らかの経験 - 単に共有ライブラリを自分のパッケージで利用した程度でもよいのかもしれないが - があることが前提になりそうだ. ちりばめられた技術用語もある程度理解していることを前提としているようだ. linker / loader を実装しようという位の意気込みのある読者であれば, さして苦痛には感じないのだろうが.

また, 複数のターゲットを扱うためか, 個々のトピックに対する解説は丁寧であっても完璧ではない. 個人的には linker / loader ほど図解が必要なテクノロジも少なかろうと思うが, 図は必要最小限にとどめられている. 読者は技術用語を見ながら, 少ない図のイメージを頭の中でふくらませる必要がある.

結論

と否定的なことも書き連ねたが, 序論に書いた点から, 総合的には買いだと判断する. 価格の \3,200 はその価値が充分あると思うし, そもそも『Linkers & Loaders』なんてタイトルに興味を持つ御仁には, 充分超えられる高さの敷居だと思うのだ.

文章だけでは伝わらない, と筆者も考えたのか, 各章の課題の一部は, Perl で簡単な linker / loader の実装をする, という興味深いものになっている. 本書の web site があるが, β版の全文 (当然英文) とあわせて, Perl 実装の解答例もある. この課題をやっている時間がとれず, 難易度の確認をしていないが, 少なくとも解答例をみる限りは, 非常に簡潔なコードで linker / loader の基本機能が実装できることが見て取れた.

ほとんどのプログラマにとっては linker / loader なんて, 大体の使い方さえ知っていれば事足りるわけだが, それでは飽き足らない人, もしくは不幸にして (?) linker / loader の開発者 - 労多くして光あたらず - になった人, そして linker / loader を直接扱うことの多い組込み機器プログラマなどには, 本書は貴重な日本語資料として恩恵があるはずだ.

余談

次は特定ターゲットに絞った linker / loader 解説書が欲しい. また Java のクラスロード技術あたりは面白そうだ.


[ ホーム | マップ | ニュース | 検索 | ドキュメント | リンク | プロジェクト ]
このサイトに関するご意見・ご要望は Webmasters までお願い致します.