2017-04-20 120 views
7

抽象问题: 我在C中有一些代码。 编译完成后,可执行文件有604 KB。 我希望它更大,比方说100 MB。增加二进制可执行文件大小

如何实现这一目标?

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

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

使用案例: 我开发的固件,并检验远程固件升级功能。我想看看它在固件大而笨重时的表现如何。

+0

“scalable”是什么意思? –

+4

*“抽象问题”* - 不,你不能这么简单,我很好奇。你为什么真的在问? :) – StoryTeller

+0

就像'echo abcd >> myprogram.exe'一个选项? –

回答

13

这将创建时使用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

请注意,至少需要一个非零初始化程序,否则您将无法获得大的可执行文件。 – dbush

+0

很好。我试过了,但是我没有使用这个数组,所以它被优化了。 – mjjaniec

+0

@dbush我注意到了。这就是为什么我改用“a”。我最初用''\ 0''尝试过,并且感到惊讶的是可执行文件仍然很小。我不明白这是为什么。 –

8

GCC特定变种:

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

运用“拿来主义”,你不需要去触摸它了,以防止它被优化掉的属性。不过,必须像约翰科尔曼的解决方案那样应用一个非全空的初始化程序。

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" 
+0

不要过于严格,但问题是要求*“...不增加N字节的源代码。”*。这可行,但JohnColemans解决方案应该首先测试:许多嵌入式编译器不擅长优化初始化器列表。 – user694733

+0

@ user694733这是一个很好的观点,如果有问题的编译器没有优化初始化程序列表,那么其他方法之一就是最好的。如果情况并非如此,那么至少使用这种方法,您不需要手动创建大型源文件。 – dbush