2013-10-15 6 views
6

जीसीसी लिंकर के माध्यम से जेनरेट की गई हमारी ईएलएफ फाइलों में ईएलएफ फ़ाइल का शीर्ष हमेशा निष्पादन योग्य कोड का संस्करण पहचानकर्ता होता है।ईएलएफ फ़ाइल के शीर्ष पर एक प्रतीक को मजबूर करना

यह संस्करण.c फ़ाइल बनाकर और परिणामी ऑब्जेक्ट को लिंक कमांड में पहली लिंक करने योग्य ऑब्जेक्ट फ़ाइल बनाकर हासिल किया जाता है।

हालांकि एक निष्पादन योग्य के लिए यह काम करने में विफल रहा है और केवल एक ही अंतर यह है कि निष्पादन योग्य में सी और सी ++ कोड का मिश्रण होता है, और संस्करण प्रतीक कहीं और स्थानांतरित किया जा रहा है।

प्रश्न यह है कि ईएलएफ फ़ाइल में किसी प्रतीक के पूर्ण स्थान की गारंटी देने का कोई तरीका है, जैसे कि लिंक हमेशा लिंकर कमांड या कोड विशेषता निर्देशों के माध्यम से फ़ाइल के शीर्ष पर स्थित होता है?

+0

['e_ident [EI_ABIVERSION] और e_type'] (http://en.wikipedia.org/wiki/Executable_and_Linkable_Format) के बीच 7 अप्रयुक्त बाइट्स का उपयोग करने के बारे में क्या? :) – Kamiccolo

+0

मुझे लगता है कि आप जीएनयू लिंकर का उपयोग कर रहे हैं? यदि ऐसा है, तो यह स्क्रिप्ट के साथ आता है जिसे आपके स्वाद में बदल दिया जा सकता है। मुझे नहीं लगता कि आप एक विशिष्ट स्थान पर एक प्रतीक को मजबूर करने के लिए स्क्रिप्ट को बदल सकते हैं, हालांकि, आप एक विशेष .appversion अनुभाग बना सकते हैं और यह सुनिश्चित कर सकते हैं कि यह नया अनुभाग पहले दिखाई दे। अब मुझसे मत पूछो कि यह सब कैसे करें ... मुझे पता है कि आप इसे कर सकते हैं। –

+0

लिंकर स्क्रिप्ट एक विकल्प प्रतीत होता है हालांकि आप कहते हैं कि यह स्पष्ट नहीं है कि आप ईएलएफ फ़ाइल के शीर्ष पर एक प्रतीक लगाने के लिए उनका उपयोग कैसे करेंगे। रहस्य यह है कि यह बिल्कुल क्यों हो रहा है। पहले लिंक ऑर्डर ने प्रतीक प्लेसमेंट का फैसला किया था। ऐसा लगता है कि सी ++ लाइब्रेरी को शामिल करने से प्रभावित हुआ है। मुझे नहीं पता कि ईएलएफ ऑर्डरिंग के मामले में सी ++ ऑब्जेक्ट कोड की कोई विशेष आवश्यकता है या नहीं – user2881914

उत्तर

0

ईएलएफ फ़ाइल के शीर्ष पर यह ELF specification के अनुसार जादू हस्ताक्षर 0x7f, 'ई', 'एल', 'एफ' होना चाहिए। इसके बजाय निष्पादन के शीर्ष पर अपने कोड संस्करण डाल, मैं तुम्हें एल्फ हैडर से कुछ unsignificant क्षेत्रों का उपयोग कर सकते हैं लगता है, उदाहरण के ei_pad

struct E_Ident { 
    unsigned long ei_magic;  
    unsigned char ei_class;   
    unsigned char ei_data;   
    unsigned char ei_version;  
    unsigned char ei_pad[9];  
}; 
1

आप स्क्रिप्ट के माध्यम से लिंकर के उत्पादन को नियंत्रित कर सकते हैं। आपके मामले में आप संभावित समाधान के लिए: https://sourceware.org/binutils/docs/ld/SECTIONS.html#SECTIONS देख सकते हैं।

उदाहरण के लिए:

SECTIONS { 
    .version 0x2020 : { version.o } 
    .text : { *(.text) } 
    .data : { *(.data) } 
    .bss : { *(.bss) *(COMMON) } 
} 

इस पर नियंत्रण नहीं है जहां वर्गों बिल्कुल जुड़ा हुआ निष्पादन में दिखाई देगा, लेकिन यह यह को प्रभावित कर सकते हैं (यह निश्चित रूप से करता है जब रोम छवियों के साथ काम कर), तो आपको होगा खुद का प्रयोग करने के लिए।

संबंधित मुद्दे