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
1
A
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
.
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;
}
peut accéder à i l'étiquette _start du corps principal? –