2012-07-26 58 views
10

Qual è la differenza tra la sezione .got e .got.plt in formato ELF?Qual è la differenza tra la sezione .got e .got.plt?

+0

Secondo: http://www.acsu.buffalo.edu/~charngda/elf.html 'voci .got' non vengono mai risolti pigramente, ma' voci .got.plt' possono essere risolti pigramente. – ninjalj

+6

Penso .got è per le delocalizzazioni in materia di 'variabili' globali, mentre .got.plt è una sezione ausiliaria di agire insieme con Plt durante la risoluzione delle procedure indirizzi assoluti. – JohnTortugo

risposta

10

mio commento precedente risulta essere di destra, l'esempio seguente rende le cose un po 'chiare.

Queste sono le delocalizzazioni per i miei 32 bit 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 

look che come avrete notato ci sono due sezioni di trasferimento, vale a dire .rel.dyn e .rel.plt. Si può vedere che tutti i trasferimenti per .rel.plt sono di tipo R_386_JUMP_SLOT il che significa che essi sono delocalizzazioni ramo d'altra parte quasi tutti i trasferimenti in .rel.dyn sono R_386_GLOB_DAT che significa delocalizzazione per le variabili globali.

Un'altra differenza sottile esistono tra .symtab e .dynsym. Mentre il primo contiene riferimenti per tutti i simboli utilizzati durante la modifica del collegamento statico, i successivi contengono solo i simboli necessari per il collegamento dinamico. Pertanto, le delocalizzazioni menzionate sopra si riferiscono solo alla sezione .dynsym.

Problemi correlati