本文档是编译器和链接器选项的指南,有助于使用 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会产生对特定工具链供应商和版本的依赖。
详细点击标题