मैं दिए गए निष्पादन योग्य को संकलित करने के लिए उपयोग किए गए जीसीसी संस्करण को पुनर्प्राप्त करना चाहता हूं। मैंने readelf
की कोशिश की लेकिन जानकारी नहीं मिली। कोई विचार?किसी दिए गए ईएलएफ निष्पादन योग्य को संकलित करने के लिए उपयोग किए गए जीसीसी संस्करण को कैसे पुनर्प्राप्त करें?
उत्तर
यह जानकारी संकलित वस्तु में संग्रहीत नहीं है।
यह जानकारी संकलित ऑब्जेक्ट (सी) में संग्रहीत नहीं है।
वास्तव में, सी कोड के लिए आप पूरी तरह भाग्य से बाहर हैं। हालांकि, सी ++ कोड के लिए आपको प्रतीक संस्करणों से कुछ जानकारी मिल सकती है। सी ++ रनटाइम पुस्तकालयों के कुछ कार्य संस्करण-विशिष्ट हैं, और ऑब्जेक्ट फ़ाइलों में इस तरह चिह्नित हैं। इसे आज़माएं:
readelf -Wa file.exe | grep 'GCC[[:alnum:]_.]*' --only-match | sort | uniq | tail -n 1
यह आपको जीसीसी का संस्करण नहीं दिखाएगा, हालांकि। यह जो दिखाता है वह संकलक को दिए गए रनटाइम में प्रतीकों का संस्करण है। आम तौर पर रनटाइम एक कंपाइलर शिपमेंट का होता है, और इसका संस्करण उपरोक्त आदेश के साथ दिखाए गए 0 की तुलना में कम नहीं है।
ठीक है, धन्यवाद दोस्तों! यह पता नहीं लगा सकता कि ऐसी महत्वपूर्ण जानकारी इसे ईएलएफ हेडर में क्यों नहीं बनाती है। मेरा लक्ष्य वास्तव में एक एम्बेडेड लिनक्स कर्नेल है। –
दूसरों ने जो कहा है उसे पूरा करने के लिए: यह ऑब्जेक्ट (या 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)
।
यह सामान्य रूप से टिप्पणी अनुभाग में संग्रहीत किया जाता है
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। -फनो-पहचान जीसीसी को इन प्रतीकों को शुरू करने के लिए टिप्पणी खंड में उत्पन्न करने से रोकती है।
"सामान्य" से आपका क्या मतलब है? मेरा संकलक/संस्करण डिफ़ॉल्ट जानकारी का उपयोग करके संकलन करते समय इस जानकारी को संग्रहीत नहीं करता है। –
मैं ओएस एक्स पर संकलित जीसीसी 4.6.2 का उपयोग कर रहा हूं लेकिन बिना किसी सिस्टम-विशिष्ट पैच लागू किए गए हैं। यह एक वेनिला जीसीसी है। –
कुछ भी नहीं। अगर मैं स्रोत कोड में शाब्दिक तार शामिल करता हूं, तो वे सही ढंग से 'स्ट्रिंग्स' द्वारा पाए जाते हैं। –
फिर भी एक और दो तरीके (शायद थोड़ा सरल) है कि मैं सिर्फ यहाँ के बारे में पढ़ा है: 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..
...
इस पर विस्तार से: '-p' विकल्प 'readelf' की मेरी प्राचीन प्रति में मौजूद नहीं है (' binutils 2.14' से)), इसलिए मुझे .comment सेक्शन का इंडेक्स मिलना पड़ा, फिर हेक्स डंप इसे इस प्रकार: 'readelf --hex-dump = $ (readelf -S
आप elfinfo उपयोगिता का उपयोग कर सकते हैं। यह जीसीसी के अलावा, गो और एफपीसी के कंपाइलर संस्करणों का पता लगाने का भी समर्थन करता है।
- 1. किसी दिए गए हैशटैग
- 2. एक ईएलएफ निष्पादन योग्य
- 3. किसी दिए गए कुंजी
- 4. किसी दिए गए थ्रेड
- 5. किसी दिए गए आईडी
- 6. किसी दिए गए आकार
- 7. किसी दिए गए रंग
- 8. किसी दिए गए नंबर
- 9. कैसे किसी दिए गए पैटर्न
- 10. किसी दिए गए समयावधि
- 11. किसी दिए गए बिंदु
- 12. किसी दिए गए शब्द
- 13. किसी दिए गए फ़ॉन्ट
- 14. कैश किए गए संस्करण
- 15. विशिष्ट ईएलएफ अनुभागों (जीसीसी के साथ) में कुछ संकलक-जेनरेट किए गए चर को मजबूर करना
- 16. किसी दिए गए फ़ाइल
- 17. किसी दिए गए पथ
- 18. किसी दिए गए नंबर
- 19. किसी दिए गए दिनांक
- 20. किसी दिए गए क्रमपरिवर्तन
- 21. किसी दिए गए बिंदु
- 22. क्लोजर सॉर्ट किए गए मानों के लिए किसी दिए गए मान के निकट कुंजी ढूंढना
- 23. किसी दिए गए विस्तार
- 24. कैसे किसी दिए गए प्रारूप
- 25. किसी दिए गए यूआरएल
- 26. किसी दिए गए यूटीटाइप
- 27. किसी दिए गए पथ
- 28. किसी दिए गए पैटर्न
- 29. सामग्री संपादन योग्य div को दिए गए एक सामग्री योग्य
- 30. Apache Commons Exec के साथ लॉन्च किए गए निष्पादन योग्य को स्ट्रिंग तर्क कैसे पाइप करें?
क्या आपका मतलब है कि यह ईएलएफ ऑब्जेक्ट से संकलित ऑब्जेक्ट या अंतिम लिंक निष्पादन योग्य होने के लिए संभव नहीं है? –
उनमें से सभी। (जब तक आप कोड में मैन्युअल रूप से संस्करण नहीं जोड़ते हैं।) – kennytm