每个未定义的符号是不是都与它来自的库名称相关联?
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
)。以上是关于每个未定义的符号是不是都与它来自的库名称相关联?的主要内容,如果未能解决你的问题,请参考以下文章
GLEW + cmake 链接失败“未定义对符号 glDrawElements 的引用”+“命令行中缺少 DSO”