动态库加载:轻松找出未解析的符号运行时

时间:2013-06-14 12:40:24

标签: c unix shared-libraries ace

我正在开发一个庞大的项目,它使用ACE_DLL :: open在运行时加载动态库。

找到库并尝试打开,但由于未解析的符号,mmap(下面是strace)失败。我肯定知道它是因为未解析的符号和运行nm我可以获得所有未解析符号的列表。问题是在编译时有大量未解决的符号,这些符号应该在运行时解决,所以nm不是很有用,因为我需要逐个遍历所有符号。

是否有一种聪明的方法可以确定导致.so加载的确切原因

open("libxxxxxxx_d.so", O_RDONLY) = 29
read(29, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\300w\3\0004\0\0\0"..., 512) = 512
fstat64(29, {st_mode=S_IFREG|0755, st_size=10130306, ...}) = 0
mmap2(NULL, 373832, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 29, 0) = 0xffffffffed5f5000
mmap2(0xed64e000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 29, 0x59)  =   0xffffffffed64e000
close(29)                               = 0
munmap(0xed5f5000, 373832)              = 0
munmap(0xed5cc000, 167764)              = 0

3 个答案:

答案 0 :(得分:2)

ACE_DEBUG=1设置为环境变量,ACE日志记录应该打印一条调试消息,指示哪个符号未解析。这只是一个符号,因此您可能需要多次迭代才能找到所有

答案 1 :(得分:0)

strace片段未显示任何类型的失败。共享库的开放似乎已经成功。

我不熟悉你提到的ACE_DLL::open,但我发现了一些信息here,看起来它只是dlopen()和朋友的一个薄包装。

现在,由于dlopen()处的未解析符号,库可能无法打开,但仅在使用RTLD_NOW时才会打开。问题是错误消息只提到一个有问题的符号。

如果您不想通过nmobjdump -T或类似的方式遍历库所需的符号列表,那么您可以做的最简单的事情就是将您的应用程序与相关库链接起来并查看链接器报告为错误的内容。它应该列出所有问题,而不仅仅是一个。首先,向您的应用程序添加一些占位符代码,该代码将引用库中的任何有效符号(强制链接器引入库),然后将-lxxxxxxx_d添加到链接oprions。

答案 2 :(得分:0)

此命令将报告共享库中缺少的任何功能和对象:

ldd -r your_library.so

有关详细信息,请参阅man ldd