【问题标题】:Are same symbols in different shared libs looked up starting from the root of the symbol namespace always again?是否总是从符号命名空间的根目录开始查找不同共享库中的相同符号?
【发布时间】:2016-09-09 08:04:57
【问题描述】:

根据我收集到的信息,共享库的默认可见性符号的符号名称查找以呼吸优先顺序遍历共享库依赖树,可执行程序是此搜索树的根。由一个 DT_NEEDED 列表链接的所有库都位于此树的同一级别。

因此,当查找符号“foo”时,在我看来,它的查找总是确定性地绑定到相同的库或运行时的可执行文件。动态链接器是否利用了这一点并具有某种“全局符号表”(可能与链接映射列表相关联),一旦第一次查找符号就知道哪个符号属于哪个共享库,并获取当另一个共享库第二次查找符号时,该库的 GOT 中的符号?还是总是像第一次查找一样查找符号?

【问题讨论】:

    标签: linux linker shared-libraries elf


    【解决方案1】:

    因此,当查找符号“foo”时,在我看来,它的查找总是确定性地绑定到同一库或运行时的可执行文件。

    这种观点方式过于简单化了。有很多复杂情况,例如引用 DSO 上存在DT_SYMBOLIC,加载定义 DSO 时存在RTLD_LOCAL(如果它没有直接链接),我确信还有一些其他的复杂情况我现在不记得了.

    动态链接器是否利用了这一点并具有某种“全局符号表”

    GLIBC 加载器不这样做。

    或者符号是否总是像第一次查找一样被查找?

    是的。您可以通过LD_DEBUG=symbols,bindings ./a.out 观察这一点

    【讨论】:

    • 感谢您的回答。你对此有什么看法;在大多数情况下,它会提高性能,用空间换取速度吗?
    • @JohannesSchaub-litb 是的:它可以在某些条件下显着提高性能。例如,谷歌携带了一个本地 GLIBC 补丁来实现这一点。一些细节:sourceware.org/ml/libc-help/2013-02/msg00040.html
    猜你喜欢
    • 1970-01-01
    • 2014-03-27
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    相关资源
    最近更新 更多