С какой библиотекой связана программа, предоставляющая данную функцию? - PullRequest
4 голосов
/ 03 апреля 2011

У меня есть программа, вызывающая функцию foo, которая определена в библиотеке.Как я могу узнать, где находится библиотека в файловой системе?(например, статическая библиотека или динамически связанная библиотека?)

Обновление: при использовании ldd в программе много библиотек зависимостей.Как определить, какая библиотека содержит функцию foo?

Ответы [ 3 ]

7 голосов
/ 04 апреля 2011

Вы не сказали, в какой ОС вы работаете, и ответ зависит от системы.

В 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$'
5 голосов
/ 03 апреля 2011

Вы не можете перечислить статические библиотеки в конечном двоичном файле. Чтобы получить список связанных динамических библиотек, используйте команды: В Linux используйте ldd [file]. В Mac OS X используйте otool -L [file]. На винде я понятия не имею ;-)

5 голосов
/ 03 апреля 2011

Для разделяемых библиотек попробуйте использовать ldd инструмент командной строки.

Для статических библиотек библиотека - в самой программы - внешних зависимостей нет, в этом весь смыслиспользуя статические библиотеки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...