2012-07-26 31 views
10

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

+0

によると:http://www.acsu.buffalo.edu/~charngda/e​​lf.html '.got'エントリは遅延解決されませんが、' .got.plt'エントリは遅れて解決できます。 – ninjalj

+6

私は、.gotはグローバル変数に関する再配置ですが、.got.pltはプロシージャの絶対アドレスを解決するときに.pltと共に動作する補助セクションです。 – JohnTortugo

答えて

10

私の前のコメントは正しいと言えますが、下の例は少しはっきりしています。

これらは

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 

/lib/libm.so私の32ビットのi686-linuxのために再配置されている、あなたが述べたように、すなわち.rel.dynと.rel.plt 2の再配置セクションが存在することを確認してください。 .rel.pltのすべての再配置は、R_386_JUMP_SLOTタイプであることが分かります。つまり、それらはブランチ再配置です.rel.dynのほとんどすべての再配置は、グローバル変数の再配置を意味するR_386_GLOB_DATです。

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

関連する問題