1

この質問が些細すぎる場合は、ご容赦ください。最終的な実行可能ファイルは、イメージ内の初期化されていないデータにスペースを割り当てないことが知られています。しかし、知りたいのですが、.bss を含むシンボルへの参照はどのように解決されますか?

オブジェクト ファイルには、.bss のこれらの変数のアドレスだけが含まれており、それらにスペースを割り当てていませんか? もしそうなら、これらの解決されたアドレスはどこに保存されていますか?

たとえば。Cモジュールに次のようなグローバル変数がある場合-

int x[10]; char chArray[100];

上記の変数のスペースは画像に存在しない場合がありますが、どのようにそれらを参照しますか? それらのアドレスはどこで解決されますか?

前もって感謝します!/MS

4

1 に答える 1

2

.bssシンボルは、コンパイラ(またはアセンブラ)が生成する他のシンボルと同じように解決されます。通常、これは関連するシンボルを「セクション」に配置することで機能します。たとえば、コンパイラは、プログラムコードを「.text」というセクションに配置し(歴史的な理由から;-)、初期化されたデータを「.data」というセクションに配置し、単一化されたデータを「。」。bss」というセクションに配置します。

例えば:

int i = 4;
int x[10];
char chArray[100];

int main(int argc, char**argv)
{
}

生成します(gcc -Sを使用):

    .file   "test.c"
.globl i
    .data
    .align 4
    .type   i, @object
    .size   i, 4
i:
    .long   4
    .text
.globl main
    .type   main, @function
main:
    leal    4(%esp), %ecx
    andl    $-16, %esp
    pushl   -4(%ecx)
    pushl   %ebp
    movl    %esp, %ebp
    pushl   %ecx
    subl    $4, %esp
    addl    $4, %esp
    popl    %ecx
    popl    %ebp
    leal    -4(%ecx), %esp
    ret
    .size   main, .-main
    .comm   x,40,32
    .comm   chArray,100,32
    .ident  "GCC: (GNU) 4.3.2 20081105 (Red Hat 4.3.2-7)"
    .section        .note.GNU-stack,"",@progbits

.dataディレクティブは、データセクションにiを配置するようにアセンブラに指示し、「。long4」はそれに初期値を与えます。ファイルがアセンブルされると、iはデータセクションのオフセット0で定義されます。

.textディレクティブは、メインを.textセクションに配置し、オフセットをゼロにします。

この例の興味深い点は、xとchArrayが.bssに直接配置されるのではなく、.commディレクティブを使用して定義されることです。どちらもサイズのみが指定されており、オフセットは指定されていません(まだ)。

リンカがオブジェクトファイルを取得すると、同じ名前のすべてのセクションを組み合わせ、それに応じてシンボルオフセットを調整することにより、オブジェクトファイルをリンクします。また、各セクションにロードする必要のある絶対アドレスを指定します。

.commディレクティブで定義されたシンボルは結合され(同じ名前の定義が複数存在する場合)、.bssセクションに配置されます。この時点で、彼らに住所が与えられます。

于 2009-12-27T15:40:06.813 に答える