如何readelf翻译入口点

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

我怎样才能做到这一点?

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

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

当您在与构建可执行文件的目标( x86 )相同的目标( 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_EhdrElf64_Ehdr (取决于字节5是ELFCLASS32还是ELFCLASS64 ),然后使用.e_entry成员来写这个更好。

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

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