私の最後の質問.local
に基づいて、.comm
ディレクティブがどのように正確に機能するか、特にそれらがCのリンケージと期間にどのように影響するかを理解しようとしています。
だから私は次の実験を実行しました:
static int value;
これにより、次のアセンブリコードが生成されます(gccを使用)。
.local value
.comm value,4,4
ゼロに初期化すると、同じアセンブリコードが生成されます(gccを使用)。
.local value
.comm value,4,4
どちらの場合も、変数がbssセグメントに格納されることを期待しているため、これは論理的に聞こえます。さらに、を使用して調査した後、すべての変数が実際にbssセグメントに配置されているld --verbose
ように見えます。.comm
.bss :
{
*(.dynbss)
*(.bss .bss.* .gnu.linkonce.b.*)
*(COMMON)
// ...
}
ただし、変数をゼロ以外の値に初期化すると、コンパイラーはデータセグメント内の変数を予想どおりに定義しますが、次の出力を生成します。
.data
.align 4
.type value, @object
.size value, 4
value:
.long 1
以前に理解したさまざまなセグメント(それぞれbssとdata)に加えて、私の変数は最初の例では定義されていますが.local
、.comm
2番目の例では定義されていません。それぞれのケースから生成された2つの出力の違いを誰かが説明できますか?