OSのシステムコールの呼び出しとは&バイナリエディタの使い方:main()関数の前には何があるのか(4)(3/3 ページ)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。今回は、printf()内のポインタ経由での関数呼び出しが行き着く先にあるシステムコールの呼び出しとバイナリエディタの使い方について。
連載第2〜4回のまとめ
まずは練習として、printf()の処理をデバッガで追ってみた。入門書ではおなじみのハロー・ワールドであるが、単なるprintf()であってもその先には様々な処理があり、最終的にはシステムコールが呼ばれているということがわかる。
Linuxのような汎用OSでは、printf()の先にデバイスドライバがいきなり接続されているようなことは無く、システムコールによりアプリケーション・プログラムはOSカーネルと分離されている。
そしてその間には、システムコール命令によるソフトウェア割込みの発行がある。これは、資源の操作の権限を分離したいためだ。汎用システムではユーザがアプリケーションを作成し実行する。そのアプリケーションにバグがあったとき、アプリケーションが何でもできてしまっては、システムに重大な悪影響を及ぼす可能性がある。このため資源にアクセスする権限はOSカーネルのみが持ち、アプリケーションは資源の操作をOSカーネルに依頼するようなソフトウェア構成になっている。
なおシステムコールの発行を共通APIにして移植性を高めることにも目的があるという考えもあるが、これはAPIの定義による恩恵であり、システムコールを割り込みベースにすることで実行権限を分離することによる恩恵ではない。
また解析はひとつのツールだけで完結するものではなく、GDBによる動的解析、objdumpによる逆アセンブル結果やreadelfの出力、バイナリエディタによる機械語コード表示などを見比べながら行われる場合が多い。このため本章ではGDB以外のツールについても言及した。GDBでの解析結果に疑問が出たときの調査手段として参考になればと思う。
書籍紹介
ハロー“Hello, World” OSと標準ライブラリのシゴトとしくみ
坂井弘亮著
秀和システム 3,200円
C言語の入門書では、"Hello, World"と出力するプログラムを最初に作るのが定番です。"Hello, World"は、たった7行の単純なプログラムですが、printf()の先では何が行われているのか、main()の前にはいったい何があるのか、考えてみると謎だらけです。本書は、基礎中の基礎である"Hello, World"プログラムを元に、OSと標準ライブラリの仕組みをあらゆる角度からとことん解析します。資料に頼らず、自分の手で調べる方法がわかります。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- プログラミング言語Cについて知ろう
プログラミング言語の基本となる「C」。正しい文法や作法を身に付けよう。Cには確かに学ぶだけの価値がある(編集部) - シェルコード解析に必携の「5つ道具」
コンピュータウイルスの解析などに欠かせないリバースエンジニアリング技術ですが、何だか難しそうだな、という印象を抱いている人も多いのではないでしょうか。この連載では、「シェルコード」を例に、実践形式でその基礎を紹介していきます。(編集部) - 【 od 】コマンド――ファイルを8進数や16進数でダンプする
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、「od」コマンドです。