2012-07-26 170 views
10

ELF格式中.got和.got.plt节之间的区别是什么?.got和.got.plt节之间的区别是什么?

+0

根据:http://www.acsu.buffalo.edu/~charngda/e​​lf.html'.got'条目不会被懒散地解析,但'.got.plt'条目可以被懒惰地解析。 – ninjalj 2012-07-26 22:58:57

+6

我认为.got是关于全局'变量'的重定位,而.got.plt是解析过程绝对地址时与.plt一起执行的辅助部分。 – JohnTortugo 2012-08-27 00:47:12

回答

10

我以前的评论变得很正确,下面的例子说明了一点。

这些是我的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部分。

相关问题