.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セクションに配置されます。この時点で、彼らに住所が与えられます。