5

より大きな問題を理解しようとしている間、私は少しテストを実行しています。これが私のテスト環境です:

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[];

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;
 }

そこで、これらのファイルを使用して3つのテストを実行し、取得したサイズを確認しました-

テスト#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

bssUNで初期化されたメモリです。したがって、格納する必要があるのは、各変数の開始アドレスとサイズだけです。そのため、実行可能ファイルのサイズはほんの数バイトしか増えませんでした。

余談ですが、初期化されたメモリ(dataセグメント)でさえ、実行可能イメージでは初期化された変数の合計サイズよりも小さい場合があります。
多くのリンカは、実行可能ファイルに初期化されたデータの完全なイメージを作成するのではなく、データを初期化する方法の説明を挿入します。したがって、実行した場合、実行可能ファイルchar buffer[500] = {1,1,1,1,1,1,1,...};data部分は概念的には次のようになります。

&TxBufx: fill with 500 1's

アドレスがセグメントの文字通りの始まりになることを除いて。ただし、グローバルを追加した場合unsigned char bytecode[500] = {0x12, 0x34, 0x55, ... }、ショートカットを使用できないため、データセグメントは少なくとも500バイト大きくなります。

于 2013-01-17T16:53:51.433 に答える