3

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

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

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

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

有谁知道这个问题的解决方案?

4

1 回答 1

5

试试-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) 工具查看。

要从命令行启用死代码剥离,请将 -dead_strip 选项传递给 ld。您还应该将 -gfull 选项传递给 GCC,以便为您的代码生成一套完整的调试符号。链接器使用这些额外的调试信息来删除可执行文件。

希望这可以帮助。

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

于 2011-04-08T09:06:42.107 回答