我有一个elf文件,当我使用readelf -h文件名时,我得到了入口点。现在,假设我想用汇编语言自己计算这个地址,但是语言并不重要。
我该怎么做呢?
我知道入口点是从文件中的偏移量24开始的4个字节,但是我不知道如何将这个数据转换成地址。
发布于 2014-06-09 00:43:03
我知道入口点是从文件中的偏移量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_Ehdr或Elf64_Ehdr (取决于字节5是ELFCLASS32还是ELFCLASS64),然后使用.e_entry成员,将此写入便携要好得多。
发布于 2014-06-08 00:16:30
你的问题不清楚。如果您询问如何从ELF文件中读取此值,您应该解析ELF文件(很可能使用libelf或其他现有的辅助软件)。如果你问如何利用二进制程序内容的一些魔术来形成它,这个“魔术”仅仅是根据条目的偏移量来计算的,它是如何编译成结果二进制的。
Linux中的二进制文件(假设你使用标准的工具链,即,gcc + GNU binutils)是由几个输入文件的总和组成的,作为主二进制文件,后者的重定位表,prolog模块(crtbegin.o,crti.o),epilog模块(crtend.o,crtn.o)。入口点在前言中,但是链接器可以将它放在主要二进制内容之后(我在OpenSuSE上的/bin/sh中看到了这一点),所以它实际上位于结果二进制文件的末尾。除非明确规定,否则这是链接器的选择权。
https://stackoverflow.com/questions/24094671
复制相似问题