イヴ:
リンカは、Linux上でどのように動作するか私が学んでいます。私は、次のような、リンカは実行可能ファイルのいくつかのシンボルを生成することを聞いてい__executable_start
たが、プログラムが開始アドレスです。
また、私は、ELFファイル内の「エントリ・ポイント・アドレスが」あったことが知られてきました。
だから私はその差があるかわかりません。
私は、以下の簡単なコードを書きました:
#include <stdio.h>
extern char __executable_start[];
int main()
{
printf("Executable Start %X\n", __executable_start);
return 0;
}
私はGCCでコンパイルし、という名前の実行可能ファイルを取得しますa.out
。
私はそれを実行すると、それは私を与えますExecutable Start 4CEDA000
。
それから私は、コマンド実行readelf -h a.out
エントリポイントがあるについて、出力をEntry point address: 0x540
まあ、明らかに、0x540
とは4CEDA000
全く異なっています。
CTX:
シンボルは、__executable_start
エントリポイントではなく、最初の.text
セクション。シンボルは、_start_
実際のエントリポイントです。
あなたのケースでは、シンボルは_start
に位置して4CEDA540
、実行時に。これは、バイナリでは、セキュリティ上の理由(PIE)のためのいくつかのランダムな場所にロードすることができるので、あるので、エントリーポイントのみ(ランダムASLRにより実行時位置)のオフセットに対して格納され.text
たバイナリの断面。唯一の理由は、ある540
によって示されるreadelfが。