ldd не показывает зависимость, которая делает то, что нужно

#c #compilation #ldd

Вопрос:

У меня есть программа, которая нуждается v2xmvtest.so. Когда я пытаюсь построить его с помощью make, я получаю неопределенную ссылку на*, Похоже, что эта функция из libssl1.0. (Если я ее установлю, она будет построена нормально)

Но я не вижу места, где используются эти функции. Более того, когда я пробую ldd v2xmvtest.so он показывает только зависимость libvssl1.1.

Краткие сведения:

  1. Есть ли способ узнать, где в программе используются эти функции из libvssl1.0 ? (у меня есть исходный код v2xmvtest.so и попробуйте поискать, но там нет ни одного из них)
  2. Мне нужно описание, почему 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()'