Вы не сказали, в какой ОС вы работаете, и ответ зависит от системы.
В Linux и большинстве систем UNIX вы можете просто попросить компоновщика сообщить вам.Например, предположим, что вы хотели знать, откуда printf
поступает в эту программу:
#include <stdio.h>
int main()
{
return printf("Hello\n");
}
$ gcc -c t.c
$ gcc t.o -Wl,-y,printf
t.o: reference to printf
/lib/libc.so.6: definition of printf
Это говорит о том, что на printf
ссылаются в t.o
и определяют в libc.so.6
.Вышеупомянутое решение будет работать как для статических, так и для общих библиотек.
Поскольку вы пометили этот вопрос как gdb
, вот что вы можете сделать в gdb:
gdb -q ./a.out
Reading symbols from /tmp/a.out...done.
(gdb) b main
Breakpoint 1 at 0x400528
(gdb) run
Breakpoint 1, 0x0000000000400528 in main ()
(gdb) info symbol &printf
printf in section .text of /lib/libc.so.6
Если приходит foo
из общей библиотеки gdb
скажет вам, какая из них.Если он получен из статической библиотеки (в этом случае gdb
скажет in section .text of a.out
), используйте решение -Wl,-y,foo
выше.Вы могли бы также сделать решение "грубой силы" как это:
find / -name '*.a' -print0 | xargs -0 nm -A | grep ' foo$'