5

我在尝试理解一个更大的问题时正在运行一个小测试。这是我的测试环境:

头.h

#define MAX_BUFSIZE 500

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

extern msg_fifo_t TxBufx[];
extern msg_fifo_t Rx_Buf[];

测试.c

#include <stdio.h>
#include "head.h"

//msg_fifo_t TxBufx[10];  // This is the important line

int main(int argc, char * argv[])
{
    // This part isn't really important...
    printf("Hello Test\n");

    return 0;
 }

所以我使用了这些文件并运行了三个测试,看看我得到了什么大小 -

测试#1(代码如上):

> gcc -Os test.c
> ls -al a.out
-rwxrwxr-x 1 mike mike 7158 Jan 17 11:13 a.out
> size a.out
text   data     bss     dec    hex   filename
1170    256       8    1434    59a   a.out

测试#2(取消注释“重要”行):

> gcc -Os test.c
> ls -al a.out
-rwxrwxr-x 1 mike mike 7181 Jan 17 11:14 a.out
> size a.out
text   data     bss     dec    hex   filename
1170    256   25208   26634   680a   a.out

测试#3(取消注释“重要”行并将TxBufx大小更改为 100)

> gcc -Os test.c
> ls -al a.out
-rwxrwxr-x 1 mike mike 7181 Jan 17 11:14 a.out
> size a.out
text   data     bss     dec    hex   filename
1170    256  252008  253434  3ddfa   a.out

所以现在我的问题:

  • 看起来 bss 大小几乎与可执行文件的“大小”无关(如ls -al命令所报告的那样) - 谁能向我解释为什么会这样?

  • 该特征是否特定于编译器/链接器/或平台?

  • 有没有比size了解这里发生的事情更好的工具?(意思是什么真正构成了我的可执行文件的 7181 个字节?)

4

2 回答 2

6

段中的数据量对bss可执行文件的磁盘大小没有影响,因为bss段是什么——这是程序中用于变量初始化为零的部分。由于这部分的内容是预先知道的(全为零),因此实际存储在可执行文件中的唯一内容就是该区域的大小

因此,随着代码的更改,确实会data发生变化的是段的大小——代表静态初始化为非零值的变量,以及code段的大小,代表与你的程序相对应的编译可执行指令。

至于要使用的工具,大多数 Unix 系统上的 objdump(1) 实用程序(它是 GNU 工具链的一部分)或 MacOS X 上的 otool(1) 实用程序都可用于获取有关哪些部分构成可执行文件的更详细信息,以及每个符号中的符号。

于 2013-01-17T16:58:38.803 回答
3

bss是未初始化的内存。所以它唯一需要存储的是每个变量的起始地址和大小。这就是为什么可执行文件大小只增加了几个字节的原因。

顺便说一句,即使是初始化的内存——data段——在可执行映像中也可以小于初始化变量的总大小。
许多链接器不是在可执行文件中创建初始化数据的完整映像,而是插入有关如何初始化它的指令。因此,如果您这样做了char buffer[500] = {1,1,1,1,1,1,1,...};data那么可执行文件的部分在概念上将类似于

&TxBufx: fill with 500 1's

除了地址将是段的文字开始。但是,如果您添加了 global unsigned char bytecode[500] = {0x12, 0x34, 0x55, ... },那么您的数据段将至少大 500 字节,因为它不能采用任何快捷方式。

于 2013-01-17T16:53:51.433 回答