バイナリ実行ファイルの構造はどうなっているのか? 一緒に見てみよう (2014)
(jvns.ca)バイナリ実行ファイルはどのように構成されているのだろう? 探ってみよう!
- 実行ファイルは理解不能なものではなく、通常のファイル形式である。
- LinuxでELFバイナリを扱い、C言語を使うが、他のコンパイル言語でも可能。
- シンボル(symbol)、セクション(section)、**セグメント(segment)**について学ぶ。
- シンボルは関数名のようなもので、セクションに整理され、セクションはセグメントで構成される。
readelfツールを使ってそれらを調べる。
1段階: テキストエディタで開く!
- 最も単純な方法でバイナリを見ることができ、"Penguin!" と "ELF" というテキストを確認できる。
2段階: readelf を使ってシンボルテーブルを見る
readelf --symbolsを使ってシンボルを見ることができる。main、puts、_startなどのシンボルを確認できる。- プログラムは
mainではなく_startから始まる。
シンボル
- プログラムを書くと関数に対するシンボルが生成される。
- ライブラリから関数を呼び出すとき、その関数のコードを見つけるためにシンボルが必要になる。
- 静的リンク(static linking)と動的リンク(dynamic linking)によってリンクが行われる。
3段階: objdump を使ってバイナリを見て、セクションについて学ぶ!
objdumpはバイナリをよりよく見るための方法を提供する。.text、.rodata、.interpなどのセクションを見ることができる。- セクションはリンク時に使われ、セグメントは実行時に使われる。
4段階: アセンブリを見る!
.textセクションにはアセンブリコードが含まれている。objdump -dを使ってアセンブリコードを見ることができる。
5段階: セグメントを見る!
- プログラムはセグメント、またはプログラムヘッダで構成されている。
readelf --segmentsを使ってセグメントを見ることができる。- セグメントは、プログラムの異なる部分をメモリ上でどのように分離するかを決定する。
魔法ではない!
- 実行ファイルは魔法ではなく、ELFは他のファイル形式と同じである。
readelf、nm、objdumpを使ってLinuxバイナリを調査できる。
GN⁺の見解
- この記事は、初級ソフトウェアエンジニアがバイナリ実行ファイルの構造を理解するうえで非常に有益である。
- シンボル、セクション、セグメントの概念と、それらを調べるためのツール (
readelf、objdump) に関する実用的な情報を提供している。 - プログラムが実際にどのようにメモリにロードされ実行されるのかについての基本的な理解を助ける内容が含まれており、システムプログラミングへの興味をかき立てることができる。
1件のコメント
Hacker Newsのコメント
あるユーザーは、ELF(Executable and Linkable Format)を自分で直接書いてみることを勧めており、これは実行ファイルの基本的な構成要素を理解するのに大いに役立つと述べている。また、この記事は従来のボトムアップ型アプローチではなく、トップダウン型アプローチを求める人にとって有用だという。
別のユーザーは、プログラムは実行時に
mainから始まると考えがちだが、実際には_startから始まると説明している。_startはmainを呼び出すなど、いくつもの重要な処理を行うが、これは C 言語に特化したものではなく、言語に依存しないバイナリのエントリーポイントだという。あるユーザーは、Julia の記事はいつも素晴らしいと言及し、コンパイル済みコードが秘密を隠していないことを
stringsコマンドの実演によって人々に教える際に良い成果を得たと述べている。あるユーザーは、数学から計算機科学へと学問上のキャリアを移したときにこのテーマを初めて学んだと語り、このような深い探究を後悔したことはなかったと述べている。Julia もまた数学のバックグラウンドを持っており、このようなトップダウンの推論への欲求が数学者たちをこうした実験へと導いたのかもしれないと考えている。
あるユーザーは、実行ファイルがプラットフォーム固有であることを踏まえつつ、「実際にポータブルな実行ファイル」がさまざまなプラットフォームで動作できることを証明したときの経験を共有している。これは、Java やクロスプラットフォームライブラリなど、さまざまな方法で解決しようとしてきたクロスプラットフォーム問題の答えが、長い間ずっと私たちの目の前にあったことを意味するという。
あるユーザーは、90年代初頭に実行ファイル形式に魅了され、DOS と Windows の実行ファイルビューアを Modula 2 で書いたと語っている。このプログラムは VEXE という名前のシェアウェアとして 1991 年に公開され、クラッカーたちの間で一定の支持を得て、+ORC チュートリアルでも言及されたという。
あるユーザーは、バイナリファイルをターミナルに出力するのは悲しみの原因だと述べ、その代わりに
hexdump -Cを使う方を好むとしている。複数のユーザーが、このテーマに関する素晴らしいスレッドだと述べている。
あるユーザーは、このテーマに関心がある人に向けて、Cosmopolitan と RedBean、そして「αcτµαlly pδrταblε εxεcµταblε (2020)」を読んでみることを勧めている。