В чем разница между .got и .got.plt в формате ELF?
В чем разница между разделом .got и .got.plt?
Ответ 1
Мой предыдущий комментарий становится правильным, приведенный ниже пример немного упрощает.
Это перестановки для моих 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.