В чем разница между адресом точки входа и __executable_start - PullRequest
1 голос
/ 20 февраля 2020

Я изучаю, как работает компоновщик на Linux. Мне сказали, что компоновщик сгенерирует некоторые символы для исполняемого файла, такие как __executable_start, который является адресом, с которого запускается программа.

Также я знал, что была точка входа address »в файле ELF.

Так что я не знаю, в чем разница между ними.

Я написал простой код ниже:

#include <stdio.h>

extern char __executable_start[];

int main()
{
    printf("Executable Start %X\n", __executable_start);

    return 0;
}

Я компилирую с помощью G CC и получить исполняемый файл с именем a.out.

Когда я его выполняю, он дает мне Executable Start 4CEDA000.

Затем я выполняю команду readelf -h a.out и вывод о точке входа: Entry point address: 0x540

Ну, очевидно, 0x540 и 4CEDA000 совершенно разные.

1 Ответ

1 голос
/ 20 февраля 2020

Символ __executable_start - это не точка входа, а начало раздела .text. Символ _start_ действительно является точкой входа.

В вашем случае символ _start находится на 4CEDA540 во время выполнения. Это происходит потому, что двоичный файл может быть загружен в произвольном месте по соображениям безопасности (P IE), поэтому точка входа сохраняется только относительно смещения (случайным образом расположенного во время выполнения ASLR) .text раздела в двоичный файл. Вот почему readelf .

показывает только 540.
...