每个未定义的符号是不是都与它来自的库名称相关联?

Posted

技术标签:

【中文标题】每个未定义的符号是不是都与它来自的库名称相关联?【英文标题】:Is every undefined symbol associated with the library name it comes from?每个未定义的符号是否都与它来自的库名称相关联? 【发布时间】:2018-12-14 14:01:33 【问题描述】:

假设 libA.so 依赖于 libB.so、libC.so、libD.so。未定义的符号和所需的库名称之间是否存在映射:

undefined_symbol_1 comes from libB.so
undefined_symbol_2 comes from libC.so
undefined_symbol_3 comes from libC.so
undefined_symbol_4 comes from libC.so
undefined_symbol_5 comes from libD.so

还是分开存放:

Undefined symbols: undefined_symbol_1, undefined_symbol_2, undefined_symbol_3, undefined_symbol_4, undefined_symbol_5;
Required libraries: "libB.so", "libC.so", "libD.so";

系统:ubuntu

工具:g++

【问题讨论】:

这取决于操作系统和工具。有些工具可能只列出所有未解析的符号,让您弄清楚必须找到哪些库并将其包含在链接中。一些工具可能会保留哪些库提供哪些符号的缓存索引,并为您提供提示。 谢谢。我目前正在使用 ubuntu + g++。你能谈谈这个特定的平台吗? 阅读 Drepper 的How to write shared libraries 非常有趣的文章。虽然读了很多... 【参考方案1】:

Linux/elf 格式中没有这样的映射。未解析的符号和所需的库不相关。

事实上,您可以预加载(使用LD_PRELOAD)另一个库来解析任何未解析的符号。这种方法常用于将libcmalloc和朋友替换成另外一个堆实现而不需要重新编译可执行文件。

在解析符号时,运行时链接器会按照加载顺序遍历已加载可执行文件和库的列表,并选择第一个解析符号的文件。

推荐阅读:How to write shared libraries by Ulrich Drepper。

【讨论】:

@Alexey 首先,链接器必须检查库是否满足所有未解析的符号(除非--allow-shlib-undefined)。其次,必须指示运行时链接器在运行时加载哪些库以及从何处加载(例如readelf -d /usr/bin/emacs)。

以上是关于每个未定义的符号是不是都与它来自的库名称相关联?的主要内容,如果未能解决你的问题,请参考以下文章

架构 armv7 (WebRTC) 的未定义符号

架构 armv7 (WebRTC) 的未定义符号

查看未注入或警告:尝试多次加载角度

GLEW + cmake 链接失败“未定义对符号 glDrawElements 的引用”+“命令行中缺少 DSO”

Discord.js v13 机器人显示未定义而不是表情符号

如何将私钥添加到分发证书?