2013-08-12 15 views
6

.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バイトですか?

+2

データ整列は、コンパイラの実装の詳細です。なぜこれは問題なのでしょうか?どのような問題を解決しようとしていますか? –

+0

@ lskアプリケーションの.bssセグメントのサイズを小さくしようとしているため、リソース制約ホスト上のメモリが少なくて済みます。グローバル空間で定義されている初期化されていないすべてのオブジェクトのサイズの合計に.bssが等しいと期待します。しかし、たとえ私がオブジェクトのサイズを8バイト減らしたとしても、.bssのサイズは縮小されません。シンボルテーブルは、オブジェクトサイズが8バイト減少したが、.bssサイズに変更はないことを示しています。このようなオブジェクトは10,000個ありますが、クラスのサイズを8バイト小さくすると、.bssに変更はありません。 –

答えて

0

これらの異なるアライメント値は、それぞれldスクリプトによって決定されたと思います。 a.outについてsection .data align=16, section .bss align=16

    • libmodel.soについて
    • section .data align=4, section .bss align=4
  • +0

    'libmodel.so'データの最後の列に 'Al 32'と明記されているので、指定された配置が16ではなく32として指定されているように見えます。 –

    +0

    libmodel.soの.dataセクションと.bssセクション32バイトに整列されています。データセクションの場合、アドレスは01e221e0であり、最後の5つのLSBビットがゼロに設定されていることを意味する。つまり、32バイトに整列します。 – gtv

    0

    なぜそれが時々4バイトであり、それ以外の32バイトで?

    実行ファイルがメモリにロードされると、プロセス仮想アドレスを介してアドレス指定されます。アラインメントの制約は、仮想アドレスのアドレッシングによるものです。たとえば、マニュアルページelfを見る場合は、sh_addralignの説明を参照してください。これは、異なるelfオブジェクトが異なるアラインメント要件を指定する理由です。 a.outのソースを変更してdouble型を含むようにし、アライメントが変更されているかどうかを確認することで試すことができます。

    メモ:これはメモリの配置にのみ適用されます。実際のディスク上のファイルにもアラインメントの制限があります。どうして?私はこれが、ファイルデータをin-core構造体にマッピングすることの容易さを助けることになると思っています。他の人は私がここで間違っていれば私を修正することができます。

    更新:1つの問題を明確にしますか?バーチャルアドレスアライメントは、チップセットによって実行される基本的なメモリアクセス細分性のためにのみ必要です。したがって、異なるアーキテクチャ用にコンパイルされた同じプログラムは、diffの配置制限につながる可能性があります。

    0

    あなたの質問だけでなく、それに関連するすべてをあなたに素晴らしい理解を与える本当に素晴らしい本があります。

    ブックのウェブサイトは、here

    章nです。 7があなたが探しているものです。

    私はあなたがまっすぐな答えかより洗練された答えをしたいのか分かりませんが、それが助けてくれることを願っています。

    0

    bssの場合、データ型のサイズを使用して配置が決定されます。整列されていない場合は、bssの開始位置にリンカーが最初に可変アドレスを配置します。

    関連する問題