бинарный файл отладки: как записать, из какого .a / .o каждого символа пришел? - PullRequest
0 голосов
/ 26 октября 2011

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

Как получить дамп с возможностью разбора, в котором перечислены все имена символов в конечном исполняемом двоичном файле и из каких .a и .o оно пришло? (Плюс оригинальный файл .c / .cpp, если возможно.)

Существует ряд взаимозависимостей, циклических зависимостей и даже несколько нескольких определенных символов в библиотеках, которые я пытаюсь отобразить с конечной целью воссоздать систему сборки. Каким-то образом старой системе сборки удалось связать все вместе. (Думаю, больше случайно, чем по замыслу ...)

Пока что я пробовал различные вызовы nm, но не могу получить эти данные. Возможно, nm - неправильный инструмент.

1 Ответ

1 голос
/ 26 октября 2011

К тому времени, когда окончательный двоичный файл связан, информация о том, из какого символа пришел, .o или .a потеряна.

Поскольку у вас есть отладочная информация, вы можете знать источник каждого символа, и это может помочь вам восстановить потерянную информацию (или нет: если foo.c скомпилировано в foo1.o, foo2.o и foo3.o (например, с разными -DFOO=1 и т. д. флагами), а затем вставлять в разные архивные библиотеки, тогда нет простого способа определить, какой объект внес символ в окончательный двоичный файл. Надеюсь, ваша старая система сборки была не так уж плоха.

Итак,

# list of global symbols and their addresses
nm a.out | egrep ' [TDW] '

# dump source for every symbol
addr2line a.out < /list/of/addresses/from/above

# list all objects in all libraries
ar t *.a

Теперь у вас достаточно информации, чтобы сопоставить большинство символов с объектами, с которых они пришли. Вероятно, будет <= 10% источников, где имя исходного файла не совпадает с именем объектного файла. Это вы должны решить вручную. </p>

...