1

我正在开发一个大型项目,该项目在运行时使用 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
4

3 回答 3

2

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

于 2013-06-15T09:37:08.280 回答
0

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

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

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

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

于 2013-06-14T14:18:38.340 回答
0

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

ldd -r your_library.so

有关man ldd更多信息,请参阅。

于 2013-06-17T07:52:50.693 回答