so库又一次遇到 undefined symbol------ldd, nm, c++filt命令大显身手

本文通过一个实例探讨了动态链接库(.so文件)在加载过程中出现符号未定义的问题,分析了导致该问题的原因,并提供了使用ldd和nm命令定位问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       最近发版本, 灰度发布的时候, 发现进程没来, 回包自然是异常的。 立即进行版本回退, 发现OK. 

       哪里出问题了呢? 直接ldd -r libtest.so一下, 就知道了, 原来是缺符号。 看看简化后的示例代码:

 

#include <iostream>
using namespace std;

class Test
{
public:
	void output();		
};

#if 0
void Test::output()
{
	cout << "output is celled" << endl;
}
#endif

void fun()
{
	Test T;
	T.output();
}

      先编译成test.o, 然后编译成libtest.so,  不会有编译问题, 但如果其他模块来加载libtest.so, 就会有问题。 libtest.so为什么会有问题呢? 因为没有符号啊, 看看:

 

 

xxxxxx:~> ldd -r libtest.so 
undefined symbol: _ZNSt8ios_base4InitC1Ev       (./libtest.so)
undefined symbol: _ZNSt8ios_base4InitD1Ev       (./libtest.so)
undefined symbol: _ZN4Test6outputEv     (./libtest.so)
undefined symbol: __gxx_personality_v0  (./libtest.so)
        linux-gate.so.1 =>  (0xbfffe000)
        /lib/libonion.so (0xb7faa000)
        libc.so.6 => /lib/libc.so.6 (0xb7e5f000)
        libdl.so.2 => /lib/libdl.so.2 (0xb7e5a000)
        /lib/ld-linux.so.2 (0x80000000)
xxxxxx:~> c++filt _ZN4Test6outputEv
Test::output()
xxxxxx:~> 

       一切一目了然。

 

 

       再回忆一下, 之前我们遇到过类似问题, 最终发现是makefile中没有指定对应的静态库, 也就无法找到静态库中的函数。 其实, 这种情况和上述情况是完全一致的, 总之就是找不到函数的定义, 没有符号。

       最后说一下, 如果你愿意, 用nm命令也可以哈, 如下:

 

xxxxxx:~> nm -u libtest.so
         U __cxa_atexit@@GLIBC_2.1.3
         w __cxa_finalize@@GLIBC_2.1.3
         w __gmon_start__
         U __gxx_personality_v0
         w _Jv_RegisterClasses
         U _ZN4Test6outputEv
         U _ZNSt8ios_base4InitC1Ev
         U _ZNSt8ios_base4InitD1Ev
xxxxxx:~> c++filt _ZN4Test6outputEv
Test::output()
xxxxxx:~> 


       不多说。

 

 

 


 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值