加载到C程序中的动态加载对象在x86_64上给出了未定义的符号错误

时间:2010-07-13 20:11:10

标签: c linker-errors

我有一个C程序,它在运行时动态加载.so文件,以便连接到MySQL数据库。在x86(32位)内核上运行正常但是当我在x86_64(64位)内核上重新编译我的程序时,我得到这样的运行时错误:

dlerror:   mysql-1.932-x86_64-freebsd7.2.so::plugin_tweak_products: Undefined symbol "plugin_filter_cart"
dlerror:   mysql-1.932-x86_64-freebsd7.2.so::plugin_shutdown: Undefined symbol "plugin_post_action"

显然,从上面的错误信息可以看出,该程序在FreeBSD 7.2 x86_64机器上运行。 C程序和.so文件都编译为64位。

当我加载.so文件时,我正在将RTLD_LAZY传递给dlopen()。我认为问题在于,由于某种原因,在x86_64上,它不是根据需要动态加载库的一部分,而是在32位x86上。我可以在Makefile.am中放置一些标志来使其在x86_64上运行吗?还有其他想法吗?

以下是文件命令为我的C程序列出的内容

ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), for FreeBSD 7.2, dynamically linked (uses shared libs), FreeBSD-style, not stripped

和.so文件

ELF 64-bit LSB shared object, x86-64, version 1 (FreeBSD), not stripped

2 个答案:

答案 0 :(得分:0)

只是一个疯狂的猜测。前缀plugin似乎表明可能存在一些函数指针正在进行的回调。也许你的编译器版本对于32位和64位不一样?你使用C99或gcc的inline功能吗?

如果编译器的一个变体能够内联某些函数(staticinline)而其他函数不能内联,则会发生这种情况。然后可能产生外部符号。这取决于你的很多编译器版本,gcc有不同的策略来处理这种情况。尝试在至少一个对象中强制执行该函数。如roguenut所示,请与nm核对丢失的符号。

答案 1 :(得分:0)

看起来这是由与

相同的问题引起的

dlerror: Undefined symbol "_nss_cache_cycle_prevention_function" on FreeBSD 7.2

在检查dlerror()的返回值之前,首先需要调用dlerror()并忽略返回值以清除先前错误中的错误。