ldd 不显示 make then 需要的依赖项

问题描述

我有需要 v2xmvtest.so 的程序。当我尝试通过 make 构建它时,我得到 undefined reference to * 似乎是 libssl1.0 中的那个函数。 (如果我安装它,它就可以正常构建)

但是我没有看到使用这些功能的地方。更重要的是,当我尝试 ldd v2xmvtest.so 时,它只显示 libvssl1.1 依赖项。

总结:

  1. 有没有办法找出程序中使用了 libvssl1.0 中的那些功能? (我有 v2xmvtest.so 的源代码并尝试搜索,但没有任何这些)
  2. 我需要说明为什么 ldd 不显示 libssl1.0 依赖项,但在链接期间需要它

谢谢!

解决方法

库不需要完全定义使用的符号。例如你可以有 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

lib.so 中的 foo 函数预计仅在应用程序链接时提供,并未指定确切来自何处,甚至不需要来自库。

您可以使用 nm 工具检查库中未定义的符号:

nm -C -u lib.so 
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
                 U foo()
                 w __cxa_finalize@@GLIBC_2.17
                 w __gmon_start__

最后,您可以通过使用 -Wl,-z,defs linker flag 进行编译来强制 gcc 确保目标文件不使用未定义的符号:

g++ lib.cpp -shared -Wl,defs -o lib.so
...
lib.cpp:(.text+0x24): undefined reference to `foo()'