pyelftools:像 objdump 一样检索 elf32-littlearm 二进制文件的部分标志

pyelftools: retrieve section flags like objdump does for an elf32-littlearm binary

我需要在我的 python 脚本中识别所有具有 LOAD 标志的 ELF 部分;使用 objdump,我收到

$ arm-none-eabi-objdump -h test.elf

test.elf:     file format elf32-littlearm

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00014480  00000000  00000000  00008000  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .relocate     00000090  20000000  00014480  00020000  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          000016ec  20000090  00014510  00020090  2**4
                  ALLOC
  3 .stack        00002004  2000177c  00014510  0002177c  2**0
                  ALLOC
  4 TOUCH_SAFETY_DATA_LOCATION 00000704  20004000  00014510  00024000  2**3
                  CONTENTS, ALLOC, LOAD, DATA
  5 FMEA_SAFETY_DATA_LOCATION 00000070  20007c00  00014c14  00027c00  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  ... (some 10 or so more sections)

但是,使用 Python3 elftools 模块,来自以下来源:

from elftools.elf.elffile import ELFFile

for section in ELFFile(open("test.elf", "rb")).iter_sections():
    print("{0:30s} 0b{1:08b}".format(section.name, section.header.sh_flags))

我收到完全不同的标志:

                               0b00000000
.text                          0b00000110
.relocate                      0b00000011
.bss                           0b00000011
.stack                         0b00000011
TOUCH_SAFETY_DATA_LOCATION     0b00000011
FMEA_SAFETY_DATA_LOCATION      0b00000011
... (some 10 or so more sections)

从 objdump 来源(我无法找到关于该问题的任何文档),LOAD 标志的值应为 0x02 (0b00000010)。 pyelftools 报告的标志似乎完全独立于 objdump 报告的标志(可能是正确的)。我做错了什么?

其实他们都同意。正如 Notlikethat 已经指出的那样,ELF 规范将 0x1 (0b00000001) 指向 SHF_WRITE,因此除 .text 之外的所有部分都标记为可写。

由于 objdump 不是 ELF 特定的(就像 readelf 那样),标志不匹配 1:1,而是当 0x01 是时报告 READONLY失踪。