增加二进制可执行文件大小

时间:2017-04-20 13:16:22

标签: c

抽象问题: 我在C中有一些代码 编译后,可执行文件有604 KB。 我希望它更大,让我们说100 MB。

如何实现这一目标?

我可以声明一个字符串来增加二进制文件大小,但是还有更多可扩展的解决方案。那就是我想将编译大小增加N个字节而不增加N个字节的源代码。

 char* filler = "filler"; // increases compiled size only by few bytes

用例: 我正在开发固件,并测试远程固件升级功能。我想看看当固件大而重时它会如何表现。

3 个答案:

答案 0 :(得分:14)

使用gcc编译时,这会创建一个100MB的可执行文件:

#include <stdio.h>
#define SIZE 100000000

char dummy[SIZE] = {'a'};

int main(void){
    dummy[SIZE-1] = '\n';
    if(dummy[0] == 'a')printf("Hello, bloated world");
    return 0;
}

通过在main之外定义数组,你不会炸掉堆栈。通过使用数组,gcc不会优化它。

答案 1 :(得分:8)

GCC特定变体:

char dummy[100*1024*1024] __attribute__((used)) = { 77 };

应用“已使用”属性,您无需再触摸它以防止其被优化掉。尽管如此,必须像John Coleman的解决方案一样应用非全零的初始化器。

答案 2 :(得分:1)

您需要创建一个全局数组,其中所有元素都已显式初始化。元素应该是随机的,否则编译器可能会优化编译代码中的初始化列表。

首先需要一个单独的程序来生成数组:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    int len = 100000000;
    int i;
    srand(getpid());
    printf("unsigned char buf[%d] = {\n", len);
    for (i=0;i<len;i++) {
        printf(" %hhu,", rand() & 0xff);
        if (i%16==15) printf("\n");
    }
    printf("};\n\n");
    return 0;
}

运行此命令并将输出重定向到文件:

./array_generator > array.c

然后你将得到array.c,它看起来像这样:

unsigned char buf[1000000] = { 
247, 223, 30, 51, 46, 247, 133, 136, 254, 225, 82, 135, 68, 176, 240, 7,
29, 245, 104, 203, 230, 83, 127, 189, 37, 5, 168, 105, 134, 9, 229, 125,
232, 3, 176, 23, 251, 53, 159, 249, 22, 241, 128, 90, 161, 112, 97, 191,
101, 202, 138, 75, 29, 10, 9, 66, 15, 177, 171, 149, 186, 145, 18, 163,
...
};

然后将其包含在主要来源中:

#include  "array.c"