【问题标题】: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
  • 非常有趣的文章。虽然读了很多...

标签: c++ linux ubuntu g++ nm


【解决方案1】:

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

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

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

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

【讨论】:

  • @Alexey 首先,链接器必须检查库是否满足所有未解析的符号(除非--allow-shlib-undefined)。其次,必须指示运行时链接器在运行时加载哪些库以及从何处加载(例如readelf -d /usr/bin/emacs)。
猜你喜欢
  • 2019-05-15
  • 2013-02-05
  • 1970-01-01
  • 1970-01-01
  • 2017-07-08
  • 2019-07-21
  • 1970-01-01
  • 2021-05-24
  • 2021-09-15
相关资源
最近更新 更多