so出现undefined symbol------ldd, nm, c++filt

最近发版本,灰度发布的时候,发现进程没起来,回包自然是异常的。立即进行版本回退,发现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()

再回忆一下, 之前我们遇到过类似问题, 最终发现是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:~>

   转载规则


《so出现undefined symbol------ldd, nm, c++filt》 吴杭沉 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
C/C++整型变量赋值操作是原子性的吗? C/C++整型变量赋值操作是原子性的吗?
整型变量赋值操作不是原子操作那么为什么整型变量的操作不是原子性的呢?常见的整型变量操作有如下几种情况:给整型变量赋值一个确定的值,如 int a = 1;这条指令操作一般是原子的,因为对应着一条计算机指令,cpu将立即数1搬运到变量a的内存
2024-10-13
下一篇 
Lambda 表达式捕获列表 Lambda 表达式捕获列表
捕获值列表,是允许我们在Lambda表达式的函数体中直接使用这些值,捕获值列表能捕获的值是所有在此作用域可以访问的值,包括这个作用域里面的临时变量,类的可访问成员,全局变量。捕获值的方式分两种,一种是按值捕获,一种是按引用捕获。顾名思义,按
2024-10-08
  目录