2016-07-09 10 views
1

Я выполняю этот учебник для компиляции Linux ядра 3.2 для ARM и эмулировать с QEMU:Ошибка при компиляции Linux ядра 3.2 для ARM

https://balau82.wordpress.com/2012/03/31/compile-linux-kernel-3-2-for-arm-and-emulate-with-qemu/

Я следую шагам, описанным ниже:

  1. wget http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.2.tar.bz2
  2. tar xjf linux-3.2.tar.bz2
  3. export ARCH=arm
  4. export CROSS_COMPILE=arm-linux-gnueabi-
  5. cd linux-3.2
  6. make vexpress_defconfig
  7. make all
  8. cd ..
  9. arm-linux-gnueabi-gcc -static init.c -o init
  10. echo init|cpio -o --format=newc > initramfs
  11. qemu-system-arm -M vexpress-a9 -kernel linux-3.2/arch/arm/boot/zImage -initrd initramfs -serial stdio -append "console=tty1"

Моя проблема, когда я пытаюсь шаг 7 (все сделать), эта проблема случается:

include/linux/compiler-gcc.h:94:30: fatal error: linux/compiler-gcc5.h: No such file or directory 
compilation terminated. 
/home/ramy/QEMU_Learn/kernel/linux-3.2/./Kbuild:35: recipe for target 'kernel/bounds.s' failed 
make[1]: *** [kernel/bounds.s] Error 1 
Makefile:985: recipe for target 'prepare0' failed 

Я работаю в Ubuntu операционной системы, и я использую Линаро цепочку инструментов для компиляции ядра.

Я также проверил переменную PATH и вот результат:

$ printenv | grep PATH 

XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0 
XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0 
DEFAULTS_PATH=/usr/share/gconf/ubuntu.default.path 
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/ramy/gcc-arm-none-eabi-5_3-2016q1/bin 
MANDATORY_PATH=/usr/share/gconf/ubuntu.mandatory.path 
+1

Какой у вас кросс-компилятор? Какая у вас версия linaro? Опубликованный https://balau82.wordpress.com/2012/03/31/compile-linux-kernel-3-2-for-arm-and-emulate-with-qemu/ был с 2012 года, поэтому используйте linaro с 2012 года год для компиляции ядра 3.2, но не более нового. Версия gcc в вашем linaro слишком нова, чтобы скомпилировать столь старое ядро ​​Linux. Или попробуйте новое ядро ​​(но команды из этого старого блога могут не сработать) – osgx

+2

Ядро Linux версии 3.2 было выпущено до того, как существовала версия gcc версии 5. Версия ядра 3.2.81 имеет этот заголовок. –

+0

Спасибо, но как получить Линаро с gcc-4 в Ubuntu? –

ответ

2

Ваша версия ядра (3.2.0) слишком стар и не совместим с используемым GCC (GCC-5). Вы можете использовать gcc-4 для компиляции ядра или использования более новой версии ядра.

Ваше ядро ​​имеет специальные включать в linux/compiler-gcc.h заголовке http://lxr.free-electrons.com/source/include/linux/compiler-gcc.h?v=3.2#L91

91 #define __gcc_header(x) #x 
92 #define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h) 
93 #define gcc_header(x) _gcc_header(x) 
94 #include gcc_header(__GNUC__) 

Он будет включать в себя различные файлы для различных версий GCC (GNUC является основной версией GCC). Он поддерживает GCC-3 и НКУ-4, но не GCC-5:

http://lxr.free-electrons.com/source/include/linux/?v=3.2

C file compiler-gcc.h 3705 bytes 
C file compiler-gcc3.h 631 bytes 
C file compiler-gcc4.h 2073 bytes 
C file compiler-intel.h 746 bytes 
C file compiler.h 8628 bytes 

Вы можете попробовать переписать compiler-gcc4.h в compiler-gcc5.h, но вы должны понимать, как это сделать. Вы можете не просто скопировать gcc4 в gcc5, там будет неправильный макрос.

compiler-gcc5.h был добавлен только в ядре Linux версии 3.18: http://lxr.free-electrons.com/source/include/linux/compiler-gcc5.h?v=3.18 (не в 3,17 http://lxr.free-electrons.com/source/include/linux/compiler-gcc5.h?v=3.17)

Старым Линар компилятор (до GCC-5) является https://releases.linaro.org/components/toolchain/binaries/4.9-2016.02/

И согласно JJ Хакала комментарий, есть заголовок компилятора-gcc5 в последней версии 3.2. * kernel, 3.2.81: https://www.kernel.org/pub/linux/kernel/v3.0/linux-3.2.81.tar.gz - просто измените команду wget и tar xjf на эту версию и повторите попытку.

+0

Спасибо. Вы знаете, как получить Линаро с gcc-4 в Ubuntu? –

+1

Ramy, JJHakala говорит, что ядро ​​3.2.81 имеет заголовок; попробуйте (измените адрес команды wget на https://www.kernel.org/pub/linux/kernel/v3.0/linux-3.2.81.tar.gz). Линаро до gcc-5 составляет 4.9-2016.02 по адресу https://releases.linaro.org/components/toolchain/binaries/4.9-2016.02/. – osgx

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^