0

我只是想用pyelftools(偏移量、虚拟地址和物理地址)来获取程序头信息。

这可以通过运行从终端完成:

readelf -l <elf_file>

但我无法从 pyelftools 获取相同的信息。从这些例子中,我拼凑了这个:

elffile = ELFFile(stream)
section_header = elffile.structs.Elf_Shdr.parse_stream(stream)
print (section_header)

注:Elf_Shdr是程序头文件。

这将打印偏移量、虚拟地址、物理地址等。但不是我想要的十六进制格式,或者像readelf打印它的方式。有没有办法让它打印出十六进制格式readelf

4

1 回答 1

1

您的帖子中发生了一些奇怪的事情。

你说:

我只是想用 pyelftools 获取程序头信息(偏移量、虚拟地址和物理地址)。

注意:Elf_Shdr 是程序头文件。

但是 Elf_Shdr 不是 Program 头,它是 Section 头。查看elftools/elf/structs.py

Elf_Shdr:
                Section header

然后在您的代码中,由于某种原因,您两次解析文件。第一个字符串足以解析它,您可以从elffile对象访问所有标头数据:

for segment in elffile.iter_segments():
    header = segment.header
    for key, value in header.items():
        if isinstance(value, int):
            print(key, hex(value))

在这里,我遍历 ELF 文件的所有段(它们由程序头描述),然后遍历头中的所有属性,如果它是整数,则将它们打印为十六进制。这里没有魔法,标题只是标准字典的容器。

此外,您可能对readelf使用 pyelftools 实现感兴趣 -这里

于 2020-08-16T15:27:15.030 回答