2010-11-25 4 views
1

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

ответ

3

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

+0

Могу ли я получить доступ к этикетке _start от основного корпуса? –

1

Отвечая на вопрос «Могу ли я получить доступ к этикетке _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; 
} 
Смежные вопросы