2009-11-01 1 views
3

Я пытаюсь перекрестно скомпилировать linux для архитектуры ARM.Как предотвратить передачу GCC флаги по умолчанию?

Хост - это машина X86, работающая на ubuntu-jaunty. Я загрузил кросс-компиляцию toolchain для ARM от http://ftp.arm.linux.org.uk/pub/armlinux/toolchain/. Я загрузил версию инструментальной версии 2.95.3.

Проблема, которую я имею что НКУ проходит в некоторых флагов по умолчанию сам по себе, что вызывает GCC, чтобы затем вывести сообщение об ошибке:

/usr/local/arm/2.95.3/bin/arm-linux-gcc -specs=/home/feroze/wnr834m/marvell_WNR834M/gcc_specs -D__KERNEL__ -I/home/feroze/wnr834m/marvell_WNR834M/linux-88fxx81-1_1_3_gtk/include -Wall -Wstrict-prototypes -Wno-trigraphs -Os -fno-strict-aliasing -fno-common -DLED_DUAL_COLOR -DFOR_ROUTER -I/home/feroze/wnr834m/marvell_WNR834M/linux-88fxx81-1_1_3_gtk/arch/arm/mach-mv88fxx81/Soc/gpp/ -Uarm -fno-common -pipe -mapcs-32 -D__LINUX_ARM_ARCH__=5 -march=armv5 -mtune=arm9tdmi -mshort-load-bytes -msoft-float -Uarm -march=strongarm -DKBUILD_BASENAME=main -c -o init/main.o init/main.c cc1: bad value (strongarm) for -march= switch make[1]: *** [init/main.o] Error 1 make[1]: Leaving directory `/home/feroze/wnr834m/marvell_WNR834M/linux-88fxx81-1_1_3_gtk'

Я проверил всю Makefile, и не мог найти место, где LINUX_ARM_ARCH_5 и -march = armv5. Я определяю -march = strongarm в make-файле, но затем он добавляется атрибутом ARMv5.

Итак, я создал файл defs из gcc, изменил его, чтобы иметь только опции для ARMv4, а затем использовал его, указав параметр -specs =. Тем не менее, это еще не решает проблему.

Может ли помочь? Как это разрешить?

Спасибо!

Ферозе

+0

Это проект на основе autotools? Процесс «./configure» добавит несколько флагов, которые, по его мнению, «подразумеваются» или «требуются». –

ответ

1

Флаг -march установлен в arch/ARM/Makefile и зависит от выбранного вами устройства в файле конфигурации. Если вам не нужен флаг armv5, обязательно выберите правильную архитектуру в файле конфигурации.

Вы должны предположить, что присоединенные ядра CFLAGS являются правильными (при условии, что ваша конфигурация в порядке), и если ваша инструментальная цепочка не поддерживает один из них, тогда у вас нет выбора, кроме как перекрестно скомпилировать инструментальную цепочку самостоятельно, используя original crosstol script, который должен работа с 2.95.3

Редактировать: original answer
Что вы пытаетесь построить? a 2.95.3 toolchain довольно древний. Вы должны попробовать более новую toolchain. Вы можете найти предварительно скомпилированный код here Выберите EABI для начала.

Это не прямой ответ на вашу проблему, но если вы создаете ядро ​​linux, вам не нужно связываться с Make-файлами. Вы получите дополнительную помощь, если сможете получить более «стандартную» инструментальную цепочку.

+0

Причина, по которой я использую toolchain 2.95.3, заключается в том, что я строю прошивку ядра linux для довольно старого маршрутизатора - Netgear WNR834M. Я попытался создать исходный код ядра с помощью новой инструментальной цепочки, но у меня появилось много ошибок компиляции. – feroze

+0

Забыл упомянуть, что версия ядра Linux в источниках для этого маршрутизатора - 2,4 (я думаю). – feroze

+0

Я не смог его скомпилировать с помощью инструментальной кодовой программы CodeSourcery EABI. Кроме того, версия инструментальной цепочки версии 2.95.3 не поддерживает процессор armv5 на устройстве. Таким образом, несмотря на то, что компиляция преуспевает с 2.95.3, компоновщик терпит неудачу, потому что он не может найти некоторые символы. Я попробую с оригинальным скриптом crosstool, который вы предлагаете. Даже поддержка NetGear OSS просит меня пойти туда, чтобы построить ее. – feroze

1

Обязательно проверьте переменные среды, так как они могут убедить макияж делать неожиданные вещи.

Если Makefile содержит другой файл, он может быть изменен CFLAGS до того, как вызывается CC. Вы можете распечатать содержимое CFLAGS непосредственно перед вызовом CC?

+0

В переменных среды нет ничего, что вызывает это. Я уже проверил это. – feroze

1

Это не строго поможет вам устранить проблему, но вы можете сделать gcc -dM -E <empty_file.c> или gcc -dM -E -x c /dev/null распечатать список всех предопределенных #define с для GCC. Комбинируйте -dM с другим флагом, похожим на ваш -march, и вы сможете отслеживать, что вызывает проблему #define.