2013-06-03 14 views
5

私のシステムでは、何かをコンパイルすると(bfin-linux-uclibc-g++で、それは無関係ですが)、私はコンパイラのフラグの1つに関して何百もの警告を出します。私はそれを無効にしたい。デフォルトのgccオプションをリンカに適用する方法は?

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

これは、コンパイル手順に'-v'を追加することでチェックすることは容易であるリンカーに引き渡されるデフォルトのgccのフラグから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/opt/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] 

また、この手法は、configureスクリプトで使用することができ、あなたが前にbetter_specsを生成することを提供し、あなただけの./configure CXX='g++ -specs=/path/to/better_specs'を使用することができます。

+0

これは、リンカオプションが設定されているかどうかにかかわらず、警告が出力されるので役に立ちません。 – DrP3pp3r

0

私はちょうどbfinコントローラを使って古いシステムにいくつかのコードをバックポーティングすることから始めました。そして、これらの非常に厄介な警告(一度に1000s)で問題に遭遇しました。出力を無効にする方法はありませんでした。

しかし、その作業を2「に行くための方法」があります。

ソースを修正して、ツールチェーンの再構築は:

でELF-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-バイナリを見て、直接バイナリにパッチを適用します。 データセグメント(.rodata)をobjdumpでダンプして、文字列のアドレスを見つけました。 objdumpで逆アセンブリを作成した後、その文字列がどこで使われたかを調べ、2つのNoOps(0xFF 0xD3 - > 0x90 0x90)で出力を作成する関数を呼び出したものに置き換えました。 リンカは引き続き同じ出力を作成しますが、それ以上のメッセージは作成されません。