用C(或程序集)编写的程序是否可以使用gcc与c stdlib链接以打印其条目的地址? (因为_start符号表示程序条目,实际上我问是否可以从主函数内部打印该符号的地址而不使用ELF可执行文件的解析。)?
答案 0 :(得分:2)
我问你为什么需要这样做,但你是否尝试过dlsym
用于你的目的?
答案 1 :(得分:1)
extern void _start();
printf("%p\n", (void *)_start);
这不是“可移植的”,因为C语言没有定义_start
函数这样的东西,但假设它以这种方式实现,这应该可行。
答案 2 :(得分: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标题中的地址入口点匹配,如果构建二进制文件以使用地址空间随机化,我不会感到惊讶。
答案 3 :(得分:0)
不是以任何便携方式,不。
对于已知平台使用程序集,您可能可以在调用堆栈上向后退,并将返回地址(应该在_start
例程中,如果您的平台使用此内容)写入可从中访问的变量C方。
当然,您只需要call
之后的指令地址main()
,而不是_start
例行程序的 start