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