2017-11-08 6 views
1

私はここに簡単な質問を持っているシンプルなCプログラム(gcc -o file file.cpp)をコンパイルしobjdump -h fileを実行するには、次の出力が得られ、.textデータセグメントと.finiデータセグメントの間に空白がありますか?

12 .text   00000172 0000000000400400 0000000000400400 00000400 2**4 
        CONTENTS, ALLOC, LOAD, READONLY, CODE 
13 .fini   00000009 0000000000400574 0000000000400574 00000574 2**2 
        CONTENTS, ALLOC, LOAD, READONLY, CODE 

.textセクションの後に2バイトのギャップがあるのはなぜですか? 0x400400 + 0x172 = 0x400572ですが、.finiセクションは0x400574から始まりますか?これはアラインメントと関係がありますか?他のセクションと同様のギャップがあることに気付きました。

+3

おそらくアラインメント。しかし、なぜあなたは尋ねますか?好奇心?あるいは、この質問につながる別の問題がありますか? –

+0

仮想アドレス空間 – martianwars

+0

の '.text'セグメントの範囲を特定する方法を見つけようとすると、おそらくあなたのリンカスクリプトに次のようなものがあります:'。 = ALIGN(4); ' –

答えて

2

objdump -h fileの出力の最後の列は、セクションの配置です。 .finiのアラインメントは42**2は2の2の累乗)です。その理由は0x400572の代わりに0x400574で始まります。

x86-64のためのglibcに対してリンクする場合、.finiセクションの4のアライメントがcrti.oで指定されている:

.section .fini,"ax",@progbits 
    .p2align 2 
    .globl _fini 
    .type _fini, @function 
_fini: 
関連する問題