【问题标题】:ldd does not show the dependency which make then needsldd 没有显示 make 然后需要的依赖项
【发布时间】:2021-08-08 11:24:33
【问题描述】:

我有需要 v2xmvtest.so 的程序。当我尝试通过 make 构建它时,我得到undefined reference to * 看起来像 libssl1.0 中的那个函数。 (如果我安装它,它的构建很好)

但是我没有看到使用这些功能的地方。不仅如此,当我尝试ldd v2xmvtest.so 时,它确实只显示了 libvssl1.1 依赖项。

总结:

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

谢谢!

【问题讨论】:

    标签: c++ compilation ldd


    【解决方案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
    

    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__
    

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

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

    【讨论】:

      猜你喜欢
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 2020-05-07
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多