我使用readelf实用程序检查(-h)可执行文件,我看到e_entry字段的值为:0x8048530。然后我重新编译已检查的程序,并通过添加以下行来打印自己的程序条目:printf(“%p \ n”,(void *)main)和输出:0x80485e4。为什么我有这个区别? (操作系统:Linux 32位)
答案 0 :(得分:3)
可执行文件的入口点通常不是main
本身,而是一个特定于平台的函数(我们称之为_start
),它在调用main
之前执行初始化。
答案 1 :(得分: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;
}