3

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

我怎样才能做到这一点?

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

4

2 回答 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);

PS 24 仅是正确的偏移量Elf32;最好通过从偏移量 0 读取整个Elf32_Ehdror Elf64_Ehdr(取决于字节 5 是ELFCLASS32or ELFCLASS64)然后使用.e_entrymember.

于 2014-06-08T16:43:02.507 回答
0

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

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

于 2014-06-07T16:16:29.647 回答