установить точку останова в удаленном исполняемом файле ELF - PullRequest
2 голосов
/ 15 января 2011

У меня есть ELF 32-битный динамически связанный, раздетый файл, который я хочу отладить. При попытке установить точку останова по адресу появляется сообщение о том, что таблица символов не загружена.

Мои вопросы:

  1. Когда вы говорите, что файл ELF stripped, что именно происходит?
  2. Как вы удалите файл ELF?
  3. Можно ли как-нибудь реконструировать таблицу символов?
  4. Разве невозможно установить точки останова в gdb для удаленного исполняемого файла?

1 Ответ

6 голосов
/ 15 января 2011

Удаление ELF выполняется с помощью панели инструментов gnu binutils со страницы руководства по полосам:

В полосе GNU все символы из объектных файлов objfile удаляются.Список объектных файлов может включать в себя архивы.Необходимо указать хотя бы один объектный файл.

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

Удаление удаляет ненужную информацию из двоичного файла.Это могут быть только данные отладки или не экспортированные символы.

Как вырезать файл ELF?

Вы можете удалить двоичный файл, используя полосу, например strip -s yourLittleBinary - которая заменитфайл с раздетой версией.Опция -s говорит полосе удалить все символы.Стрип может работать разными способами.Опять же, со страницы руководства:

   -R sectionname
   --remove-section=sectionname
       Remove any section named sectionname from the output file. 

Эта опция может быть указана несколько раз.Обратите внимание, что неправильное использование этой опции может привести к невозможности использования выходного файла.

   -s
   --strip-all
       Remove all symbols.

   -g
   -S
   -d
   --strip-debug
       Remove debugging symbols only.

   --strip-unneeded
       Remove all symbols that are not needed for relocation processing.

Можно ли каким-то образом реконструировать таблицу символов?

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

Разве невозможно установить точки останова в gdb для удаленного исполняемого файла?

Это возможно.Это просто исполняемый файл - без названий символов.Однако, поскольку нет символов, единственное, что (кроме наличия файла карты, который предоставляет вам сопоставление адресов <->) остается, это установка точек останова по определенным адресам.Однако вы можете установить точки останова для любой функции общих библиотек, которую использует рассматриваемый исполняемый файл.

В файлах карты

Вы можете создать файл карты из исполняемого файла с помощью утилиты nm:

nm -Cn myLittleExecutable > myLittleExecutable.map

Это приведет к сбросу всех символов, C ++ - с разделением (опция -C) и числовой сортировкой (параметр -n).

Ссылки

Это может дать вам некоторыеИдеи: http://www.linuxsa.org.au/meetings/reveng-0.2.pdf
Документы GNU binutils: http://sourceware.org/binutils/docs-2.21/binutils/index.html
Документация GDB: http://www.gnu.org/software/gdb/documentation/

...