2010-11-25 14 views
0

用C(或汇编)编写的程序是否可能使用gcc与c stdlib链接来打印其条目的地址? (因为_start符号实际上表示程序入口,所以我询问是否可以在不使用ELF可执行文件解析的情况下从主函数内部打印该符号的地址)。程序入口自我识别

+0

您可以使用内建函数从堆栈帧中获取入口函数中的地址,但不能使用起始地址。 http://gcc.gnu.org/onlinedocs/gcc/Return-Address.html你为什么想要开始地址? – Rup 2010-11-25 14:42:09

+0

`&main`?...... – khachik 2010-11-25 14:43:18

回答

1

不是很便携(即作品在我的机器上,但也许这是因为星星排列)

#include <stdio.h> 

extern void _start(); 

int main(int argc,char *argv[]) 
{ 
    printf("%p\n",_start); 

    return 0; 
} 

在RHEL 5.5 x86_64的盒,打印地址的地址切入点匹配的ELF头,如果二进制文件被构建为使用地址空间随机化,那么如果这种情况爆发,我不会感到惊讶。

2

我问你为什么需要这样做,但你有没有尝试过使用dlsym为你的目的?

+0

我只是想知道它是否可以完成,不知道它是否有实际的方面。 ELF中的dlsym部分是什么? – 2010-11-25 19:13:27

0

没有在任何便携式的方式,没有。

对于已知平台使用程序集,您可能在调用堆栈后退一步,然后将返回地址(如果您的平台使用此类,应该在_start例程内)写入可从C端访问的变量。

当然,那么你只拥有指令的地址继callmain(),而不是_start程序的开始

1
extern void _start(); 
printf("%p\n", (void *)_start); 

这不是在C语言中没有定义这样的东西_start功能意义上的“便携”,但假设它是实现这种方式,这应该工作。