运行程序时出现以下错误:
/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.so
和liblist.a
都列为可执行文件/usr/bin/getinfo
的依赖项。 liblist.a
不已添加为libinfo.so
的依赖项
我也完成了objdump -S /usr/bin/getinfo | grep GetList
并且可以看到这个函数的汇编代码。但是,在运行程序时,它会因符号查找错误而崩溃。这不是共享库问题,我无法解决它。请帮忙。
答案 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
模块的确切链接命令,如果可能的话。
修改您的问题并添加缺失的信息,以便我们为您提供帮助。