加载程序时出现符号查找错误。符号在静态库中定义,可以使用nm查看

时间:2017-02-17 20:07:08

标签: linux runtime loader symbols

运行程序时出现以下错误:

/usr/bin/getinfo: symbol lookup error: /usr/pkl/libinfo.so: undefined symbol: GetList

此函数“GetList”在静态库liblist.a中定义,该库已链接到可执行文件/usr/bin/getinfo并使用gcc编译。我可以看到,当我运行'nm'命令时,可执行文件getinfo中有定义的符号。这是nm命令输出:

root@pkl $ nm /usr/bin/getinfo | grep GetList
080a3d89 T GetList

我还使用readelf命令进行了检查,这是输出:

root@pkl $ readelf -a /usr/bin/getinfo | grep GetList
 1080: 080a3d89 1777 FUNC   GLOBAL DEFAULT   15 GetList

libinfo.so共享库调用函数GetList,该函数在liblist.a静态库中定义。 libinfo.soliblist.a都列为可执行文件/usr/bin/getinfo的依赖项。 liblist.a 已添加为libinfo.so的依赖项 我也完成了objdump -S /usr/bin/getinfo | grep GetList并且可以看到这个函数的汇编代码。但是,在运行程序时,它会因符号查找错误而崩溃。这不是共享库问题,我无法解决它。请帮忙。

1 个答案:

答案 0 :(得分:0)

好吧,您可能正在使用/usr/pkl/libinfo.so或类似函数动态加载共享对象dlopen(3)。知道如何编译getinfo(确切的链接命令)以及如何加载共享库(如果它正在调用dlopen(3)或在程序启动时自动加载)将会很有趣。没有静态库信息是在链接过程之后可用(因为静态库的链接仅包括从中提取.o文件并将它们正常链接到可执行文件),所以说GetList来自静态库或来自这里没有*.o对象。

显示确切的命令序列以链接getinfo可执行文件,如果您通过调用libinfo.so加载dlopen(3),那么调用周围的某些上下文也应该是有意义的。另外,知道GetList是否是C或C ++函数应该是很好的,因为编译器会对C ++符号进行名称修改以处理参数列表类型匹配。也许你在nm的输出中看到一个C风格函数,但是你试图调用一个C ++ GetList函数。

顺便说一句,在完成链接之后,你对一些静态库的依赖信息是什么意思。我假设GetList函数包含在可执行文件中,正如您在nm(1)输出中显示的那样。因此,当动态链接时,它应该可用于libinfo.so共享对象(这取决于链接过程中链接器的一些选项---这是要求您使用的确切链接命令的原因)它也是重要的是要知道libinfo.so模块的确切链接命令,如果可能的话。

修改您的问题并添加缺失的信息,以便我们为您提供帮助。