哪些部分构成可执行文件的大小?

Mik*_*ike 5 c linux size gcc compilation

在尝试理解更大的问题时,我正在进行一些测试.这是我的测试环境:

head.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[];
Run Code Online (Sandbox Code Playgroud)

test.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;
 }
Run Code Online (Sandbox Code Playgroud)

所以我使用这些文件并运行了三个测试来查看我得到的尺寸 -

测试#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
Run Code Online (Sandbox Code Playgroud)

测试#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
Run Code Online (Sandbox Code Playgroud)

测试#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
Run Code Online (Sandbox Code Playgroud)

所以现在我的问题:

  • 似乎bss大小几乎不影响可执行文件的"大小"(从ls -al命令报告) - 任何人都可以向我解释为什么会这样吗?

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

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

jim*_*ise 6

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

这样的事情改变,因为你的代码的变化是尺寸data段-代表静态初始化为非零值的变量,以及大小code段,表示对应于你的程序编译后的可执行指令.

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