Linux 加载程序时出现符号查找错误。符号在静态库中定义,可以使用nm查看
我在运行程序时看到以下错误:Linux 加载程序时出现符号查找错误。符号在静态库中定义,可以使用nm查看,linux,runtime,loader,symbols,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 | gr
/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
,可以看到这个函数的汇编代码。但是,在运行程序时,它会因符号查找错误而崩溃。这不是共享库问题,我无法解决它。请提供帮助。您正在动态加载共享对象/usr/pkl/libinfo。因此
可能是通过使用dlopen(3)
或类似函数来实现的。了解您是如何编译getinfo
(确切的链接命令)以及如何加载共享库(如果它正在调用dlopen(3)
,或在程序启动时自动加载)链接过程后没有可用的静态库信息是很有意思的(由于静态库的链接只包括从中提取.o
文件并将其正常链接到可执行文件),因此说GetList
来自静态库或*.o
对象在这里不感兴趣
显示链接getinfo
可执行文件的确切命令序列,如果通过调用dlopen(3)加载libinfo.so
<代码> >调用中的一些上下文也应该是有意思的。此外,如果代码< > GETLIST/C++ >是C或C++函数,应该很好知道,因为C++符号是由编译器来命名的,以应付参数列表类型匹配。也许您在输出中看到了C样式函数,输出到<代码> NM。GetList
函数
顺便问一下,链接完成后,关于某个静态库的依赖信息意味着什么。我假设GetList
函数包含在可执行文件中,正如您在nm(1)
输出中所显示的那样。因此,在动态链接时,libinfo.So
共享对象应该可以使用它(这取决于链接过程中链接器的一些选项——这就是要求使用确切链接命令的原因)如果可能,了解libinfo.so
模块的确切链接命令也很重要
编辑您的问题并添加缺少的信息,以便我们可以帮助您