この質問は続く コンパイラがメモリにコードを配置する方法 この内容はStack Overflowに掲載されました。
ld
Linuxで利用可能な(GNU)ユーティリティについていくつかの質問があります。
たとえば、プログラムがシェルで実行されるたびに、シェルはとしてマークされた./a.out
プログラムld
をロードしますa.out
。
ld
シェルはを使用してロードする必要があることをどうやって知ることができますか? ELF形式であることを確認するためにa.out
スキャンし、その場合は使用しますか?特定の形式の実行可能ファイル名を指定する規則がないため、間違いなくファイル拡張子を使用することはできません。a.out
ld
ユーティリティは
ld
ELFに加えて他の実行可能形式で表現されたプログラムをロードできますか?私が「xyz」と言う独自の実行可能ファイル形式を考え、次にそのような実行可能
abc
ファイルを処理するために独自のローダーを作成するとします。それでは、「ローダーを使用してabc
特定の実行可能形式「xyz」でコンパイルされたプログラムをロードするように構成できるシェルコマンドはありますか?」
答え1
シェルはわかりませんが、カーネルは知っています。バラよりLinuxにはどのような実行ファイルがありますか?詳しくはリンクされた記事をご覧ください。カーネルローダはバイナリをロードし、必要に応じて対応するインタプリタ(
ld.so
ダイナミックバイナリの場合)をロードします。各実装は
ld.so
フォーマットによって異なります。はい、カーネルにバイナリローダーを追加したり、
binfmt_misc
.seeを使用すると可能です。モノの驚くべき点は何ですか?もっと学ぶ。