#c #compilation #ldd
Вопрос:
У меня есть программа, которая нуждается v2xmvtest.so. Когда я пытаюсь построить его с помощью make, я получаю неопределенную ссылку на*, Похоже, что эта функция из libssl1.0. (Если я ее установлю, она будет построена нормально)
Но я не вижу места, где используются эти функции. Более того, когда я пробую ldd v2xmvtest.so он показывает только зависимость libvssl1.1.
Краткие сведения:
- Есть ли способ узнать, где в программе используются эти функции из libvssl1.0 ? (у меня есть исходный код v2xmvtest.so и попробуйте поискать, но там нет ни одного из них)
- Мне нужно описание, почему ldd не показывает мне зависимость libssl1.0, но во время связывания это необходимо
Спасибо!
Ответ №1:
Библиотеки не требуются для полного определения используемых символов. Например, вы можете иметь lib.cpp
:
int foo();
int bar(int x)
{
return x foo();
}
и он компилируется, даже foo
на самом деле еще не определен:
g lib.cpp -shared -o lib.so
Тогда вы можете иметь main.cpp:
#include <iostream>
int bar(int);
int foo()
{
return 10;
}
int main()
{
std::cout << bar(42) << std::endl;
}
который определяет foo
и успешно компилируется с lib.so:
g main.cpp lib.so -o main
foo
Функция в lib.so ожидается, что он будет предоставлен только тогда, когда приложение связано, и не указано, откуда именно, даже не обязательно из библиотеки.
Вы можете проверить наличие неопределенных символов в библиотеке с помощью инструмента nm:
nm -C -u lib.so
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
U foo()
w __cxa_finalize@@GLIBC_2.17
w __gmon_start__
И, наконец, вы можете заставить gcc гарантировать, что объектные файлы не будут использовать неопределенные символы, путем компиляции с -Wl,-z,defs
флагом компоновщика:
g lib.cpp -shared -Wl,-z,defs -o lib.so
...
lib.cpp:(.text 0x24): undefined reference to `foo()'