2014-11-02 7 views
0

Мне нужно получить начало и конец сегментов, которые я могу получить из исполняемого файла, например, используя команду objdump (текст, данные, bss). Мне нужно получить эту информацию о файле, который я вызываю (программа должна извлекать информацию о себе). Как я могу это сделать. Также я попытался получить начальный и конечный адреса сегмента стека. Я попытался просто получить адрес первой и последней локальных переменных, но это покажет только часть полного стека. Как я могу получить адреса полного стека?Как получить адреса сегментов из исполняемого файла и найти адрес стека

Я был бы признателен за любую помощь. Thx заранее.

+0

Почему вы спрашиваете? Зачем? –

ответ

0

objdump -h executablename должно позволить вам получить детали раздела, такие как текст, данные, bss. Если вы хотите содержимое всех разделов, то вам нужно использовать опцию -s. Если вам нужна вся информация, вам может понадобиться опция -x (у нее будет информация о стеке).

Поиск кадров в стеке зависит от типа архитектуры. Опцией для получения текущей информации о кадре стека может быть загрузка через gdb и выполнение info frame. Адрес в frame at должен быть BP (базовым указателем), который должен быть начальной точкой текущего кадра стека. SP должен содержать конечную точку кадра стека. Адрес locals at должен содержать начальный адрес локальных переменных.

Существует несколько конфигураций, которые могут быть включены для ядер. Включение CONFIG_DEBUG_STACK_USAGE - это возможность отслеживать использование стека ядра. Такие опции, как CONFIG_DEBUG_STACKOVERFLOW, могут включать отслеживание стека.

0

Если вы спрашиваете с точки зрения запускаемой программы, я бы прочитал файл /proc/self/maps (или /proc/self/smaps). См. proc(5). Чтение этих псевдофайлов происходит быстро (без участия диска IO), но вам нужно их последовательно читать (например, с помощью pipe(7)-s) и закрыть их «быстро» (другими словами, не перечитывать их без повторения open(2) их).

Если вы хотите статическую информацию, содержащуюся в некоторых ELF исполняемый файл (см elf(5)) используйте команду readelf(1) & objdump(1) или некоторые чтения ELF библиотеки как libelf

Обратите внимание, что понятие сегмента стека становится нечетким с последними ядрами, libcs , и многопоточные приложения. См. Также GCC split stacks способность.

Кроме того, большинство Linux-систем включают ASLR, поэтому адреса стека будут отличаться от одного процесса к другому, использующего одну и ту же программу.

1

Мне нужно получить начало и конец сегментов, которые я могу получить из исполняемого файла, например, используя команду размера (текст, данные, bss).

.text, .data и .bss являются участками, а не сегментов. Разделы могут отсутствовать в файле вообще, но сегменты должны быть (во время выполнения требуются только сегменты).

Как это сделать.

Исследование /usr/include/elf.h, и многие resources доступны в Интернете. Каждый файл ELF начинается с Elf{32,64}_Ehdr, который содержит .e_phoff и .e_phnum. Используя эти элементы, вы можете найти и декодировать таблицу сегментов. Вы можете использовать .e_shoff и .e_shnum, чтобы аналогично найти таблицу разделов (если она есть).

Кроме того, я попытался получить начальный и конечный адреса сегмента стека

Вы не можете: начало стека не содержится в двоичном, но динамически определяется ядром в процессе запуска время , Кроме того, конец стека является динамическим свойством выполняемой программы и зависит от того, что делает программа, а также настроек ulimit.