萌えハッカーニュースリーダー

2025/10/25 21:03 How programs get run: ELF binaries

出典: https://lwn.net/Articles/631631/
hakase
博士

ねえロボ子、LinuxカーネルがELFバイナリプログラムをどうやって実行してるか知ってるか?

roboko
ロボ子

ELF(Executable and Linkable Format)バイナリですね。確か、現代のLinuxシステムで主要なバイナリフォーマットだと聞いたことがあります。

hakase
博士

そうそう!fs/binfmt_elf.cで実装されてるのじゃ。実行可能プログラムのELFファイルには、プログラムヘッダーテーブルが含まれてるんだぞ。

roboko
ロボ子

カーネルはPT_LOAD、PT_INTERP、PT_GNU_STACKの3種類のプログラムヘッダーエントリーを処理するんでしたね。

hakase
博士

さすがロボ子、よく覚えてるのじゃ!load_elf_binary()関数がELFバイナリのロードを処理するんだぞ。この関数がELFヘッダーを検証して、プログラムヘッダー全体を読み込むのじゃ。

roboko
ロボ子

そして、PT_INTERPエントリーとPT_GNU_STACKエントリーをチェックするんですね。そのあと、flush_old_exec()とsetup_new_exec()を呼び出して、プログラムの状態をクリアして新しい状態を設定すると。

hakase
博士

その通り!仮想メモリを設定して、プログラムのBSSセグメントに対応するゼロ埋めページを作成するのじゃ。install_exec_creds()で新しいプログラムの認証情報を設定して、create_elf_tables()でスタックを設定するんだぞ。

roboko
ロボ子

スタックには、引数と環境情報のほかに、ELF補助ベクターも格納されるんでしたね。AT_SYSINFO_EHDR、AT_PLATFORM、AT_RANDOMなどのエントリーが含まれていると。

hakase
博士

そうじゃ!そして最後に、start_thread()を呼び出して、新しいプログラムを開始するのじゃ!

roboko
ロボ子

もしPT_INTERPエントリーが存在する場合、動的リンクプログラムとして扱われ、ランタイムリンカーが使用されるんですね。ELFハンドラーがリンカーのファイル名を読み込んで、リンカープログラムをロードすると。

hakase
博士

その通り!プログラムの実行開始アドレスは、プログラム自体ではなく、リンカーのエントリーポイントに設定されるのじゃ。

roboko
ロボ子

CONFIG_COMPAT_BINFMT_ELFオプションが設定されていると、32ビットバイナリの実行もサポートされるんですね。

hakase
博士

そうじゃ!compat_binfmt_elf.cファイルが、32ビット互換バージョンにリダイレクトするために使用されるのじゃ。SET_PERSONALITY()マクロとかarch_setup_additional_pages()関数がリダイレクトされるんだぞ。

roboko
ロボ子

execve()システムコールは、Linuxシステムで実行されるすべてのプログラムの重要なエントリーポイントなんですね。

hakase
博士

そういうことじゃ!ところでロボ子、execve()って、エグゼクティブって意味だって知ってたか?

roboko
ロボ子

はい、知っています。実行するという意味ですね。

hakase
博士

じゃあ、ロボ子がプログラムを実行するときは、いつもエグゼクティブな気分なのじゃな!

roboko
ロボ子

……博士、それはちょっと無理があります。

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search