Во время компоновки вы можете попросить компоновщика сообщить вам, в каком входном файле (объектный файл, член статической библиотеки или совместно используемая библиотека) он находит определение любого символа и в каких файлах он находит этот символ, на который ссылаются, используя опцию компоновщика.-trace-symbol=name
.
Например:
$ cat main.c
extern void foo(void);
int main(void)
{
foo();
return 0;
}
$ cat foo.c
#include <stdio.h>
void foo(void)
{
fputs(__func__,stdout);
}
Скомпилировать источники:
$ gcc -Wall -c main.c foo.c
Создать статическую библиотеку:
$ ar rcs libfoo.a foo.o
Свяжите программу, запрашивая трассировку символов для foo
и fputs
:
$ gcc -o prog main.o -L. -lfoo -Wl,-trace-symbol=foo,-trace-symbol=fputs
/usr/bin/ld: main.o: reference to foo
/usr/bin/ld: ./libfoo.a(foo.o): definition of foo
/usr/bin/ld: ./libfoo.a(foo.o): reference to fputs
/usr/bin/ld: //lib/x86_64-linux-gnu/libc.so.6: definition of fputs
Таким образом, foo
определено в элементе архива foo.o
из ./libfoo.a
и fputs
определяется в /lib/x86_64-linux-gnu/libc.so.6