2017-04-20 118 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