エントリ・ポイント・アドレスと__executable_startの違いは何ですか

イヴ:

リンカは、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が

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=7402&siteId=1