从 GCC 可执行文件中删除符号和 RTTI 文本

Strip symbols and RTTI text from GCC executable

本文关键字:RTTI 文本 符号 删除 GCC 可执行文件      更新时间:2023-10-16

我的项目大量使用模板元编程。大多数操作发生在递归模板中,这些模板生成具有很长(损坏)符号名称的对象和函数。

尽管构建时间仅为 ~30 秒,但生成的可执行文件约为 MB 大小,而且主要是符号名称。

在 Linux 上,向 GCC 添加-s参数会使大小减小到 ~300 KiB,但使用文本编辑器快速浏览一下就会发现那里仍然有很多繁琐的名称。我找不到如何在OS X上正确剥离任何内容...暂时将其注销。

我怀疑用于提供typeid(x).name()的 vtable 条目占用了很大一部分。删除typeid运算符的所有使用并没有导致Linux上更多的剥离。我认为默认异常处理程序使用该工具来报告未捕获的异常的类型。

如何在可执行文件中最大化条带页并最小化这些千字节大小的符号?

只需在最终可执行文件上运行程序strip即可。 如果你想更高级,你可以使用其他一些工具来单独存储调试信息,但对于你所说的目的,只要strip a.out就可以了。 也许使用 --strip-all 选项 - 我自己还没有尝试过,看看它是否与默认行为不同。

如果您真的想尝试禁用RTTI,那么gcc -fno-rtti 。 但这可能会严重破坏你的程序 - 我想只有一种方法可以找出答案。