2015-05-27 21 views
1

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

+1

Найдите строку, вызывающую вызов, используя отладчик. – user2079303

+1

Возможно, вы захотите добавить тег «linux» –

ответ

0

Удалить ссылку -lintbasic, вы увидите все функции, которые нуждаются в этой библиотеке в сообщениях об ошибках. Это не чисто, но должно работать нормально.

+0

Ну, это не то, что я хотел сделать. Я хочу избавиться от тех функций, которые это называют. Я хочу узнать эти функции. – ari

+0

Я только что отредактировал свой ответ. – Brahim

1

Я не могу установить любую библиотеку в систему,

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

Как я мог это узнать, кто звонит эту библиотеку

Есть два случая:

  1. бинарный файл или одну из библиотек напрямую связана со ссылками на libintbasic.so. Ваш двоичный файл не будет запускаться вообще, или
  2. ваш двоичный файл, или одна из библиотек, непосредственно связанная с вызовами dlopen("libintbasic.so",...), и сбой при этом dlopen не удался.

Отладка первого случая часто бывает проще всего путем установки LD_DEBUG=files,libs. Затем динамический загрузчик скажет вам, какие библиотеки загружаются и почему они требуются.

Отладка второй случай легко с gdb: установить точку останова на dlopen и выполнять where и info shared команды каждый раз, когда достигает точки останова.

Смежные вопросы