2013-01-16 270 views
2

非常奇怪的問題我正在努力調試,目前處於虧損狀態,所以我想看看是否有人有任何想法/想法。爲什麼要更改結構大小,更改可執行文件的大小?

有在我的代碼庫的字符驅動的一個定義(這是一個發行版uCLinux中的許多因素之一):

#define MAX_BUFSIZE 500 

當我建立這樣的我看到的輸出包裝尺寸:

-rw-rw-r-- 1 mike users 1720620 Jan 16 11:00 gcl-kernel.pkg 

當我改變定義爲1000和重建:

#define MAX_BUFSIZE 1000 

-rw-rw-r-- 1 mike users 2359596 Jan 16 11:17 gcl-kernel.pkg 

過度所有內核映像大大增加。那一個#define只有變化。 AFAIK,這應該在運行時改變了可執行文件的RAM大小,它不應該對可執行文件的大小做任何事情。

所以我的問題:

任何人都可以想到的任何理由,被修改的結構會改變最終圖像的大小?


其他分析/信息,如果你關心:

我跟蹤的這種用法在頭文件中定義一個結構:

typedef struct { 
    int head; 
    int tail; 
    int status; 
    int active; 
    void * dev[MAX_BUFSIZE]; 
    char free[MAX_BUFSIZE]; 
    canmsg_t data[MAX_BUFSIZE]; 
    int count; 
} msg_fifo_t; 

每當我改變任何這些大小數組,可執行文件大小發生變化每當這種類型的新對象顯示出來,或在代碼被刪除可執行文件大小的變化,例如:

extern msg_fifo_t Tx_Bufx[]; 
extern msg_fifo_t Rx_Buf[]; 

有不同的輸出可執行文件的大小,則:

extern msg_fifo_t Tx_Bufx[]; 
//extern msg_fifo_t Rx_Buf[]; 

我試過,但我似乎無法在我的x86系統上創建此問題的較小版本來調試問題,它必須與環境有關。 (用於uCLinux 2.4內核的coldfire工具鏈構建)。

+4

你的環境是否有類似'.bss'的東西? – cnicutar

+2

您的鏈接器可能會生成一個映射文件。你可以用它來查看到底發生了什麼。 –

+0

也許編譯器優化?如果它是'gcc',請嘗試使用'-Os'flag編譯。 –

回答

3

如果該結構的「實例」已被聲明爲static,它將分配到二進制文件的.BSS段或.DATA段中,具體取決於它是否爲0初始化。如果是這種情況,由於您將數組的大小加倍,這會增加最終的二進制大小。

+0

這是一個很好的想法,我沒有在代碼中的任何地方看到任何'msg_fifo_t'的靜態實例,但它是一個很大的代碼庫......我會繼續尋找 – Mike

+0

@Mike:注意,這裏的靜態不僅意味着'靜態'關鍵字,但一般情況下是「靜態存儲時間」 - 即全局變量。 –