【发布时间】:2014-01-06 16:05:34
【问题描述】:
分析this question 我发现了一些关于在Linux 上动态加载(dlopen) 上下文中弱符号解析的行为。现在我正在寻找管理这个的规范。
让我们以an example 为例。假设有一个程序a 按此顺序动态加载库b.so 和c.so。如果c.so 依赖于另外两个库foo.so(在该示例中实际上是libgcc.so)和bar.so(实际上是libpthread.so),那么通常bar.so 导出的符号可以用于满足@ 中的弱符号链接987654337@。但是如果b.so 也依赖于foo.so 而不是bar.so,那么这些弱符号显然不会与bar.so 相关联。似乎foo.soinkages 只查找来自a 和b.so 及其所有依赖项的符号。
这在某种程度上是有道理的,因为否则加载c.so 可能会在b.so 已经使用该库的某个时刻改变foo.so 的行为。另一方面,在让我开始的问题中,这引起了很多麻烦,所以我想知道是否有办法解决这个问题。为了找到解决方法,我首先需要很好地了解在这些情况下如何指定符号解析的确切细节。
在这些场景中定义正确行为的规范或其他技术文档是什么?
【问题讨论】:
-
你看过this PDF吗?很多有趣的数据,但不确定它是否包含您要查找的内容。
-
@rodrigo:不确定是这个还是类似的东西,但到目前为止,我发现的所有 ELF 文档都只描述了执行二进制文件之前的动态链接,而不是动态加载对象中涉及的链接。这是一个很长的文档,我可能看错了地方,但到目前为止,它似乎不是我要找的。span>
-
那么这个Drepper post 和它或多或少的related doc (见1.5.2 节)呢?正如我所解释的那样,弱符号仅用于静态链接。所以
dlopen()不会区分弱符号和强符号。 -
@rodrigo:抱歉,我花了这么长时间才尝试这个。看来您是对的,与我的看法相反,加载共享对象时未解决的符号不会导致加载失败。我认为弱是需要的,但事实并非如此。无论如何,您链接的文档的第 1.5.4 节是迄今为止我读过的最有用的部分,因为它非常详细地说明了库的处理顺序以及控制它的各种设置。如果您(或其他人)可以总结这一点,我很乐意为此奖励我的赏金。我会自己做,但在那种情况下,赏金会丢失,所以我不会。
标签: linux dynamic-linking dynamic-loading symbol-table weak-linking