2016-07-09 4 views
1

のためのLinuxカーネル3.2をコンパイルするとき、私はこのチュートリアルARM用Linuxカーネル3.2をコンパイルし、QEMUでエミュレートすると、次のい:エラー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のオペレーティングシステムを働いている、と私はカーネルをコンパイルするリナロツールチェーンを使用しています。

$ 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年からのものだったので、2012年のlinaroを使用してください3.2より新しいカーネルをコンパイルする。あなたのlinaroのgccバージョンは古いLinuxカーネルをコンパイルするにはあまりにも新しくなっています。または、新しいカーネルを試してみてください(しかし、この古いブログからのコマンドは機能しないかもしれません) – osgx

+2

Linuxカーネルバージョン3.2は、gccバージョン5が存在する前にリリースされました。カーネルバージョン3.2.81にはこのヘッダーがあります。 –

+0

ありがとう、しかし、Ubuntuでgcc-4を使ってLinaroを取得する方法はありますか? –

答えて

2

あなたのカーネルのバージョン(3.2.0)が古すぎると中古のgcc(GCC-5)と互換性がありません:私もここにPATH変数をチェックしている

は結果です。 gcc-4を使ってカーネルをコンパイルしたり、新しいカーネルバージョンを使うことができます。

あなたのカーネルが特別にそれは異なるバージョンのgcc(GNUCはGCCのメジャーバージョンである)のために別のファイルが含まれます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-3とgcc-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-gcc5.hcompiler-gcc4.hを書き換えしようとするかもしれませんが、あなたがこれを行う方法を理解する必要があります。 gcc4をgcc5にコピーするだけでは、不正なマクロが作成されることはありません。

compiler-gcc5.hが唯一のLinuxカーネルのバージョン3.18に追加されました:(GCC-5の前に)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中)

古いリナロコンパイラhttps://releases.linaro.org/components/toolchain/binaries/4.9-2016.02/

され、JJ Hakalaのコメントによると、そこにあります3.2。*カーネルの最終バージョンのコンパイラ-gcc5ヘッダー、3.2.81:https://www.kernel.org/pub/linux/kernel/v3.0/linux-3.2.81.tar.gz - wgetコマンドとtar xjfをこのバージョンに変更して再試行してください。

+0

ありがとうございます。あなたはUbuntuでgcc-4を使ってLinaroを取得する方法を知っていますか? –

+1

Ramy、JJHakalaは、3.2.81カーネルにヘッダーがあると言います。試してみてください(wgetコマンドのアドレスをhttps://www.kernel.org/pub/linux/kernel/v3.0/linux-3.2.81.tar.gzに変更してください)。 gcc-5より前のLinaroはhttps://releases.linaro.org/components/toolchain/binaries/4.9-2016.02/で4.9-2016.02です。 – osgx

+0

旧バージョンのコマンドに従う必要があるので古いカーネルを使うのが好きです。私はいくつかのコマンドが新しいカーネルではうまく動作しないかもしれないと心配しています –