c - 为什么更改结构大小会更改可执行文件的大小?

标签 c linux size executable

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

我的代码库中的一个字符驱动程序中有一个定义(这是 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 工具链)。

最佳答案

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

关于c - 为什么更改结构大小会更改可执行文件的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14366582/

相关文章:

c++ - 空 OpenMP for 循环耗时 5 毫秒

c++ - Pthread 条件变量是连续轮询的替代品,是真的吗?

c - 这个指针代码在 64 位计算机上是否合法

hadoop - 检索使用hadoop distcp复制的数据的大小

c - 当我注释 malloc() 调用时,为什么会出现段错误(核心转储)?

linux - 从每一行的 CSV 文件中的几个单元格中替换部分 url

linux - 如何使用docker获取项目路径

linux - 我的用户拥有的目录中也有其他人拥有的目录

actionscript-3 - 在 AS3 (Action Script 3.0) 中查找(加载)图像大小

arrays - 来自 find 命令长度的 bash 数组