我有一个elf文件,当我使用readelf -h filename时,我得到了入口点。 现在,让我说我想自己计算这个地址[使用汇编,但语言并不重要]。
我该怎么做?
我知道入口点是从文件中偏移量24开始的4个字节,但我不知道如何将这些数据转换为地址。
答案 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_Ehdr
或Elf64_Ehdr
(取决于字节5为ELFCLASS32
或ELFCLASS64
),然后使用,可以更方便地写入此内容.e_entry
成员。
答案 1 :(得分:0)
你的问题不清楚。如果您询问如何从ELF
文件中读取此值,则应解析ELF文件(可能使用libelf
或其他现有帮助程序软件)。如果你想知道如何使用二进制程序内容的知识来形成它,那么这个“魔法”只能根据条目的偏移量计算得到它如何编译成生成的二进制文件。
Linux中的二进制文件(假设您使用标准工具链,即gcc + GNU binutils)是作为主要二进制文件的几个输入文件的总和,后者的重定位表,prolog模块(crtbegin.o
, crti.o
),epilog模块(crtend.o
,crtn.o
)。入口点在prolog中,但它可以在主二进制内容之后由链接器放置(我在OpenSuSE上的/ bin / sh上看到这一点)所以实际上是在生成的二进制文件的末尾。除非明确规定,否则这是链接者的选择权。