节目录入自我识别

时间:2010-11-25 14:38:01

标签: c linux assembly

用C(或程序集)编写的程序是否可以使用gcc与c stdlib链接以打印其条目的地址? (因为_start符号表示程序条目,实际上我问是否可以从主函数内部打印该符号的地址而不使用ELF可执行文件的解析。)?

4 个答案:

答案 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