2010-03-05 17 views
56

मैं दिए गए निष्पादन योग्य को संकलित करने के लिए उपयोग किए गए जीसीसी संस्करण को पुनर्प्राप्त करना चाहता हूं। मैंने readelf की कोशिश की लेकिन जानकारी नहीं मिली। कोई विचार?किसी दिए गए ईएलएफ निष्पादन योग्य को संकलित करने के लिए उपयोग किए गए जीसीसी संस्करण को कैसे पुनर्प्राप्त करें?

उत्तर

0

यह जानकारी संकलित वस्तु में संग्रहीत नहीं है।

+0

क्या आपका मतलब है कि यह ईएलएफ ऑब्जेक्ट से संकलित ऑब्जेक्ट या अंतिम लिंक निष्पादन योग्य होने के लिए संभव नहीं है? –

+0

उनमें से सभी। (जब तक आप कोड में मैन्युअल रूप से संस्करण नहीं जोड़ते हैं।) – kennytm

2

यह जानकारी संकलित ऑब्जेक्ट (सी) में संग्रहीत नहीं है।

वास्तव में, सी कोड के लिए आप पूरी तरह भाग्य से बाहर हैं। हालांकि, सी ++ कोड के लिए आपको प्रतीक संस्करणों से कुछ जानकारी मिल सकती है। सी ++ रनटाइम पुस्तकालयों के कुछ कार्य संस्करण-विशिष्ट हैं, और ऑब्जेक्ट फ़ाइलों में इस तरह चिह्नित हैं। इसे आज़माएं:

readelf -Wa file.exe | grep 'GCC[[:alnum:]_.]*' --only-match | sort | uniq | tail -n 1 

यह आपको जीसीसी का संस्करण नहीं दिखाएगा, हालांकि। यह जो दिखाता है वह संकलक को दिए गए रनटाइम में प्रतीकों का संस्करण है। आम तौर पर रनटाइम एक कंपाइलर शिपमेंट का होता है, और इसका संस्करण उपरोक्त आदेश के साथ दिखाए गए 0 की तुलना में कम नहीं है।

+0

ठीक है, धन्यवाद दोस्तों! यह पता नहीं लगा सकता कि ऐसी महत्वपूर्ण जानकारी इसे ईएलएफ हेडर में क्यों नहीं बनाती है। मेरा लक्ष्य वास्तव में एक एम्बेडेड लिनक्स कर्नेल है। –

16

दूसरों ने जो कहा है उसे पूरा करने के लिए: यह ऑब्जेक्ट (या exe) फ़ाइल, में संग्रहीत नहीं है जब तक आप डिबगिंग जानकारी से संकलित नहीं करते! (विकल्प -g)। आप डिबग जानकारी के साथ संकलित हैं, तो आप यह readelf के साथ वापस प्राप्त कर सकते हैं:

$ cat a.c 
int main(void){ return 0; } 
$ gcc a.c 
$ readelf -wi a.out 
$ gcc a.c -g  
$ readelf -wi a.out 
Contents of the .debug_info section: 

    Compilation Unit @ offset 0x0: 
    Length:  0x42 (32-bit) 
    Version:  2 
    Abbrev Offset: 0 
    Pointer Size: 4 
<0><b>: Abbrev Number: 1 (DW_TAG_compile_unit) 
    < c> DW_AT_producer : (indirect string, offset: 0x0): GNU C 4.4.3 20100108 (prerelease)  
    <10> DW_AT_language : 1 (ANSI C) 
    <11> DW_AT_name  : a.c 
    <15> DW_AT_comp_dir : (indirect string, offset: 0x22): /tmp  
    <19> DW_AT_low_pc  : 0x8048394  
    <1d> DW_AT_high_pc  : 0x804839e  
    <21> DW_AT_stmt_list : 0x0 
<1><25>: Abbrev Number: 2 (DW_TAG_subprogram) 
    <26> DW_AT_external : 1  
    <27> DW_AT_name  : (indirect string, offset: 0x27): main  
    <2b> DW_AT_decl_file : 1  
    <2c> DW_AT_decl_line : 1  
    <2d> DW_AT_prototyped : 1  
    <2e> DW_AT_type  : <0x3e> 
    <32> DW_AT_low_pc  : 0x8048394  
    <36> DW_AT_high_pc  : 0x804839e  
    <3a> DW_AT_frame_base : 0x0 (location list) 
<1><3e>: Abbrev Number: 3 (DW_TAG_base_type) 
    <3f> DW_AT_byte_size : 4  
    <40> DW_AT_encoding : 5 (signed) 
    <41> DW_AT_name  : int 

देखें कि यह कैसे कहते हैं GNU C 4.4.3 20100108 (prerelease)

55

यह सामान्य रूप से टिप्पणी अनुभाग में संग्रहीत किया जाता है

strings -a <binary/library> |grep "GCC: (" 

रिटर्न जीसीसी: (जीएनयू) XXX

strip -R .comment <binary> 
strings -a <binary/library> |grep "GCC: (" 

रिटर्न कोई उत्पादन

यह .comment पट्टी असामान्य नहीं है (साथ ही साथ .note) सेक्शन को कम करने के लिए

strip --strip-all -R .note -R .comment <binary> 
strip --strip-unneeded -R .note -R .comment <library> 

नोट: बिजीबॉक्स तार डिफ़ॉल्ट रूप से -एक विकल्प है, जो .comment खंड के लिए आवश्यक है निर्दिष्ट करता

संपादित करें: Berendra Tusla के जवाब के विपरीत, यह इस विधि के लिए किसी भी डिबगिंग झंडे के साथ संकलित किया जा की जरूरत नहीं है काम करने के लिए।

बाइनरी उदाहरण:

# echo "int main(void){}">a.c 
# gcc -o a a.c -s 
# strings -a a |grep GCC 
GCC: (GNU) 4.3.4 
# strip -R .comment a 
# strings -a a |grep GCC 
# 

वस्तु उदाहरण:

# gcc -c a.c -s 
# strings -a a.o |grep GCC 
GCC: (GNU) 4.3.4 
# strip -R .comment a.o 
# strings -a a |grep GCC 
# 

नोट किसी भी जी (डिबगिंग) झंडे के अभाव और -s ध्वज जो अनावश्यक प्रतीकों स्ट्रिप्स की उपस्थिति। जीसीसी जानकारी अभी भी उपलब्ध है जब तक कि .comment अनुभाग हटा दिया जाता है। यदि आपको यह जानकारी बरकरार रखने की आवश्यकता है, तो आपको यह सत्यापित करने के लिए अपनी मेकफ़ाइल (या लागू बिल्ड स्क्रिप्ट) की जांच करनी पड़ सकती है -फनो-पहचान आपके $ CFLAGS में नहीं है और $ STRIP कमांड की कमी है- r .comment। -फनो-पहचान जीसीसी को इन प्रतीकों को शुरू करने के लिए टिप्पणी खंड में उत्पन्न करने से रोकती है।

+1

"सामान्य" से आपका क्या मतलब है? मेरा संकलक/संस्करण डिफ़ॉल्ट जानकारी का उपयोग करके संकलन करते समय इस जानकारी को संग्रहीत नहीं करता है। –

+0

मैं ओएस एक्स पर संकलित जीसीसी 4.6.2 का उपयोग कर रहा हूं लेकिन बिना किसी सिस्टम-विशिष्ट पैच लागू किए गए हैं। यह एक वेनिला जीसीसी है। –

+0

कुछ भी नहीं। अगर मैं स्रोत कोड में शाब्दिक तार शामिल करता हूं, तो वे सही ढंग से 'स्ट्रिंग्स' द्वारा पाए जाते हैं। –

7

फिर भी एक और दो तरीके (शायद थोड़ा सरल) है कि मैं सिर्फ यहाँ के बारे में पढ़ा है: https://unix.stackexchange.com/questions/719/can-we-get-compiler-information-from-an-elf-binary

$ readelf -p .comment /usr/lib64/flash-plugin/libflashplayer.so 

String dump of section '.comment': 
    [  1] GCC: (GNU) 4.3.2 20081105 (Red Hat 4.3.2-7) 
    [ 2e] GCC: (GNU) 4.3.2 
... 

और

$ objdump -s --section .comment /usr/lib64/flash-plugin/libflashplayer.so 

/usr/lib64/flash-plugin/libflashplayer.so:  file format elf64-x86-64 

Contents of section .comment: 
0000 00474343 3a202847 4e552920 342e332e .GCC: (GNU) 4.3. 
0010 32203230 30383131 30352028 52656420 2 20081105 (Red 
0020 48617420 342e332e 322d3729 00004743 Hat 4.3.2-7)..GC 
0030 433a2028 474e5529 20342e33 2e320000 C: (GNU) 4.3.2.. 
... 
+0

इस पर विस्तार से: '-p' विकल्प 'readelf' की मेरी प्राचीन प्रति में मौजूद नहीं है (' binutils 2.14' से)), इसलिए मुझे .comment सेक्शन का इंडेक्स मिलना पड़ा, फिर हेक्स डंप इसे इस प्रकार: 'readelf --hex-dump = $ (readelf -S | grep .comment | awk' {print $ 1} 'tr -d '[]') ' – tkocmathla

0

आप elfinfo उपयोगिता का उपयोग कर सकते हैं। यह जीसीसी के अलावा, गो और एफपीसी के कंपाइलर संस्करणों का पता लगाने का भी समर्थन करता है।

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