symbol lookup error:undefined symbol
通过一个实例,引入这个问题。特在此说明一下,搞清楚原因。
问题:
向设备移植openvas时遇到一个问题。
运行openvassd,报错,在此之前我已经将libgio-2.0.so.0库移植到设备上,
libgio-2.0.so.0是安装glib-2.0 (版本号2.42.1)时一块安装的库。
初看错误,以为是libgio-2.0.so.0库有问题,没有定义g_signal_accumulator_first_wins.
分析:
nm libgio-2.0.so.0库,发现有符号g_signal_accumulator_first_wins.
openvassd怎么会找不到这个符号的定义呢?
刚开始以为是库的路径有问题,
执行ldconfig -v|grep gio
发现链接的库就是新的库(版本2.42.1安装的库),
这时候查看了一下,安装glib-2.0时,make install的日志文件,发现glib-2.0安装时,一共安装了
libglib-2.0.so.0.4200.1
libgmodule-2.0.so.0.4200.1
libgthread-2.0.so.0.4200.1
libgobject-2.0.so.0.4200.1
libgio-2.0.so.0.4200.1
五个库,
查看了gobject的符号,
发现了问题,两个库都有符号g_signal_accumulator_first_wins,
一个是U类型,一个是T类型。
有什么不同,是不是这个不同导致的问题?
关于U类型和T类型的说明如下:
T类型:该符号放在代码段中,通常是那些全局非静态函数;
U类型:该符号未定义过,需要自其它对象文件中链接进来。
此时,就很清楚了,没有链接上signal_accumulator_first_wins定义符号的库。也就是gobject库。
将gobject移植到设备上,发现问题解决了。
参考:man nm
https://www.cnblogs.com/itech/archive/2012/09/16/2687423.html