2

私がデバッグに取り組んでいる非常に奇妙な問題ですが、現在途方に暮れているので、誰かが何か考えやアイデアを持っているかどうかを確認したいと思いました。

私のコードベースのcharドライバーの1つに定義があります(これはuCLinuxディストリビューション内の多くのドライバーの1つです):

#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唯一の変更でした。ちなみに、これにより、実行時に実行可能ファイルのRAMサイズが変更されているはずです。実行可能ファイルのサイズに対しては、何も実行されていないはずです。

だから私の質問:

構造を変更すると最終的な画像サイズが変わる理由を誰かが考えることができますか?


気になる場合のその他の分析/情報:

これの使用状況を、ヘッダーファイルで定義された1つの構造に追跡しました。

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ツールチェーンの構築)。

4

1 に答える 1

3

構造体の「インスタンス」が として宣言されている場合、0 で初期化されたかどうかに応じて、バイナリの.BSSセグメントまたは.DATAstaticセグメントに割り当てられます。この場合、配列のサイズを 2 倍にしているため、最終的なバイナリ サイズが増加します。

于 2013-01-16T19:57:22.453 に答える