10
ELF格式中.got和.got.plt節之間的區別是什麼?.got和.got.plt節之間的區別是什麼?
ELF格式中.got和.got.plt節之間的區別是什麼?.got和.got.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。您可以看到,.rel.plt的所有重定位都是R_386_JUMP_SLOT類型,這意味着它們是分支重定位,而.rel.dyn中的幾乎所有重定位都是R_386_GLOB_DAT,這意味着對全局變量進行重定位。
.symtab和.dynsym之間存在另一個細微差別。雖然第一個包含靜態鏈接編輯期間使用的所有符號的引用,但後者僅包含動態鏈接所需的符號。因此,上面提到的重定位只涉及.dynsym部分。
根據:http://www.acsu.buffalo.edu/~charngda/elf.html'.got'條目不會被懶散地解析,但'.got.plt'條目可以被懶惰地解析。 – ninjalj 2012-07-26 22:58:57
我認爲.got是關於全局'變量'的重定位,而.got.plt是解析過程絕對地址時與.plt一起執行的輔助部分。 – JohnTortugo 2012-08-27 00:47:12