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?
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.