Як я можу перевірити вміст розділу даних файлу ELF у Linux?


77

Я використовував objdumpдля перегляду коду збірки в двійкових файлах Linux ELF.

Іноді відбувається непрямий перехід через таблицю переходів, яка зберігається у розділі rodata(дані лише для читання).

Як отримати objdumpабо будь-який інший інструмент, щоб показати мені вміст цього розділу даних?

Я міг би запустити програму та перевірити відповідні адреси в налагоджувачі, але я не хочу цього робити, оскільки це має бути зроблено інтерактивно.

Ідеальна відповідь визначить інструмент, який не лише покаже мені вміст, але і дозволить мені контролювати формат відображення, як і odце робить.

Відповіді:


96
objdump -s -j .rodata exefile

дає паралельний шістнадцятковий / друкований ASCII дамп вмісту rodataрозділу, як:

Contents of section .rodata:
 0000 67452301 efcdab89 67452301 efcdab89  gE#.....gE#.....
 0010 64636261 68676665 64636261 68676665  dcbahgfedcbahgfe

Не схоже, що там є щось для контролю форматування, але це початок. Ви завжди можете зняти шістнадцятковий файл і подати його на од, я гадаю :)


3
Як ви можете отримати дані, скинуті у двійковому форматі з розділу ELF? Щось на зразок objdump -s -j -binary <section> <file> було б чудово.
Богатир

@Богатир: пор. моя відповідь.
ysdx

30
readelf -x .rodata hello_world.o

дає:

Hex dump of section '.rodata':
  0x00000000 48656c6c 6f20776f 726c6421 0a       Hello world!.

Вам слід віддавати перевагу, readelfколи це можливо, оскільки objdumpпросто не відображаються такі розділи, як .symtab: Чому objdump не відображає розділи .bss, .shstratab, .symtab та .strtab?

Ви також можете витягти необроблені байти за допомогою методів, згаданих у: Як витягувати лише вміст розділу ELF та як згадано ysdx .


12

Ви можете отримати RAW (не hexdump-ed) розділ ELF за допомогою:

# To a file:
objcopy file /dev/null --dump-section .text=text.data
# To stdout:
objcopy file /dev/null --dump-section .text=/dev/stdout | cat

Тут я використовую | catдля того, щоб змусити stdout бути трубою. /dev/stdoutможе працювати несподівано, якщо stdout - це файл. .text=-не надсилає в stdout, а у -файл.

Однак objcopy і objdump мають деякі недоліки (оскільки вони засновані на BFD, який абстрагує різні виконувані формати).

Оновлення: Я написав інструмент для цього, який не покладається на BFD.


--dump-sectionтрохи нещодавно. Він був доданий за адресою: sourceware-org.1504.n7.nabble.com/… Чому це краще ніж --only-section?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

2
@CiroSantilli 六四 事件 法轮功 纳米比亚 威 视, добре, objcopy -jстворює цілий файл ELF (це заголовок ELF, таблиця нагрівача розділів із розділом .shstrtab, таблиця заголовків програми), тоді як objcopy --dump-sectionскидає вміст розділу (і нічого іншого) у файл.
ysdx
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.