pythonarmelfobjdump

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


I need to identify all ELF sections that have the LOAD flag in my python script; using objdump, I receive

$ 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)

However, with the Python3 elftools module, from the following sources:

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))

I receive completely different 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)

From the objdump sources (I wasn't able to locate any documentation on the issue), the LOAD flag should have the value 0x02 (0b00000010). It seems like the flags that are reported by pyelftools are entirely independent of those that are reported by objdump (presumably the correct ones). What am I doing wrong?


Solution

  • Actually they both agree. As Notlikethat already pointed out, the ELF spec points 0x1 (0b00000001) to be SHF_WRITE, so all the sections but .text are marked writable.

    Since objdump is not ELF specific (like readelf would be), the flags don't match 1:1, and instead it reports READONLY when 0x01 is missing.