2010-02-16 62 views
30

我刚刚在Ubuntu上构建了一个共享库,当我尝试使用该函数时,加载该库的应用程序报告未找到'xxx'符号。如何在Ubuntu上共享库中列出导出的函数

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

相关信息:

操作系统:Ubuntu 9.10的 编译器:GCC 4.4.1 链接:GNU LD 2.20

回答

26

尝试纳米工具。

GNU nm列出的符号从对象 文件OBJFILE ....如果没有对象文件 列出作为参数,纳米假定 文件的a.out。 [reference]

+15

**纳米-C --defined只-g libXXX.so **为C++ – 2010-02-16 17:01:33

+0

感谢您的。看起来我的符号被导出,但未定义(它在函数名称旁边有一个'U')。一个函数如何导出,但尚未定义(IIRC,一个链接器选项可以防止这种混乱)。更重要的是,我能做些什么来解决它? – 2010-02-16 17:09:20

+0

通过“修复它”,我的意思是如何确保我的函数在共享库中导出和定义? – 2010-02-16 17:10:30

2

是您在库加载路径或应用程序运行时搜索路径中的共享库吗?这听起来像动态链接器无法找到你的库。尝试在应用程序上运行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)手册页。

19
nm -D -C -g <library> 

工作得很好。

+1

对于_exported_功能加上'--defined-only'选项,否则这样你会得到进口过的功能。而且,为了仅获得_functions_而不是例如像'_edata'这样的东西,你应该在第二列中用'T'或't'来寻找符号。所以,像这样:'nm -DCg --defined-only $ MY_LIB | grep'^ [0-9a-f] \ + [Tt]'' – Ruslan 2016-08-29 18:25:37