为什么要改变结构大小,改变可执行文件的大小?

时间:2013-01-16 19:48:39

标签: c linux size executable

非常奇怪的问题我正在努力调试,目前不知所措,所以我想看看是否有人有任何想法/想法。

我的代码库中的一个char驱动程序中有一个定义(这是uCLinux发行版中的众多驱动程序之一):

#define MAX_BUFSIZE 500

当我像这样构建时,我看到输出包大小:

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

当我将define更改为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工具链构建)。

1 个答案:

答案 0 :(得分:3)

如果结构的“实例”已声明为static,则会将其分配到二进制文件的.BSS段或.DATA段中,具体取决于是否是否初始化为0。如果是这种情况,由于您将数组的大小加倍,这将增加最终的二进制大小。