我们有一个非常大的 C++ 代码库,我们希望使用带有“FORTIFY_SOURCE=2”选项的 gcc 进行编译,以提高安全性并降低缓冲区溢出的风险。问题是当我们使用 FORTIFY_SOURCE 编译系统时,二进制大小急剧增加。(从总共 4GB 到超过 25GB)当我们需要部署代码时,这会导致问题,因为压缩和部署它需要 5 倍的时间。
为了弄清楚发生了什么,我制作了一个简单的测试程序,它使用strcpy
(其中一个函数 FORTIFY_SOURCE 应该在使用和不使用“FORTIFY_SOURCE”的情况下增强和编译它)执行一堆字符串副本。
#include <cstring>
#include <iostream>
using namespace std;
int main()
{
char buf1[100];
char buf2[100];
char buf3[100];
char buf4[100];
char buf5[100];
char buf6[100];
char buf7[100];
char buf8[100];
char buf9[100];
char buf10[100];
strcpy(buf1, "this is a string");
strcpy(buf2, "this is a string");
strcpy(buf3, "this is a string");
strcpy(buf4, "this is a string");
strcpy(buf5, "this is a string");
strcpy(buf6, "this is a string");
strcpy(buf7, "this is a string");
strcpy(buf8, "this is a string");
strcpy(buf9, "this is a string");
strcpy(buf10, "this is a string");
}
汇编:
g++ -o main -O3 fortify_test.cpp
和
g++ -o main -D_FORTIFY_SOURCE=2 -O3 fortify_test.cpp
我发现在一个简单的示例中使用“FORTIFY_SOURCE”对二进制大小没有明显影响(生成的二进制文件是 8.4K,有和没有加强源。)
当一个简单的例子没有明显的影响时,我不希望在更复杂的例子中看到如此急剧的大小增加。FORTIFY_SOURCE 可能会做些什么来大幅增加我们的二进制大小?