2013-06-03 19 views
5

W moim systemie, gdy kompiluję coś (z bfin-linux-uclibc-g++, ale to nie ma znaczenia), otrzymuję setki ostrzeżeń (nie w mojej własnej bazie kodu) w odniesieniu do jednej z flag kompilatora. Chcę to wyłączyć.Jak przełączyć domyślne opcje GCC na linker?

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

Ten orginates z flagą domyślną gcc, który przekazał do łącznika, który jest łatwy do sprawdzenia przez dodanie '-v' na etapie kompilacji:

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

chciałbym pozbyć się tego opcja, która jest domyślnie zdefiniowana:

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 

Jak mogę zmienić tę opcję? Nie mogę użyć -Wl,--no-eh-frame-hdr, ponieważ nic takiego nie jest zdefiniowane.

+0

Wyłączyłem opcję: 'strace/opt/uClinux/bfin-linux-uclibc/bin/bfin-linux-uclibc-gcc 2> & 1 | grep -i spec', przejdź do jednego z tych katalogów, 'bfin-linux-uclibc-g ++ -dumpspecs> specs' i ręcznie zaktualizuj tam plik' specs'. Wygląda jednak brzydko. Usunięcie flagi nie eliminuje ostrzeżeń, ale wydaje się, że jest to błąd (zobacz poprawkę 22 stycznia 2013 r.): Http://sourceware.org/ml/binutils/2013-01/msg00333.html. Czy rzeczywiście tak powinieneś to zrobić, czy jest tam piękniejszy sposób? –

Odpowiedz

0

Można dynamicznie zrzucić specyfikacji GCC, usunąć stamtąd tego przełącznika i używać go podczas łączenia, tj .:

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

To zastąpienia inline specyfikację, zachowując oryginalny kompilator nienaruszone.

Jeśli trzymać swoją Makefile, może to być również traktowane z czymś takim:

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

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

Takie podejście może być również używane z skryptów konfigurować, pod warunkiem, że można wygenerować better_specs wcześniej, można po prostu użyć ./configure CXX='g++ -specs=/path/to/better_specs'.

+0

To nie pomaga, ponieważ ostrzeżenie jest emitowane bez względu na to, czy opcja linkera jest ustawiona, czy nie. – DrP3pp3r

0

Właśnie zacząłem od przeniesienia kodu do starego systemu z kontrolerem bfin i napotkałem problem z tymi strasznie denerwującymi ostrzeżeniami - po tysiącach na raz. Nie znalazłem sposobu na wyłączenie wyjścia.

Ale istnieją sposoby 2 „Go”, że praca:

Fix źródła i odbudować narzędzia łańcuch:

usunąć kod, który tworzy wyjście w elf-EH-frame.c w _bfd_elf_discard_section_eh_frame funkcja:

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

załatać ld binarny

Spójrz na LD-binarny i załatać binarny bezpośrednio. Zrzuciłem segment danych (.rodata) za pomocą objdump, aby znaleźć adres ciągu. Następnie (po stworzeniu demontażu z objdump) przeszukałem gdzie ten ciąg został użyty i zamieniłem wywołanie funkcji, która tworzy wynik z dwoma NoOps (0xFF 0xD3 -> 0x90 0x90). Łącznik nadal tworzy takie same dane wyjściowe, ale nie więcej wiadomości.