gpt4 book ai didi

gcc - 如何使用 binutils 链接器处理静态库之间的递归依赖关系?

转载 作者:行者123 更新时间:2023-12-03 19:59:05 28 4
gpt4 key购买 nike

我正在将现有系统从 Windows 移植到 Linux。构建由多个静态库构成。我遇到了链接错误,在 libB 的对象中找不到符号(在 libA 中定义)。链接器行看起来像

g++ test_obj.o -lA -lB -o 测试

问题当然是,当链接器发现它需要来自 libA 的符号时,它已经通过了它,并且不会重新扫描,因此即使符号在那里供获取,它也会出错。

我最初的想法当然是简单地交换链接(到 -lB -lA),以便随后扫描 libA,并拾取 libA 中 libB 中缺少的任何符号。但是后来我发现 libA 和 libB 之间实际上存在递归依赖关系!我假设 Visual C++ 链接器以某种方式处理这个问题(默认情况下它会重新扫描吗?)。

我考虑过的处理方法:

  • 使用共享对象。不幸的是,从要求 PIC 编译的角度来看,这是不可取的(这是性能敏感的代码,失去 %ebx 来保存 GOT 真的会受到伤害),并且不需要共享对象。
  • 为所有对象构建 1 兆 ar,从而避免该问题。
  • 重构代码以避免递归依赖(这显然是正确的做法,但我正在尝试以最少的更改来完成此端口)。

  • 你有其他想法来处理这个问题吗?有什么方法可以说服 binutils 链接器重新扫描它在缺少符号时已经查看过的库?

    最佳答案

    只需这样做:

    g++ test_obj.o -lA -lB -lA       -o test

    当链接器读取命令行上的第一个 libA 时,它会丢弃其中没有人依赖的对象/符号,例如libB 需要的所有符号,但不是 test_obj.o。所以你只需让它再次读取 libA,它也会选择这些符号。

    关于gcc - 如何使用 binutils 链接器处理静态库之间的递归依赖关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2738292/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com