如何在Xcode中剥离C++生产Release二进制文件的函数名?
解决Xcode编译C++ Release版本无法剥离函数名的问题
你遇到的问题核心在于:Strip Debug Symbols During Copy仅处理.dSYM中的调试符号,而C++函数名存放在二进制的**符号表(symbol table)**中,需要针对性设置来剥离:
1. 调整Xcode Build Settings
Strip Style:将默认的Debugging Symbols改为All Symbols,该选项会让Xcode剥离所有符号(包括函数名符号),而非仅调试符号。Symbols Hidden by Default:设置为YES,编译器会默认隐藏所有C++符号,仅保留你通过__attribute__((visibility("default")))显式标记需要导出的符号。Deployment Postprocessing:确保设置为YES,触发Xcode在构建完成后执行符号剥离的后续处理。Dead Code Stripping:保持YES(Release默认已开启),自动移除未被调用的代码及对应符号。
2. 手动用strip命令强化处理
如果Xcode设置后仍有残留,可直接用系统自带的strip命令处理二进制:
strip -x -S /path/to/your/MyApp
-x:移除所有非全局(外部可见)的符号,剥离大部分内部函数名-S:移除调试符号(和Strip Debug Symbols During Copy作用一致)
若二进制无动态依赖、无需对外暴露接口,可使用更彻底的剥离命令:
strip -all /path/to/your/MyApp
注意:依赖动态库或需对外提供接口的二进制,不要用-all,避免程序无法运行。
3. 确认C++编译参数
检查Xcode的Other C++ Flags,确保添加了-fvisibility=hidden,这是Symbols Hidden by Default对应的底层编译选项,确保C++符号默认被隐藏。
内容的提问来源于stack exchange,提问作者c00000fd
相关产品推荐
相关产品推荐

