【问题标题】:Avoid linking in unused symbols when linking against static libs链接静态库时避免链接未使用的符号
【发布时间】:2011-04-08 07:25:34
【问题描述】:

我正在使用apple gcc 编译我要重新分发的dylib。由于各种原因,我使用了一些库,让我们说libz 以保持简单。

由于这个库通常不会在 Mac 系统上找到,我希望通过将路径传递给 .a-file 来将 static link in 使用的符号放入 dylib 以简化部署。

现在,链接器将 all 符号中的符号从 lib 链接到生成的 dylib,尽管我只引用了一个子集。在 linux 上我从来没有遇到过这个问题,链接器很高兴地丢弃了所有未引用的符号并创建了一个非常苗条的可执行文件,所以它应该是可能的。我现在拥有的 dylib 文件比它应该的要大约 10 倍。

我尝试过使用 -dead_code 链接器标志,但无济于事。也许我只是不明白?

有人知道解决办法吗?

【问题讨论】:

    标签: c++ linker darwin


    【解决方案1】:

    Try -Wl,--gc-sections.

    关于-dead_strip(你可能指的是-dead_code):

    在开启 -dead_strip 之前 您的项目首先必须选择的选项 被“移植”以使用死代码 剥离。这将包括改变 从 -gused(-g 的默认值)到 -gfull 并重新编译链接到您的所有对象文件 使用新编译器的程序 Mac OS X 2004 年 6 月发布。还有如果 您构建一个加载的可执行文件 插件,它使用来自 可执行文件,您必须确保 插件使用的符号不是 剥离(通过使用 属性((使用))或 -exported_symbols_list 选项)。如果您正在使用导出列表并构建 共享库或可执行文件 将与 ld(1) 一起使用 -bundle_loader 标志,您需要包含异常符号 导出列表中的帧信息 为您导出的 C++ 符号。这些 符号以 .eh 结尾,可以看到 使用 nm(1) 工具。

    and:

    从 命令行,传递 -dead_strip ld的选项。您还应该通过 GCC 的 -gfull 选项,用于生成完整的调试符号集 你的代码。链接器使用这个额外的 调试信息到死区 可执行文件。

    希望这会有所帮助。

    此答案中的所有内容都位于“apple ld static link unused symbols”的前几个 Google 搜索结果中。 :)

    【讨论】:

    • 感谢谷歌搜索。在 mac 上编译会产生“Mach-O”对象,而不是我相信与 --gc-sections 开关一起使用的 ELF。我尝试了-gfull 开关和-dead_strip 但无济于事。
    猜你喜欢
    • 1970-01-01
    • 2017-04-13
    • 2016-01-19
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 2019-09-14
    相关资源
    最近更新 更多