我的项目大量使用模板元编程。大多数操作发生在递归模板内,这些模板生成具有非常长(损坏的)符号名称的对象和函数。
尽管构建时间只有约 30 秒,但生成的可执行文件大约有 1 兆字节,而且主要是符号名称。
在 Linux 上,向 GCC 添加一个 -s
参数可以将大小降低到 ~300 KiB,但是使用文本编辑器快速查看一下就会发现其中仍然有很多繁琐的名称。我找不到如何在 OS X 上正确剥离任何东西……现在就把它写下来。
我怀疑用于提供 typeid(x).name()
的 vtable 条目占用了很大一部分。删除对 typeid
运算符的所有使用不会导致在 Linux 上删除更多内容。我认为默认的异常处理程序使用该工具来报告未捕获异常的类型。
我如何最大化剥离并最小化我的可执行文件中的这些千字节大小的符号?
最佳答案
只需在最终的可执行文件上运行程序strip
。如果你想更高级一点,你可以使用一些其他工具来单独存储调试信息,但为了你的目的,只需 strip a.out
就可以了。也许使用 --strip-all
选项——我自己还没有尝试过,看看它是否与默认行为不同。
如果您真的想尝试禁用 RTTI,那就是 gcc -fno-rtti
。但这可能会严重破坏您的程序——我猜这只是一种找出答案的方法。
关于c++ - 从 GCC 可执行文件中剥离符号和 RTTI 文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19426918/