Добавление собственных символов для файла в GDB - PullRequest
8 голосов
/ 30 марта 2011

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

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

Кто-нибудь знает, как загрузить пользовательские символы в GDB? Я подумал о перекомпиляции GDB и добавлении дополнительной команды в пользовательский интерфейс, чтобы разрешить загрузку символа по адресу. Мне было интересно, можно ли создать фиктивный объектный файл с символами, которые я определил, а затем загрузить это с помощью add-symbol-file? Или было бы возможно скомпилировать программу c с фиктивной функцией и так, как заставить их иметь правильный размер и в правильном месте, а затем просто загрузить это ??

Ответы [ 2 ]

2 голосов
/ 16 сентября 2017

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

Как описано здесь , GDB считывает информацию о символах из двух мест, сначала некоторую минимальную информацию из символов в разделах .symtab и / или .dynsym, а затем более подробную информацию из .debug_info раздел, если он есть.

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

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

objcopy a.out --add-symbol function_name=.text:0x900,function,global a.out2

Обратите внимание, что GDB не любит абсолютные символы для функций, я должен был указать его как смещение в разделе .text, чтобы быть полезным (т. Е. Иметь возможность устанавливать точки останова для функции и отображать ее в обратных следах)

Кроме того, я не смог найти никакого способа изменить поле «размер» символа.

0 голосов
/ 30 марта 2011

Я бы не стал искать решение в GDB. Вместо этого я бы попытался выяснить, как вернуть символы обратно в двоичный файл. По логике, если есть возможность удалить символы, то должна быть возможность добавить их обратно. Я ожидаю, что компоновщик (ld) или какой-либо другой инструмент позволит это сделать.

Рекомендую проверить все инструменты в пакете binutils (objdump, objcopy, nm, ld, ...) - они способны ко многим почти чудесным вещам!

Томас

...