2013-06-03 24 views
5

在我的系統上編譯某些東西(使用bfin-linux-uclibc-g++但不相關)時,我得到了數百個關於其中一個編譯器標誌的警告(不在我自己的代碼庫中)。我想禁用它。如何推翻默認的gcc選項到鏈接器?

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

這從被移交給連接默認的gcc標誌,這是很容易通過增加'-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

我通過此禁用的選項:'strace的/選擇/ uClinux的/ BFIN-Linux的uClibc的/ bin中/ BFIN-Linux的uClibc的-GCC 2>&1 | grep -i spec',轉到這些目錄之一,'bfin-linux-uclibc-g ++ -dumpspecs> specs'並手動更新那裏的specs文件。雖然看起來很醜。刪除標誌並沒有擺脫警告,但似乎是一個錯誤(參見2013年1月22日的補丁):http://sourceware.org/ml/binutils/2013-01/msg00333.html。這確實是你應該怎麼做,或者有更美麗的方式? –

回答

0

可以動態轉儲GCC的規格,從那裏刪除此開關和連接,即:

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

這將更換規格直列時,在保持原有的編譯器完好使用。

如果你把你自己的Makefile中,這也可以用類似的處理:

$(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

我剛剛開始將一些代碼移植到一個帶有bfin控制器的舊系統中,並且遇到了令人生厭的警告 - 每次只有1000個警告。我沒有找到停用輸出的方法。

但也有2「的方式去」的工作:

固定源和重建工具鏈:

刪除,在創建中的小精靈-EH-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創建反彙編之後),我搜索了該字符串的使用位置,並將調用替換爲使用兩個NoOps(0xFF 0xD3 - > 0x90 0x90)創建輸出的函數。 鏈接器仍然創建相同的輸出,但沒有更多消息。