_startエントリポイント(カーネル、ld-linux.soなど)には何が必要ですか?

_startエントリポイント(カーネル、ld-linux.soなど)には何が必要ですか?

_start私はELF実行可能ファイルが実行を開始するために可視サブルーチンを持つ必要があることを知っています。しかし、私が知っている限り、カーネルは実際にld-linux.so(または他のインタプリタ)を呼び出して実行を渡します。だから私の質問は次のとおりです。

  1. _startエントリポイントは誰が指示しますか?
  2. カーネルはどのように「呼び出し」されますかld-linux.so?安定したAPIがありますか?_startいわば機能?

ボーナス質問:一見すると、Glibclibdlld-linux.soGlibcはどちらも同じコードベースの一部であり、(プライベートインターフェイスを使用して)密接に絡み合っています。これは、等をlibdl実装するためにカスタムの同等のライブラリを作成することが不可能であることを意味しますかdlopen? C以外のシステム言語では依存関係がなく、ファイルをlibcロードできる*.soバイナリを生成することは不可能ですか?

ベストアンサー1

エントリポイントは通常、_start実行可能ファイルに接続されたCランタイムアセンブリルーチンで名前が付けられ定義されます。この短いコードスニペットはスタックを設定し、C ++コンストラクタを呼び出し、最後にmaine_entryこの値は_startリンカが指すように設定されます。

スキャン実行可能ファイルを使用してこれを確認できますreadelf -a progfile

動的リンカーが最初にロードされ開始され、プログラムに必要な共有ライブラリをロードしてリンクする役割を担うため、動的リンクは状況をより複雑にします。動的リンカーは実行可能ファイルにも指定されます(「プログラムインタプリタ」と呼ばれます)。

Lwn.netには2つの部分から成る素晴らしい記事があります。プログラムの仕組み第二部)、このトピックについて詳しく知りたい場合は、その本を読んでください。

おすすめ記事