2010-11-25 3 views
1

J'utilise l'utilitaire readelf pour vérifier (-h) un fichier exécutable, et je vois que le champ e_entry a la valeur: 0x8048530. Ensuite, je recompile le programme vérifié et l'ai pour imprimer sa propre entrée de programme en ajoutant la ligne: printf ("% p \ n", (void *) main) et sorties: 0x80485e4. Pourquoi ai-je cette différence? (OS: Linux 32 bits)Champ d'entrée ELF et entrée de programme réelle

Répondre

3

Le point d'entrée d'un exécutable est généralement pas main lui-même, mais une plate-forme fonction spécifique (que nous appellerons _start) qui effectue l'initialisation avant d'appeler main.

+0

peut accéder à i l'étiquette _start du corps principal? –

1

Répondre à la question "peut accéder à i l'étiquette _start du corps principal?":

#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; 
} 
Questions connexes