2013-06-03 5 views
5

मेरे सिस्टम पर जब मैं कुछ संकलित करता हूं (bfin-linux-uclibc-g++ के साथ लेकिन यह अप्रासंगिक है), मुझे संकलक झंडे में से एक के संबंध में सैकड़ों चेतावनियां (मेरे स्वयं के कोड बेस में नहीं) मिलती हैं। मैं इसे अक्षम करना चाहता हूं।लिंकर को डिफ़ॉल्ट जीसीसी विकल्प कैसे ओवरराल करें?

fde encoding in src/SpiMessageUtil.o(.eh_frame) prevents .eh_frame_hdr table being created. 

यह एक डिफ़ॉल्ट जीसीसी ध्वज जो लिंकर को सौंप दिया जाता है, जो संकलन चरण पर '-v' जोड़कर देखना आसान है कि से orginates:

COLLECT_GCC_OPTIONS=... --eh-frame-hdr ... 

मैं इस से छुटकारा पाने के लिए करना चाहते हैं विकल्प, जो वास्तव में डिफ़ॉल्ट रूप से परिभाषित किया गया है:

bfin-linux-uclibc-g++ -dumpspecs | grep frame-hdr 
%{!static:--eh-frame-hdr}\ 
%{mfdpic: -m elf32bfinfd -z text} %{shared} %{pie} \ 
%{static:-dn -Bstatic} %{shared:-G -Bdynamic} \ 
%{!shared: %{!static: %{rdynamic:-export-dynamic} \ 
    %{!dynamic-linker:-dynamic-linker \ 
    %{mglibc:%{muclibc:%e-mglibc and -muclibc used together;:%e-mglibc not supported for this target};:/lib/ld-uClibc.so.0 \ 
}}}\ 
%{static}} -init __init -fini __fini 

मैं इस विकल्प को कैसे ओवरराइड कर सकता हूं? मैं -Wl,--no-eh-frame-hdr का उपयोग नहीं कर सकता, क्योंकि परिभाषित की तरह कुछ भी नहीं है।

+0

मैंने इस विकल्प को अक्षम कर दिया: 'स्ट्रेस/ऑप्ट/यूक्लिनक्स/बीएफआईएन-लिनक्स-यूक्लिब/बिन/बीफिन-लिनक्स-यूक्लिब-जीसीसी 2> और 1 | grep -i spec', इन निर्देशिकाओं में से किसी एक पर जाएं, 'bfin-linux-uclibc-g ++ -dumpspecs> specs' और मैन्युअल रूप से 'specs' फ़ाइल को अपडेट करें। यद्यपि बदसूरत लग रहा है। ध्वज को हटाने से चेतावनियों से छुटकारा नहीं मिलता है, लेकिन यह एक बग प्रतीत होता है (पैच 22 जनवरी 2013 देखें): http://sourceware.org/ml/binutils/2013-01/msg00333.html। क्या यह वास्तव में आपको ऐसा करने के लिए माना जाता है, या क्या कोई और सुंदर तरीका है? –

उत्तर

0

आप गतिशील जीसीसी के चश्मा डंप, वहाँ से इस स्विच को हटाने और इसका इस्तेमाल करते हैं, जब जोड़ने, यानी .:

g++ -dumpspecs | sed -e 's,--eh-frame-hdr,,g' > better_specs 
g++ -specs=better_specs -o target file1.o file2.o -llib1... 

यह चश्मा इनलाइन की जगह लेंगे जबकि मूल संकलक को हाथ लगाए बिना कर सकते हैं।

आप अपने खुद के Makefiles रखने तो इसके कारण भी तरह कुछ के साथ संभाला जा सकता है:

$(TARGET): $(OBJS) | better_specs 
    $(LINK.o) $(OUTPUT_OPTION) -specs=$| $^ 

better_specs: 
    $(CXX) -dumpspecs | sed -e 's,--eh-frame-hdr,,g' > [email protected] 

यह दृष्टिकोण भी कॉन्फ़िगर स्क्रिप्ट के साथ इस्तेमाल किया जा सकता है, कि तुम से पहले better_specs उत्पन्न, तो आप सिर्फ ./configure CXX='g++ -specs=/path/to/better_specs' इस्तेमाल कर सकते हैं प्रदान की है।

+0

यह मदद नहीं करता है क्योंकि चेतावनी उत्सर्जित होती है इससे कोई फर्क नहीं पड़ता कि लिंकर विकल्प सेट है या नहीं। – DrP3pp3r

0

मैं बस एक बीएफन नियंत्रक के साथ एक पुराने सिस्टम में कुछ कोड बैक पोर्टिंग के साथ शुरू कर दिया और इन बहुत ही परेशान चेतावनियों के साथ समस्या में भाग गया - एक समय में 1000s। मुझे आउटपुट को निष्क्रिय करने का कोई तरीका नहीं मिला।

लेकिन वहाँ 2 कि काम "जाने के लिए तरीके" कर रहे हैं:

स्रोत को ठीक करें और उपकरण श्रृंखला के पुनर्निर्माण:

कोड है कि में योगिनी-हाँ-frame.c में उत्पादन बनाता निकालें समारोह _bfd_elf_discard_section_eh_frame:

(*info->callbacks->einfo) 
    (_("%P: fde encoding in %B(%A) prevents .eh_frame_hdr" 
     " table being created.\n"), abfd, sec); 

ld द्विआधारी

पैच ld-बाइनरी पर एक नजर डालें और सीधे द्विआधारी पैच। मैंने स्ट्रिंग के पते को खोजने के लिए objdump के साथ डेटा सेगमेंट (.rodata) को छोड़ दिया। फिर (objdump के साथ एक डिस्सेप्लर बनाने के बाद) मैंने खोज की कि उस स्ट्रिंग का उपयोग किया गया था और उस कॉल को उस फ़ंक्शन पर बदल दिया गया था जो दो नोओप्स (0xFF 0xD3 -> 0x90 0x90) के साथ आउटपुट बनाता है। लिंकर अभी भी एक ही आउटपुट बनाता है, लेकिन कोई और संदेश नहीं।

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