Как я могу изучить содержимое раздела данных файла ELF в Linux?


Я использую objdump чтобы посмотреть на ассемблерный код в двоичных файлах Linux ELF.

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

Как добраться objdump или любой другой инструмент, чтобы показать мне содержимое этого раздела Data?

я могла выполнить программу и изучить соответствующие адреса в отладчике, но я не хочу делать это, потому что это должно быть сделано интерактивно.

идеальный ответ определит инструмент, который не только покажет мне содержимое, но и позволит мне контролировать формат отображения, так же как od делает.

3 58

3 ответа:

objdump -s -j .rodata exefile

дает бок о бок hex / printable ASCII дамп содержимого как:

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

не похоже, что там есть что-то, чтобы контролировать форматирование, но это начало. Вы всегда можете отменить hex и скормить его od, я полагаю:)

readelf -x .rodata hello_world.o

выдает:

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

вы должны предпочесть readelf когда это возможно, так как objdump просто не показывает некоторые разделы, как .symtab:почему objdump не показывает .ОНБ. ,шстратаб, .symtab и .разделы strtab?

вы также можете извлечь необработанные байты с помощью методов, упомянутых в:как вы извлекаете только содержимое раздела ELF и как уже упоминалось по ysdx.

вы можете получить раздел 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, который абстрагирует различные исполняемые форматы).

обновление: я написал a инструмент чтобы сделать это, который не полагается на BFD.