2013-01-16 272 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:注意,这里的静态不仅意味着'静态'关键字,但一般情况下是“静态存储时间” - 即全局变量。 –