2013-06-03 39 views
5

Auf meinem System, wenn ich etwas kompiliere (mit bfin-linux-uclibc-g++, aber das ist irrelevant), bekomme ich Hunderte von Warnungen (nicht in meinem eigenen Code-Basis) in Bezug auf eines der Compiler-Flags. Ich möchte es deaktivieren.Wie Standard-GCC-Optionen auf den Linker überschreiben?

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

Dieses wird von einem Standard-gcc-Flag entstammt, die an den Linker übergeben wird, die durch Zugabe von '-v' der Zusammenstellung Schritt zu prüfen, ist einfach:

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

Ich möchte loswerden diese Option, die tatsächlich standardmäßig definiert ist:

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 

Wie kann ich diese Option überschreiben? Ich kann -Wl,--no-eh-frame-hdr nicht verwenden, weil es nichts dergleichen definiert ist.

+0

Ich habe die Option deaktiviert: 'strace/opt/uClinux/bfin-linux-uclibc/bin/bfin-linux-uclibc-gcc 2> & 1 | grep -i spec', gehe zu einem dieser Verzeichnisse, bfin-linux-uclibc-g ++ -dumpspecs> specs' und aktualisiere die 'specs'-Datei dort manuell. Sieht aber hässlich aus. Durch das Entfernen der Flagge werden die Warnungen nicht gelöscht, aber es scheint sich um einen Fehler zu handeln (siehe Patch 22 Jan. 2013): http://sourceware.org/ml/binutils/2013-01/msg00333.html. Soll das tatsächlich so sein, oder gibt es einen schöneren Weg? –

Antwort

0

können Sie dynamisch GCC specs Dump, entfernen Sie diesen Schalter von dort und es verwenden, wenn die Verknüpfung, d.h .:

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

Diese die Spezifikationen Inline ersetzen würde, während ursprünglichen Compiler intakt zu halten.

Wenn Sie eine eigene Makefiles halten, könnte dies auch mit so etwas wie behandelt werden:

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

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

Dieser Ansatz könnte auch mit configure-Skripten verwendet werden, vorausgesetzt, dass Sie better_specs vor generieren, könnten Sie einfach ./configure CXX='g++ -specs=/path/to/better_specs' verwenden.

+0

Dies hilft nicht, da die Warnung ausgegeben wird, egal ob die Linker-Option gesetzt ist oder nicht. – DrP3pp3r

0

Ich habe gerade mit der Rückportierung einiger Code auf ein altes System mit einem bfin-Controller begonnen und stieß auf das Problem mit diesen schrecklich nervigen Warnungen - 1000s gleichzeitig. Ich habe keine Möglichkeit gefunden, die Ausgabe zu deaktivieren.

Aber es gibt zwei "Wege zu gehen", dass die Arbeit:

die Quelle Fix und die Werkzeugkette neu zu erstellen:

Entfernen Sie den Code, der die Ausgabe in elf-eh-frame.c schafft in die Funktion _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); 

Patch der ld binäre

Werfen Sie einen Blick auf die ld-Binary und die binäre direkt patchen. Ich habe das Datensegment (.rodata) mit objdump ausgegeben, um die Adresse der Zeichenfolge zu finden. Dann (nach dem Erstellen einer Disassemblierung mit objdump) habe ich gesucht, wo diese Zeichenfolge verwendet wurde, und den Aufruf der Funktion ersetzt, die die Ausgabe mit zwei NoOps (0xFF 0xD3 -> 0x90 0x90) erstellt. Linker erstellt immer noch die gleiche Ausgabe, aber keine weiteren Nachrichten.