2012-08-24 14 views
36

यह देखने का कोई तरीका है कि * nix में निष्पादन योग्य फ़ाइल बनाने के लिए किस कंपाइलर और झंडे का उपयोग किया गया था? मेरे पास संकलित मेरे कोड का पुराना संस्करण है और मैं देखना चाहता हूं कि इसे अनुकूलित या अनुकूलित किए बिना संकलित किया गया था या नहीं। Google बहुत उपयोगी नहीं था, लेकिन मुझे यकीन नहीं है कि मैं सही कीवर्ड का उपयोग कर रहा हूं।संकलित निष्पादन योग्य से संकलक विकल्प प्राप्त करें?

+1

ऐसा लगता है कि 'फ्रीकॉर्ड-जीसीसी-स्विच' जीसीसी के लिए चाल है, लेकिन क्या इंटेल (आईसीसी) के लिए एक समान ध्वज है? – Mosby

+0

क्या फ्रीकॉर्ड-जीसीसी-स्विच के बिना ऐसा करने का कोई तरीका है? जैसे लूप अनोलिंग के स्तर को देखें और – OneSolitaryNoob

उत्तर

48

जीसीसी कि के लिए एक -frecord-gcc-switches का विकल्प है।

$ gcc -O2 -frecord-gcc-switches a.c 
$ readelf -p .GCC.command.line a.out 

String dump of section '.GCC.command.line': 
    [  0] a.c 
    [  4] -mtune=generic 
    [ 13] -march=x86-64 
    [ 21] -O2 
    [ 25] -frecord-gcc-switches 

बेशक, यह उस विकल्प के बिना संकलित निष्पादन योग्य के लिए काम नहीं करेगा।


अनुकूलन के सरल मामले के लिए, आप एक डिबगर का उपयोग कर यदि फ़ाइल डिबग जानकारी के साथ संकलित किया गया था की कोशिश कर सकते। यदि आप इसे थोड़ा सा कदम उठाते हैं, तो आप देख सकते हैं कि कुछ चर 'अनुकूलित' थे। इससे पता चलता है कि अनुकूलन हुआ था।

+0

रीडेल के लिए +1। – Johan

+0

'-फ्रेकोर्ड-जीसीसी-स्विच 'लगभग मुझे चाहिए जो मुझे चाहिए। हालांकि परिणामी खंड में '-प्रप्रप्रोसेस्ड' है, और सभी '-D' मैक्रो परिभाषाएं अब और नहीं हैं। मैं उन्हें कैसे प्राप्त कर सकता हूं? (मैं एक कर्नेल मॉड्यूल का निर्माण कर रहा हूँ।) –

3

यह ऐसा कुछ है जिसे संकलक समर्थन की आवश्यकता होगी। आप इस बात का जिक्र नहीं करते कि आप किस कंपाइलर का उपयोग कर रहे हैं लेकिन चूंकि आपने अपना प्रश्न linux टैग किया है, मुझे लगता है कि आप जीसीसी का उपयोग कर रहे हैं - जो कि आप जिस फीचर के बारे में पूछ रहे हैं उसे डिफ़ॉल्ट नहीं करता है (लेकिन -फ्रेकॉर्ड-जीसीसी-स्विच प्रदर्शन करने का विकल्प है इस)।

यदि आप अपनी बाइनरी का निरीक्षण करना चाहते हैं, तो strings कमांड आपको वह सब कुछ दिखाएगा जो फ़ाइल के भीतर एक पठनीय चरित्र स्ट्रिंग प्रतीत होता है।

1

मैं अत्यधिक शक यह संभव है:

int main() 
{ 
} 

जब साथ संकलित:

gcc -O3 -ffast-math -g main.c -o main 

मापदंडों में से कोई भी उत्पन्न वस्तु में पाया जा सकता:

strings main | grep -O3 
(no output) 
+0

पर भी ...मैं ऑप्टिमाइज़ेशन के साथ और बिना किसी समान "डू-कुछ" प्रोग्राम के लिए उत्पन्न निष्पादन योग्य के बीच तुलना कर रहा था, और वे कुछ अंतर दिखाते हैं ... –

+0

ठीक है, 'रीडल्फ' के साथ जांच से पता चलता है कि यह केवल कुछ अलग व्यवस्था है कार्य, स्पष्ट रूप से चिल्लाते हुए कुछ भी नहीं "यह '-O3' के साथ संकलित किया गया था"। –

11

आप तो -frecord-gcc-switches ध्वज के साथ संकलित करें, फिर कमांड लाइन कंपाइलर विकल्प बाइनरी में वें में लिखा जाएगा ई नोट अनुभाग। See also the docs

-frecord-gcc-switches 
     This switch causes the command line that was used to invoke the compiler to 
     be recorded into the object file that is being created. This switch is only 
     implemented on some targets and the exact format of the recording is target 
     and binary file format dependent, but it usually takes the form of a section 
     containing ASCII text. 

बाद में, ELF निष्पादनयोग्य कि जानकारी के साथ .GCC.command.line अनुभाग में शामिल होंगे:

+0

द्विआधारी जांचने का सबसे अच्छा तरीका क्या है? hexeditor? binutils? – Johan

+2

@ जोहान: 'रीडल्फ'। –

+0

स्ट्रिंग्स मेरे लिए काम नहीं करतीं, मैंने खुद को काम किया। – Johan

1

यदि आपके पास अभी भी कंपाइलर (एक ही संस्करण) है जिसका उपयोग आपने किया है, और यह केवल एक ध्वज है जिसके बारे में आप अनिश्चित हैं, तो आप ध्वज के बिना एक बार और बार बार अपना कोड संकलित करने का प्रयास कर सकते हैं। फिर आप निष्पादन योग्य की तुलना कर सकते हैं। आपका पुराना एक समान, या बहुत समान होना चाहिए, नए लोगों में से एक के लिए।

5

एक और विकल्प है- grecord-gcc-swtiches (नोट, नहीं -f लेकिन -g)। जीसीसी डॉक्स के अनुसार यह झंडे डीबग जानकारी में झंडे डाल देगा। और ऐसा लगता है कि यह जीसीसी 4.8 के बाद डिफ़ॉल्ट रूप से सक्षम है।

मुझे उन cflags निकालने के लिए dwarfdump प्रोग्राम उपयोगी पाया गया है। नोट, स्ट्रिंग प्रोग्राम उन्हें नहीं देखता है। ऐसा लगता है कि बौना जानकारी संपीड़ित है।

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