C 和 C++ 编译器选项强化指南

本文档是编译器和链接器选项的指南,有助于使用 C 和 C++ 的本机(或交叉)工具链提供可靠且安全的代码。编译器选项强化的目标是生成具有针对潜在攻击和/或不当行为的安全机制的应用程序二进制文件(可执行文件)。

强化的编译器选项还应该生成与现代操作系统 (OS) 中现有平台安全功能良好集成的应用程序。有效配置编译器选项在开发过程中也有很多好处,例如增强的编译器警告、静态分析和调试工具。

本文档适用于:

那些编写 C 或 C++ 代码的人,帮助他们确保生成的代码能够与强化选项一起工作,包括嵌入式设备、物联网设备、智能手机和个人电脑。 构建用于生产环境的 C 或 C++ 代码的人员,包括 Linux 发行版、设备制造商以及为本地环境编译 C 或 C++ 的人员。 本文档重点介绍 GNU 编译器集合 (GCC) 和 Clang/LLVM 的推荐选项,我们希望这些建议适用于基于 GCC 和 Clang 技术的其他编译器1。将来,我们的目标是扩展指南以涵盖其他编译器,例如 Microsoft MSVC。

1、我应该使用哪些编译器选项? 在 GCC 和 clang 等编译器上编译 C 或 C++ 代码时,打开这些标志以在编译时检测漏洞并启用运行时保护机制:

-O2 -Wall -Wformat=2 -Wconversion -Wtrampolines -Wimplicit-fallthrough \
-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=3 \
-D_GLIBCXX_ASSERTIONS \
-fstrict-flex-arrays=3 \
-fstack-clash-protection -fstack-protector-strong \
-Wl,-z,nodlopen -Wl,-z,noexecstack \
-Wl,-z,relro -Wl,-z,now

当编译代码时遇到下表中的任何一种情况,请添加相应的附加选项:

  • 对于可执行文件:-fPIE -pie
  • 对于共享库:-fPIC -shared
  • 对于 x86_64:-fcf-protection=full
  • 对于 aarch64:-mbranch-protection=standard

开发人员还应该使用-Werror,但建议在分发源代码时忽略它,因为-Werror会产生对特定工具链供应商和版本的依赖。

详细点击标题