我有一个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
答案 0 :(得分:0)
只是一个疯狂的猜测。前缀plugin
似乎表明可能存在一些函数指针正在进行的回调。也许你的编译器版本对于32位和64位不一样?你使用C99或gcc的inline
功能吗?
如果编译器的一个变体能够内联某些函数(static
或inline
)而其他函数不能内联,则会发生这种情况。然后可能产生外部符号。这取决于你的很多编译器版本,gcc有不同的策略来处理这种情况。尝试在至少一个对象中强制执行该函数。如roguenut所示,请与nm
核对丢失的符号。
答案 1 :(得分:0)
看起来这是由与
相同的问题引起的dlerror: Undefined symbol "_nss_cache_cycle_prevention_function" on FreeBSD 7.2
在检查dlerror()的返回值之前,首先需要调用dlerror()并忽略返回值以清除先前错误中的错误。