24

ELF形式の.gotセクションと.got.pltセクションの違いは何ですか?

4

1 に答える 1

19

私の以前のコメントは正しいものになります:

.gotグローバルな「変数」に関する再配置用であると思いますが、プロシージャの絶対アドレスを解決するときに.got.plt一緒に機能する補助セクションです。.plt

以下の例は、物事を少し明確にします。

これらは、私の 32 ビット i686-linux /lib/libm.so の再配置です。

Relocation section '.rel.dyn' at offset 0x32b8 contains 8 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
00025030  00000008 R_386_RELATIVE   
00024fd8  00005706 R_386_GLOB_DAT    00025034   _LIB_VERSION
00024fdc  00000406 R_386_GLOB_DAT    00000000   __gmon_start__
00024fe0  00000506 R_386_GLOB_DAT    00000000   _Jv_RegisterClasses
00024fe4  00000806 R_386_GLOB_DAT    00000000   _rtld_global_ro
00024fe8  00000906 R_386_GLOB_DAT    00000000   stderr
00024fec  00013006 R_386_GLOB_DAT    0002507c   signgam
00024ff0  00000e06 R_386_GLOB_DAT    00000000   __cxa_finalize

Relocation section '.rel.plt' at offset 0x32f8 contains 12 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
00025000  00000107 R_386_JUMP_SLOT   00000000   fputs
00025004  00000207 R_386_JUMP_SLOT   00000000   __errno_location
00025008  00000307 R_386_JUMP_SLOT   00000000   sprintf
0002500c  00000407 R_386_JUMP_SLOT   00000000   __gmon_start__
00025010  00000607 R_386_JUMP_SLOT   00000000   strtod
00025014  00000707 R_386_JUMP_SLOT   00000000   __assert_fail
00025018  00000a07 R_386_JUMP_SLOT   00000000   strlen
0002501c  00000b07 R_386_JUMP_SLOT   00000000   strtof
00025020  00000c07 R_386_JUMP_SLOT   00000000   fwrite
00025024  00000d07 R_386_JUMP_SLOT   00000000   strtold
00025028  00005e07 R_386_JUMP_SLOT   00005970   matherr
0002502c  00000e07 R_386_JUMP_SLOT   00000000   __cxa_finalize

ご指摘のとおり、.rel.dyn と .rel.plt という 2 つの再配置セクションがあることに注意してください。.rel.plt のすべての再配置は R_386_JUMP_SLOT 型であることがわかります。これは、それらがブランチの再配置であることを意味しますが、.rel.dyn のほとんどすべての再配置は、グローバル変数の再配置を意味する R_386_GLOB_DAT です。

.symtab と .dynsym の間には、もう 1 つの微妙な違いがあります。前者には静的リンク編集中に使用されるすべてのシンボルの参照が含まれていますが、後者には動的リンクに必要なシンボルのみが含まれています。したがって、上記の再配置は .dynsym セクションのみを参照します。

于 2012-09-26T18:33:03.103 に答える