首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >readelf如何翻译入口点

readelf如何翻译入口点
EN

Stack Overflow用户
提问于 2014-06-07 15:01:43
回答 2查看 2.4K关注 0票数 3

我有一个elf文件,当我使用readelf -h文件名时,我得到了入口点。现在,假设我想用汇编语言自己计算这个地址,但是语言并不重要。

我该怎么做呢?

我知道入口点是从文件中的偏移量24开始的4个字节,但是我不知道如何将这个数据转换成地址。

EN

回答 2

Stack Overflow用户

发布于 2014-06-09 00:43:03

我知道入口点是从文件中的偏移量24开始的4个字节,但是我不知道如何将这个数据转换成地址。

当您在与构建可执行文件的目标(x86)相同的目标上运行时,不需要进行转换。

在伪代码中,省略了错误检查:

代码语言:javascript
复制
int fd = open(path, O_RDONLY);
lseek(fd, 24, SEEK_SET);
unsigned long entry_point;
read(fd, &entry_point, sizeof(entry_point));

printf("entry: 0x%lx\n", entry_point);

附注: 24只是Elf32的正确偏移量;通过从偏移量0读取整个Elf32_EhdrElf64_Ehdr (取决于字节5是ELFCLASS32还是ELFCLASS64),然后使用.e_entry成员,将此写入便携要好得多。

票数 2
EN

Stack Overflow用户

发布于 2014-06-08 00:16:30

你的问题不清楚。如果您询问如何从ELF文件中读取此值,您应该解析ELF文件(很可能使用libelf或其他现有的辅助软件)。如果你问如何利用二进制程序内容的一些魔术来形成它,这个“魔术”仅仅是根据条目的偏移量来计算的,它是如何编译成结果二进制的。

Linux中的二进制文件(假设你使用标准的工具链,即,gcc + GNU binutils)是由几个输入文件的总和组成的,作为主二进制文件,后者的重定位表,prolog模块(crtbegin.ocrti.o),epilog模块(crtend.ocrtn.o)。入口点在前言中,但是链接器可以将它放在主要二进制内容之后(我在OpenSuSE上的/bin/sh中看到了这一点),所以它实际上位于结果二进制文件的末尾。除非明确规定,否则这是链接器的选择权。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24094671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档