2012-07-26 35 views
10

ईएलएफ प्रारूप में .got और .got.plt अनुभाग के बीच क्या अंतर है?.got और .got.plt सेक्शन में क्या अंतर है?

+0

के मुताबिक: http://www.acsu.buffalo.edu/~charngda/elf.html '.got' प्रविष्टियों को आलसी ढंग से हल नहीं किया जाता है, लेकिन '.got.plt' प्रविष्टियों को आलसी हल किया जा सकता है। – ninjalj

+6

मुझे लगता है कि .got वैश्विक 'चर' के संबंध में स्थानांतरित करने के लिए है .got.plt प्रक्रियाओं को पूर्ण पते को हल करते समय .plt के साथ मिलकर कार्य करने के लिए एक सहायक अनुभाग है। – JohnTortugo

उत्तर

10

मेरी पिछली टिप्पणी सही हो गई है, नीचे दिया गया उदाहरण चीजों को थोड़ा स्पष्ट करता है।

ये है कि जैसा कि आप ने बताया कि दो स्थानांतरण वर्गों, अर्थात् .rel.dyn और .rel.plt हैं /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 

देखो मेरी 32 बिट i686-linux के लिए relocations हैं। आप देख सकते हैं कि .rel.plt के लिए सभी स्थानान्तरण R_386_JUMP_SLOT प्रकार हैं जिसका अर्थ है कि वे दूसरी ओर शाखा स्थानान्तरण हैं .rel.dyn में लगभग सभी स्थानान्तरण R_386_GLOB_DAT हैं जिसका अर्थ वैश्विक चर के लिए स्थानान्तरण है।

.symtab और .dynsym के बीच एक और सूक्ष्म अंतर मौजूद है। जबकि पहले स्थिर लिंक संपादन के दौरान उपयोग किए गए सभी प्रतीकों के संदर्भ में बाद में केवल गतिशील लिंकिंग के लिए आवश्यक प्रतीकों को शामिल किया गया है। इस प्रकार, ऊपर वर्णित स्थानान्तरण केवल .dynsym खंड को संदर्भित करता है।