अंत में मैं यह फटा!
नहीं है, यह संभव नहीं है गैर GOT प्रकार स्थानांतरण के साथ उत्पादन के लिए जीसीसी प्रतिबंधित करने के लिए है।
अब जीओटी प्रकार स्थानांतरण कैसे हल करें?
GOT तय 128KB स्मृति हिस्सा (यह लिखने पर प्रतिलिपि के सिद्धांत पर काम करता है) गतिशील लिंकर जो स्थानांतरण के लिए प्रविष्टियों शामिल द्वारा आवंटित की है।
गतिशील लिंकर केवल तब ही आवंटित करता है जब ईएलएफ बाइनरी में किसी भी प्रकार का (नीचे सूचीबद्ध) जीओटी स्थानांतरण हो।
R_386_GOTOFF(== 0x9)
यह स्थानांतरण प्रकार एक प्रतीक के मूल्य और वैश्विक ऑफसेट तालिका के पते के बीच अंतर की गणना करता है। यह वैश्विक ऑफसेट टेबल बनाने के लिए लिंक-एडिटर भी निर्देशित करता है।
R_386_GOTPC(== 0xA)
यह स्थान परिवर्तन प्रकार, जैसा दिखता है R_386_PC32 को छोड़कर वह अपने गणना में वैश्विक ऑफसेट तालिका के पते का उपयोग करता।
उन्हें कैसे लागू करने के लिए?
नोट: निम्न कोड-टुकड़ा Atom OS स्रोत कोड जो बंद स्रोत लाइसेंस द्वारा संरक्षित के अंतर्गत आता है। -fPIE या -fpie जो GOT अक्षम कर सकते हैं: लेकिन मैं (एटम डेवलपर) इसके द्वारा इस कोड का उपयोग :)
uint GOT = Heap.kmalloc(1024 * 128); // 128 KB
...
private static void Relocate(Elf_Header* aHeader, Elf_Shdr* aShdr, uint GOT)
{
uint BaseAddress = (uint)aHeader;
Elf32_Rel* Reloc = (Elf32_Rel*)aShdr->sh_addr;
Elf_Shdr* TargetSection = (Elf_Shdr*)(BaseAddress + aHeader->e_shoff) + aShdr->sh_info;
uint RelocCount = aShdr->sh_size/aShdr->sh_entsize;
uint SymIdx, SymVal, RelocType;
for (int i = 0; i < RelocCount; i++, Reloc++)
{
SymVal = 0;
SymIdx = (Reloc->r_info >> 8);
RelocType = Reloc->r_info & 0xFF;
if (SymIdx != SHN_UNDEF)
{
if (RelocType == R_386_GOTPC)
SymVal = GOT;
else
SymVal = GetSymValue(aHeader, TargetSection->sh_link, SymIdx);
}
uint* add_ref = (uint*)(TargetSection->sh_addr + Reloc->r_offset);
switch(RelocType)
{
case R_386_32:
*add_ref = SymVal + *add_ref; // S + A
break;
case R_386_GOTOFF:
*add_ref = SymVal + *add_ref - GOT; // S + A - GOT
break;
case R_386_PLT32: // L + A - P
case R_386_PC32: // S + A - P
case R_386_GOTPC: // GOT + A - P
*add_ref = SymVal + *add_ref - (uint)add_ref;
break;
default:
throw new Exception("[ELF]: Unsupported Relocation type");
}
}
}
यह एक वैध सवाल है। हालांकि, यदि आप अपना खुद का गतिशील लिंकर लिख रहे हैं, तो आपको पूरे ईएलएफ विनिर्देश को बेहतर ढंग से पढ़ना चाहिए और उचित जीओटी स्थानांतरण लागू करना चाहिए। – 3442
@ केमीलैंड मैं सहमत हूं, लेकिन अभी के लिए मैं समय की बाधा के कारण सीमित कार्यान्वयन करना चाहता हूं। – amaneureka
नीट, यह वही है जो मुझे अपने खिलौने ओएस – minexew