_start
私はELF実行可能ファイルが実行を開始するために可視サブルーチンを持つ必要があることを知っています。しかし、私が知っている限り、カーネルは実際にld-linux.so
(または他のインタプリタ)を呼び出して実行を渡します。だから私の質問は次のとおりです。
_start
エントリポイントは誰が指示しますか?- カーネルはどのように「呼び出し」されますか
ld-linux.so
?安定したAPIがありますか?_start
いわば機能?
ボーナス質問:一見すると、Glibclibdl
とld-linux.so
Glibcはどちらも同じコードベースの一部であり、(プライベートインターフェイスを使用して)密接に絡み合っています。これは、等をlibdl
実装するためにカスタムの同等のライブラリを作成することが不可能であることを意味しますかdlopen
? C以外のシステム言語では依存関係がなく、ファイルをlibc
ロードできる*.so
バイナリを生成することは不可能ですか?
ベストアンサー1
エントリポイントは通常、_start
実行可能ファイルに接続されたCランタイムアセンブリルーチンで名前が付けられ定義されます。この短いコードスニペットはスタックを設定し、C ++コンストラクタを呼び出し、最後にmain
。e_entry
この値は_start
リンカが指すように設定されます。
スキャン実行可能ファイルを使用してこれを確認できますreadelf -a progfile
。
動的リンカーが最初にロードされ開始され、プログラムに必要な共有ライブラリをロードしてリンクする役割を担うため、動的リンクは状況をより複雑にします。動的リンカーは実行可能ファイルにも指定されます(「プログラムインタプリタ」と呼ばれます)。
Lwn.netには2つの部分から成る素晴らしい記事があります。プログラムの仕組み(第二部)、このトピックについて詳しく知りたい場合は、その本を読んでください。