【问题标题】:How to list exported functions in a shared lib on Ubuntu如何在 Ubuntu 的共享库中列出导出的函数
【发布时间】:2011-01-17 11:49:15
【问题描述】:

我刚刚在 Ubuntu 上构建了一个共享库,当我尝试使用该功能时,加载该库的应用程序报告找不到 'xxx' 符号。

我想检查(即列出)我的库导出的函数,以便进一步调查此问题。

相关详情:

操作系统:Ubuntu 9.10 编译器:gcc 4.4.1 链接器:GNU ld 2.20

【问题讨论】:

    标签: c++ ubuntu linker


    【解决方案1】:

    试试 nm 实用程序。

    GNU nm 列出对象中的符号 文件 objfile.... 如果没有目标文件 被列为参数,nm 假设 文件 a.out。 [reference]

    【讨论】:

    • nm -C --defined-only -g libXXX.so 用于 C++
    • 谢谢。看来我的符号已导出,但未定义(函数名称旁边有一个“U”)。如何导出函数但未定义(IIRC,链接器选项可防止这种荒谬)。更重要的是,我能做些什么来解决它?
    • 通过“修复”,我的意思是如何确保我的函数在共享库中导出和定义?
    • 会不会是未定义的符号包含在另一个共享对象中?查看 Void 的建议。
    • 您是否能够找到问题的根本原因?我正在尝试链接基于 FORTRAN 的库,它在输出共享库中显示为未定义的函数
    【解决方案2】:
    nm -D -C -g <library>
    

    效果也很好。

    【讨论】:

    • 对于 exported 函数添加 --defined-only 选项,否则这样你也会得到导入。此外,仅获取 functions 而不是例如类似于_edata,您应该在第二列中查找带有Tt 的符号。所以,像这样:nm -DCg --defined-only $MY_LIB | grep '^[0-9a-f]\+ [Tt] '
    【解决方案3】:

    您的共享库是在库加载路径中还是在应用程序的运行时搜索路径中?听起来动态链接器找不到您的库。尝试在您的应用程序上运行 ldd 以查看是否可以在运行时找到该库,例如

    $ ldd /usr/bin/less
        linux-gate.so.1 =>  (0x0072a000)
        libncurses.so.5 => /lib/libncurses.so.5 (0x00c68000)
        libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x007c7000)
        libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0x00286000)
        /lib/ld-linux.so.2 (0x002a1000)
    

    有关库搜索路径的更多详细信息,请参阅 ld.so(8) 手册页。

    【讨论】:

      猜你喜欢
      • 2012-11-12
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多