readelf如何翻译入口点

时间:2014-06-07 07:01:43

标签: linux assembly x86 elf readelf

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

我该怎么做?

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

2 个答案:

答案 0 :(得分:1)

  

我知道入口点是从文件中偏移量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);

P.S。 24只是Elf32的正确偏移量;通过从偏移量0读取整个Elf32_EhdrElf64_Ehdr(取决于字节5为ELFCLASS32ELFCLASS64),然后使用,可以更方便地写入此内容.e_entry成员。

答案 1 :(得分:0)

你的问题不清楚。如果您询问如何从ELF文件中读取此值,则应解析ELF文件(可能使用libelf或其他现有帮助程序软件)。如果你想知道如何使用二进制程序内容的知识来形成它,那么这个“魔法”只能根据条目的偏移量计算得到它如何编译成生成的二进制文件。

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