【问题标题】:How to force symbols from a static library to be included in a shared library build?如何强制将静态库中的符号包含在共享库构建中?
【发布时间】:2011-11-07 09:39:53
【问题描述】:

我正在尝试构建一个共享对象库,该库将由使用 dlopen() 的程序打开。该库将使用由单独的静态库提供的功能。

我在链接行中包含了适当的标志,以便在链接动态库时拉入静态库(例如,我有 -lfoo 用于 libfoo.a),并且链接器不会抱怨。但是,当主程序在动态库上调用 dlopen() 时,调用会失败并显示“未定义符号”消息,该消息引用了静态库中的符号。

运行 nm 确实表明有问题的符号在动态库中未定义,并且主程序不包含它,那么我该如何强制链接器拉入这个符号呢?符号本身位于未初始化的数据部分(nm 输出中的符号类型“B”)。

【问题讨论】:

    标签: gcc shared-libraries


    【解决方案1】:

    --whole-archive 链接器选项应该这样做。您可以将其用作例如

    gcc -o libmyshared.so foo.o -lanothersharedlib -Wl,--whole-archive -lmystaticlib
    

    您遇到的是,默认情况下,链接器将在静态存档中搜索您生成的二进制文件所需的符号,如果需要,它将包含符号所在的整个 .o。如果您的共享库不需要任何符号,它们将不会包含在您的共享库中。

    请记住,成为共享库的代码需要使用特殊选项进行编译,例如 -fpic ,因为您在共享库中包含静态库,静态库需要使用相同的选项进行编译。

    【讨论】:

      【解决方案2】:

      最近我也在寻找相同的解决方案。 我发现使用

      --undefined=symbol
      

      -u symbol
      

      解决问题。

      【讨论】:

      • --whole-archive 答案会将存档中的所有符号转换为共享库中的导出符号。如果您只需要一个符号,则此答案会在您的 .so 中创建更少的膨胀。
      【解决方案3】:

      另一个技巧是在库初始化期间获取函数的地址。这将确保您实际使用该符号。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多