2016-11-11 12 views
0

Мне нужно идентифицировать все секции ELF с флагом LOAD в моем скрипте python; используя objdump, я получаюpyelftools: извлекать флаги секций, например objdump, для двоичного файла elf32-littlearm

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

Однако с модулем elftools Python3, из следующих источников:

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 (предположительно, правильные). Что я делаю не так?

+0

_ «Я не смог найти документацию по проблеме» _ - [вот что должен сказать спецификатор ELF] (http://www.sco.com/developers/gabi/2003-12-17 /ch4.sheader.html) (и FWIW бит бит ARM [здесь] (http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044f/index.html), если вы это необходимо) - определение 'sh_flags' похоже на ваши результаты AFAICS. Обратите внимание: objdump обрабатывает несколько форматов объектов, поэтому некоторые из его «флагов» могут быть неявными, например. типы секций в конкретном случае ELF. – Notlikethat

ответ

1

Фактически они оба согласны. Как уже указывал Notlikethat, спецификация ELF указывает 0x1 (0b00000001) на SHF_WRITE, поэтому все разделы, кроме .text, помечены как записываемые.

Поскольку objdump не ELF конкретных (как readelf бы), флаги не соответствуют 1: 1, а вместо этого он сообщает READONLY когда 0x01 отсутствует.