gpt4 book ai didi

macos - 包括带有 -all_load 标志的静态库

转载 作者:行者123 更新时间:2023-12-04 14:46:33 26 4
gpt4 key购买 nike

在什么情况下你需要 -all_load 标志?

可以说我有类似的东西

g++ source.cpp -o test libA.a libB.a libC.a

根据我的记忆,是否存在对 source.cpp 中使用的符号的引用
比如说 libB.a然后归档 libB.a将被链接(只是那个符号或该库中的整个代码?)和 libA.alibC.a将被忽略(它们的代码不会出现在最终的可执行文件中)。
  • 当我使用 -all_load 标志时其他库会发生什么,如下所示
    g++ source.cpp -o test -Wl,-all_load libA.a libB.a libC.a
  • 'strip' 命令如何影响带有 all_load 标志的输出?
  • 最佳答案

    -all_load用于当您想要链接(到链接器)不必要的编译单元时。例如,也许您将在运行时动态访问静态库中您知道地址但实际上并未进行任何显式函数调用的函数。你会怎么做?好吧,编译器可以通过将一堆函数指针存储在可执行文件中以在运行时读取来帮助您,然后您将构建一个查找系统以使用字符串查找这些函数,然后您将整个事情称为 Objective -C,这可能是 -all_load 最常用的用户(至少如果谷歌是任何指南)。

    ObjC 中最常见的情况是当您在自己的编译单元中有一个类别时。编译器可能无法告诉您引用它,因此不会链接它。所以 ObjC 程序员使用 -all_load (或 -force_load )比其他类 C 程序员更频繁。事实上,-all_load是 gcc 中特定于 Darwin 的扩展。

    但有些情况下人们可能想要使用 -all_load在 ObjC 之外。例如,libA 和 libB 中可能存在一些相互依赖关系。考虑这种情况:

  • source.cpp 需要 A()B()
  • libA 定义 A()a.oAprime()aprime.o
  • libB 定义 B()b.o并且需要 Aprime()

  • 这通常不会链接 (*)。编译器将从 source.o 开始并列出要求: A()B() .然后它会查看 libA 并看到它定义了 A() ,所以它会链接 a.o (但不是 aprime.o )。然后它会查看 libB 并看到它定义了 B()并且需要 Aprime() .它现在已用完库,并且尚未解决 Aprime() .它失败。

    (*) 实际上,它会与 clang 一起使用,因为 clang 对此非常聪明。但至少在 4.6 之前不会使用 g++。

    最好的解决方案是重新排序,以便 libB 排在第一位 (**)。但如果依赖关系是循环的,你可能会完全陷入困境。 -all_load-force_load让您通过关闭链接器的优化来解决这些情况。

    (**) 真正最好的解决方案通常是重新设计你的库以避免这种相互依赖,但这可能希望太多。

    如果您想解决这个问题,请参阅 https://gist.github.com/rnapier/5710509 .
    strip只是从可执行文件中删除符号。这与静态链接和 -all_load 没有特别的关系。 (尽管它确实会影响动态链接)。 strip(1)对此有很多讨论。

    关于macos - 包括带有 -all_load 标志的静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16926608/

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