書籍『リンカ・ローダ実践開発テクニック』発売記念インタビュー
書籍『リンカ・ローダ実践開発テクニック』が発売されました.C言語で書いたプログラムは,いきなり実行形式が得られるわけではなく,コンパイルの後リンクとロードという過程を経て実行されます.この作業を行うリンカとローダは組み込み機器を作るときだけでなく,OSの開発やアプリケーション・プログラムの深い部分を知るためには必須の知識です.自分が書いたプログラムが最終的にどのようなしくみを経てバイナリになるのか,本書を読めば理解できるでしょう.
今回は本書を執筆した坂井弘亮氏に,本書の注目すべきポイントなどを伺いました.
● 組み込み以外な方面からも支持されている本書
――まずは出版おめでとうございます.
坂井氏:ありがとうございます.お陰さまで本書は好評で,イベントやWeb通販サイトのレビューでも好評です.
――意外な方面からの評価されているという話を聞きましたが?
坂井氏:本書はInterface誌の連載をまとめて大幅に加筆したという経緯もあり,Interface誌の主要読者である組み込み技術者向けに執筆しました.組み込み技術者の方にも好評なのですが,本書はセキュリティ関係の人も注目しているということです.
――セキュリティというと,ネットワークやシステムの脆弱性を研究している方ですか?
坂井氏:はい,そうです.
――たしかに,Webサーバをクラックしようと,スタックに任意のプログラム・コードを置くためには実行形式バイナリの知識が必要になりますね.
坂井氏:最近の流行に実行形式バイナリを直接操作するような「バイナリ・ハック」というものがありますが,そういった方面の方も読んでいるそうです.
――リンカとローダはコンピュータの根本を支える部分なので,幅広い読者の方に読んでいただけたようですね.
● 欲しい本は自分で書く!
――ところで,今回リンカの本を書くことにしたきっかけはなんでしょう?
坂井氏:BSD(UNIX)のカーネルをいじっていたのですが,その過程でメモリ・マッピングが気になったというのが最初です.C言語で書かれたプログラムが,当時はメモリ上では実際にどういう配置になるのかが分かりませんでした.探しかたが悪かったのかもしれませんが,当時は文献がほとんどなく,GNU info程度しかありませんでした.後に『Linker&Loaders』(John R. Levine著,オーム社)という良い本が出版されたのですが,仕様の話がメインなので,サンプル・プログラムを動かしつつ学ぶスタイルというのが本書『リンカ・ローダ実践開発テクニック』の特徴です.さまざまな文献に分散しているリンカの知識を一冊にまとめたかったというのもあります.
――たしかに,Interface誌でもリンカの話はたびたび出てきますが,付属基板用のサンプル・プログラムを作る記事の最後に出てくるという感じで,リンカだけをメインに取り上げることは少ないですね.
坂井氏:OSの記事などでも最後の方に少しだけ出てくるということはあります.さらにインターネットで検索しようとしても,リンカ・スクリプトは拡張子すら決まったものがなく,情報を探すのが大変です..ldscriptだったり,.ldsだったり,.scrだったり,そもそも拡張子が付いていなかったり….また,プログラマによってリンカ・スクリプトの書き方が独自なので,参考にするのも大変だったりします.リンカの本が自分でも欲しかったというのが執筆の最大の動機です.
――なければ作るの精神ですか.本という形式で情報をまとめることの大切さですね.
● リンカ・スクリプトでメモリ・マップを集中管理しよう
――ここで話題を変えまして,リンカを知ることによるメリットはなんでしょう?
坂井氏:もちろん組み込み機器を作るための必須知識ということもあります.自分の意図したメモリ・アドレスに自分の書いたプログラムを配置するという「当たり前」のことができます.もう少し進んだ使い方としては,メモリ・マップをリンカ・スクリプトで集中管理できるということです.
――具体的にはどういうことでしょう?
坂井氏:よくある手法としては,C言語の#defineや,makefileの中にアドレスを書き込んでメモリ配置を決めるということがあります.そうなると,プログラムのいろいろな場所に定数が分散してしまうため,管理が大変になります.バラバラに書かずにリンカ・スクリプトに書けば集中管理できるようになります.
――それは便利ですね.
(ここで編集長(M)乱入)
(M):本書を読んでこれは!と思ったのが,バイナリ・ファイルを直接実行形式ファイルに埋め込めることですね(「7.4 リンカの利用の実例――バイナリ・データを挿入する」参照).バイナリ・データを実行形式ファイルに埋め込むために,わざわざC言語の配列形式に0x00, 0xff…なんてソースに変換する必要がなくなりました.
――あるある.ほかにも,インターポジショニングを使った関数ラッパの話が面白かったですね.同名の既存の関数を置き換えるという結構危険な手法ですが.オブジェクトしかない既存の関数に動作を追加したいとか,そういう極限状況では役に立ちますね.極限と言いつつ結構そういう状況に追い込まれることが多いのですが….
坂井氏:インターポジショニングはきちんと理解しないと危険な機能ですが,できることは大きいですね.
――本書を読めば,リンカを積極的に使いこなすことができるわけですね.本日はどうもありがとうございました.
『リンカ・ローダ実践開発テクニック |
構成:編(み)