链接静态库时,避免链接未使用的符号

时间:2011-04-08 07:25:34

标签: c++ linker darwin

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

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

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

我尝试过使用-dead_code链接器标记,但无济于事。也许我只是不理解它?

有人知道解决方法吗?

1 个答案:

答案 0 :(得分:5)

Try -Wl,--gc-sections

关于-dead_strip-dead_code的意思):

  

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

and

  

启用死区代码剥离   命令行,传递-dead_strip   ld的选项。你也应该通过   -gfull选项为GCC生成一组完整的调试符号   你的代码。链接器使用此额外的   调试信息到死区   可执行文件。

希望这有帮助。

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

相关问题