【发布时间】:2011-01-17 11:49:15
【问题描述】:
我刚刚在 Ubuntu 上构建了一个共享库,当我尝试使用该功能时,加载该库的应用程序报告找不到 'xxx' 符号。
我想检查(即列出)我的库导出的函数,以便进一步调查此问题。
相关详情:
操作系统:Ubuntu 9.10 编译器:gcc 4.4.1 链接器:GNU ld 2.20
【问题讨论】:
我刚刚在 Ubuntu 上构建了一个共享库,当我尝试使用该功能时,加载该库的应用程序报告找不到 'xxx' 符号。
我想检查(即列出)我的库导出的函数,以便进一步调查此问题。
相关详情:
操作系统:Ubuntu 9.10 编译器:gcc 4.4.1 链接器:GNU ld 2.20
【问题讨论】:
试试 nm 实用程序。
GNU nm 列出对象中的符号 文件 objfile.... 如果没有目标文件 被列为参数,nm 假设 文件 a.out。 [reference]
【讨论】:
nm -D -C -g <library>
效果也很好。
【讨论】:
--defined-only 选项,否则这样你也会得到导入。此外,仅获取 functions 而不是例如类似于_edata,您应该在第二列中查找带有T 或t 的符号。所以,像这样:nm -DCg --defined-only $MY_LIB | grep '^[0-9a-f]\+ [Tt] '
您的共享库是在库加载路径中还是在应用程序的运行时搜索路径中?听起来动态链接器找不到您的库。尝试在您的应用程序上运行 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) 手册页。
【讨论】: