我有一个精灵文件,当我使用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_Ehdr
或Elf64_Ehdr
(取决于字节5是ELFCLASS32
还是ELFCLASS64
),然后使用.e_entry
成员来写这个更好。
你的问题不清楚。 如果你问如何从ELF
文件读取这个值,你应该解析ELF文件(可能使用libelf
或其他现有的帮助软件)。 如果你问如何使用一些关于二进制程序内容的知识来形成它,这个“魔术”就是从输入的偏移量如何编译到结果二进制文件中来计算的。
Linux中的二进制文件(使用标准工具链,即gcc + GNU binutils)是作为主要二进制文件的总和,后者的重定位表,prolog模块( crtbegin.o
, crti.o
), crtend.o
模块( crtend.o
, crtn.o
)。 入口点在序言中,但可以通过链接器放在主二进制内容之后(我在OpenSuSE上的/ bin / sh上看到这个内容),所以它实际上是在生成的二进制文件的末尾。 除非明确规定,否则这是链接器的选择权。