如何使用readelf翻译入口点

3

我有一个 ELF 文件,当我使用 readelf -h filename 命令时,可以获取入口点。

现在,假设我想通过自己计算来得到这个地址 [使用汇编语言,但语言并不重要]。

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


没有太多需要翻译的,那只是您通常使用的4字节地址,以小端格式表示。 - Jester
2个回答

2
我知道文件中从偏移量24开始的入口点是4个字节,但我不知道如何将这些数据转换为地址。
如果在与可执行文件相同的目标(x86)上运行,则不需要进行任何翻译。
伪代码中省略了错误检查:
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成员。


0

你的问题不清楚。如果你询问如何从 ELF 文件中读取该值,你应该解析 ELF 文件(可能使用 libelf 或其他现有的辅助软件)。如果你询问如何使用二进制程序内容的某些奇技淫巧来形成它,这个“奇技淫巧”仅仅是根据入口的偏移量计算得出的,具体取决于被编译成最终二进制文件的方式。

在 Linux 中,二进制文件(只要你使用标准工具链,即 gcc + GNU binutils)由多个输入文件的总和组成,主二进制文件、后续模块的重定位表、前面的模块(crtbegin.ocrti.o)、后面的模块(crtend.ocrtn.o)。入口点在前面的模块中,但链接器可能会将其放置在主二进制文件内容之后(我在我的 OpenSuSE 上看到了这一点),因此实际上在结果二进制文件的末尾。除非显式规定,否则这是链接器的权利。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接