.dataと.bssのアライメントは4バイトになることもありますが、時には32バイトになることもあります。 例1:以下の出力の最後の列1としてBSSとデータのアラインメントは32バイト.dataと.bssのアライメントはどのように決定されるのですか
bash-3.00$ readelf --sections libmodel.so
There are 39 section headers, starting at offset 0x1908a63c:
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
...
[25] .data PROGBITS 01e221e0 1e211e0 26ca54 00 WA 0 0 32
[26] .bss NOBITS 0208ec40 208dc34 374178 00 WA 0 0 32
...
例2:アライメントOSの.DATAと.bssの4バイト
で次の出力を1としてbash-3.00$ readelf --sections ./a.out
There are 28 section headers, starting at offset 0x78c:
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
...
[22] .data PROGBITS 0804956c 00056c 000034 00 WA 0 0 4
[23] .bss NOBITS 080495a0 0005a0 000004 00 WA 0 0 4
...
.bssと.dataの配置を決定する要因は何ですか?なぜ時々4バイトで、他の時は32バイトですか?
データ整列は、コンパイラの実装の詳細です。なぜこれは問題なのでしょうか?どのような問題を解決しようとしていますか? –
@ lskアプリケーションの.bssセグメントのサイズを小さくしようとしているため、リソース制約ホスト上のメモリが少なくて済みます。グローバル空間で定義されている初期化されていないすべてのオブジェクトのサイズの合計に.bssが等しいと期待します。しかし、たとえ私がオブジェクトのサイズを8バイト減らしたとしても、.bssのサイズは縮小されません。シンボルテーブルは、オブジェクトサイズが8バイト減少したが、.bssサイズに変更はないことを示しています。このようなオブジェクトは10,000個ありますが、クラスのサイズを8バイト小さくすると、.bssに変更はありません。 –