我正在使用apple gcc编译一个我要重新分发的dylib.出于各种原因,我正在使用一些库,让我们说libz
保持简单.
由于此库通常不在Mac系统上找到,因此我希望通过将路径传递到简化部署来将已使用符号中的静态链接到dylib中.a-file
.
现在,链接器将lib 中的所有符号链接到生成的dylib中,尽管我只引用了一个子集.在linux上我从未遇到过这个问题,链接器很高兴丢弃所有未引用的符号并创建一个非常纤薄的可执行文件,所以它应该是可能的.我现在拥有的dylib文件比它应该大10倍.
我已尝试使用-dead_code链接器标记,但无济于事.也许我只是不明白吗?
有谁知道这个解决方案?
关于-dead_strip
(你可能意味着什么-dead_code
):
在打开-dead_strip选项之前,首先必须"移植"项目以使用死代码剥离.这将包括从-gused(-g的默认值)更改为-gfull,并使用Mac OS X June 2004发行版中的新编译器重新编译链接到程序中的所有对象文件.此外,如果您构建一个可执行文件来加载使用可执行文件中的符号的插件,则必须确保插件使用的符号不会被剥离(通过使用 attribute((used))或-exported_symbols_list选项).如果您正在使用导出列表并构建共享库,或者将与ld(1)的-bundle_loader标志一起使用的可执行文件,则需要在导出的C++符号的导出列表中包含异常帧信息的符号.这些符号以.eh结尾,可以使用nm(1)工具查看.
并且:
要从命令行启用死代码剥离,请将-dead_strip选项传递给ld.您还应该将-gfull选项传递给GCC,以便为您的代码生成一组完整的调试符号.链接器使用这些额外的调试信息来删除可执行文件.
希望这可以帮助.
此答案中的所有内容都位于"Apple ld static link unused symbols"的前几个Google搜索结果中.:)