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

标签 linux runtime loader symbols

我在运行程序时看到以下错误:

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

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

最佳答案

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

显示链接 getinfo 可执行文件的确切命令序列,如果您通过调用 dlopen(3) 加载 libinfo.so围绕通话的一些上下文也应该引起人们的兴趣。此外,知道 GetList 是 C 还是 C++ 函数应该很容易知道,因为 C++ 符号的名称被编译器破坏以应对参数列表类型匹配。也许您在 nm 的输出中看到了 C 风格的函数,但您正在尝试调用 C++ GetList 函数。

顺便说一下,在链接完成后,关于某些静态库的依赖信息是什么意思。我想 GetList 函数包含在可执行文件中,正如您在 nm(1) 输出中显示的那样。所以它应该在动态链接时对 libinfo.so 共享对象可用(这取决于链接过程中链接器的某些选项——这就是要求您提供确切链接命令的原因used) 如果可能的话,了解 libinfo.so 模块的确切链接命令也很重要。

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

关于linux - 加载程序时出现符号查找错误。 Symbol定义在静态库中,可以使用nm查看,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42306491/

相关文章:

jquery - jquery 自动完成中的动态参数

java - 在 Java 和 C 中在运行时调用名为 "string"的方法

python - 使用 .conf 文件配置 celery

java - 如何从 jar 文件内存流中加载类

php - 使应用程序可针对不同的客户进行配置

linux - 复制相同的 BeagleBone Black 设置

linux - 在 bash 中将正在运行的函数发送到后台

linux - 无法将数据包从一个接口(interface)路由到另一个接口(interface)

dependency-injection - 依赖注入(inject) : How to construct a class that depends on runtime parameters?

app-store-connect - iTunes Connect 应用程序缺少所需的架构