2013-06-03 5 views
5

В моей системе, когда я что-то скомпилировал (с bfin-linux-uclibc-g++, но это не имеет значения), я получаю сотни предупреждений (не в моей собственной базе кода) относительно одного из флагов компилятора. Я хочу отключить его.Как переустановить опции gcc по умолчанию для компоновщика?

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

Это orginates от флага в GCC по умолчанию, который передан линкера, который легко проверить путем добавления '-v' на этапе компиляции:

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'. Выглядит уродливо. Удаление флага не избавляется от предупреждений, но кажется, что это ошибка (см. Патч 22 января 2013 года): 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... 

Это заменит спецификации инлайн, сохраняя при этом оригинальный компилятор нетронутыми.

Если вы держите свой собственный 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

Я только что начал с обратной передачи некоторого кода в старую систему с контроллером bfin и столкнулся с проблемой с этими ужасно раздражающими предупреждениями - 1000 за раз. Я не нашел способ просто отключить вывод.

Но есть 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); 

патч ЛД двоичный

Посмотрите на ЛД-Binary и исправлять двоичный код напрямую. Я сбросил сегмент данных (.rodata) с помощью objdump, чтобы найти адрес строки. Затем (после создания дизассемблирования с помощью objdump) я искал, где была использована эта строка, и заменил вызов функции, которая создает вывод с двумя NoOps (0xFF 0xD3 -> 0x90 0x90). Линкером по-прежнему создается тот же вывод, но больше нет сообщений.