Поле ввода ELF и фактическая запись программы - PullRequest
1 голос
/ 25 ноября 2010

Я использую утилиту readelf для проверки (-h) исполняемого файла, и я вижу, что поле e_entry имеет значение: 0x8048530.Затем я перекомпилирую проверенную программу, чтобы она напечатала запись своей программы, добавив строку: printf ("% p \ n", (void *) main) и выдает: 0x80485e4.Почему у меня есть эта разница?(ОС: Linux 32-bit)

Ответы [ 2 ]

3 голосов
/ 25 ноября 2010

Точка входа исполняемого файла обычно не сама по себе main, а специфичная для платформы функция (которую мы назовем _start), которая выполняет инициализацию перед вызовом main.

1 голос
/ 06 мая 2013

Отвечая на вопрос " Могу ли я получить доступ к ярлыку _start из основного тела? ":

#include <stdio.h>
int main()
{
    void* res;
    #if defined(__i386__)
        asm("movl _start, %%eax" : "=a" (res));
    #elif defined(__x86_64__)
        asm("movq _start, %%rax" : "=a" (res));
    #else
        #error Unsupported architecture
    #endif
    printf("%p\n", res);
    return 0;
}
...