【发布时间】:2012-01-11 23:13:33
【问题描述】:
我正在尝试加载我在 Linux ARM 平台下使用 dlopen 提供(封闭源代码)的共享库(插件)。我正在尝试以这种方式加载:
void* handle = dlopen(<library_path>/<library_name>, RTLD_NOW);
结果是失败并显示此消息:
Failed to load <library_path>/<library_name>: undefined symbol: <symbol_name>.
我试图用 nm 查看库内部,但似乎库已被剥离,找不到符号。我也试过用readelf -s,其实我得到了这样的结果:
12663: 00000000 0 NOTYPE GLOBAL DEFAULT UND <symbol_name>
通过阅读,我了解到 readelf -s 返回所有符号,包括在它引用的库中定义的那些符号。
this 问题的答案对我来说并不完全清楚:这是一个应该在库中的符号,而它不存在是因为它以错误的方式编译还是我应该是这个符号找别的地方? readelf -d 的输出似乎表明我提供了所有需要的共享库。此错误可能与我编译可执行文件的方式错误有关,还是与加载程序无关?
另外,我阅读了每一列的含义,但这些值很奇怪。您如何解释该符号描述?为什么地址是0?为什么是 NOTYPE 类型?
【问题讨论】:
-
使用
nm -D而不仅仅是nm。 -
您是否特别应该使用
RTLD_NOW?否则,您可能只需要切换到RTLD_LAZY。 -
@n.m.:啊!我真的不知道。符号被列为:U
. -
@DavidSchwartz:嗯,我不确定,但我认为最好了解为什么会发生这种情况并引起注意。无论如何,重点也是学习。
-
file <name of so file>返回什么?如果我针对 /lib/libm-2.11.1.so 运行它,我会得到“ELF 32-bit LSB ...,剥离”并运行nm /lib/libm-2.11.1.so我会得到“无符号”。但是做什么@n.m。说,我得到一个函数列表。它们是可见的,否则任何程序将如何工作。
标签: c++ compilation linker shared-libraries dlopen