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

C 为什么要改变结构大小,改变可执行文件的大小?,c,linux,size,executable,C,Linux,Size,Executable,我正在调试一个非常奇怪的问题,目前处于茫然状态,所以我想看看是否有人有任何想法/想法 在我的代码库中的一个char驱动程序中有一个define(这是uCLinux发行版中许多驱动程序之一): 当我这样构建时,我会看到输出包的大小: -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 2

我正在调试一个非常奇怪的问题,目前处于茫然状态,所以我想看看是否有人有任何想法/想法

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

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

-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
整个内核映像大大增加。那一个定义是唯一的改变。好吧,这应该在运行时改变了可执行文件的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工具链构建)。

如果该结构的“实例”已声明为
静态
,则它将被分配到二进制文件的段或段中,具体取决于它是否初始化为0。如果是这种情况,由于将数组的大小增加了一倍,这将增加最终的二进制大小。

您的环境是否有类似于
.bss
?您的链接器可能会生成一个映射文件。你可以用它来看看到底发生了什么。也许是编译器优化?如果是
gcc
,请尝试使用
-Os
标志进行编译。为了在链接时解析
extern msg\u fifo\u t Tx\u Bufx
,需要声明
msg\u fifo\u t Tx\u Bufx
,而不使用extern,即在全局上下文中。这是使用额外内存的部分:编译器为静态和全局准备一个内存段,因此它与
MAX\u BUFSIZE
@cnicutar的值一起增长和收缩-好问题。。。目前还不确定,但我会研究它(
/usr/bin/size
在输出上显示为“无法识别文件格式”,因此我需要找出如何检查它)这是一个好主意,我在代码中的任何地方都没有看到任何
msg\u fifo\u t
的静态实例,但它是一个很大的代码库。。。我会继续looking@Mike:注意,这里static不仅指
static
关键字,而且通常指“静态存储持续时间”-即也指全局。
extern msg_fifo_t Tx_Bufx[];
//extern msg_fifo_t Rx_Buf[];