如何在为ARM编译linux内核时决定编译器版本

时间:2018-02-20 12:15:05

标签: linux-kernel arm kernel embedded-linux gnu-toolchain

我的问题可能听起来很愚蠢,但这是我过去2天面临的一个简单问题。在编写这个问题时,最新的内核版本是4.14,但我想编译任何随机选择的旧版本(v3.2)。

我已经从主线仓库克隆了内核,并检查了正确的版本

git checkout -b v3.2 v3.2
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
make vexpress_defconfig
make -j8 all

这会引发错误:

  CC      arch/arm/vfp/vfpsingle.o
  LD      usr/built-in.o
  CC      arch/arm/kernel/elf.o
  CC      arch/arm/vfp/vfpdouble.o
  CC      arch/arm/mm/dma-mapping.o
  AS      arch/arm/kernel/entry-armv.o
  AS      arch/arm/kernel/entry-common.o
  CC      arch/arm/kernel/irq.o
  CC      arch/arm/kernel/process.o
  CC      arch/arm/kernel/ptrace.o
  CC      arch/arm/common/gic.o
  LD      init/mounts.o
init/do_mounts_initrd.o: In function `return_address':
/home/naveen/data/linux/arch/arm/include/asm/ftrace.h:51: multiple definition of `return_address'
init/do_mounts.o:/home/naveen/data/linux/arch/arm/include/asm/ftrace.h:51: first defined here
scripts/Makefile.build:427: recipe for target 'init/mounts.o' failed
make[1]: *** [init/mounts.o] Error 1
Makefile:945: recipe for target 'init' failed
make: *** [init] Error 2
make: *** Waiting for unfinished jobs....
  CC      arch/arm/common/icst.o
  CC      arch/arm/mm/extable.o
  CC      arch/arm/common/timer-sp.o
  CC      arch/arm/kernel/return_address.o
  CC      arch/arm/mm/fault.o
  CC      arch/arm/mm/init.o
  CC      arch/arm/mm/iomap.o
  CC      arch/arm/kernel/setup.o
  LD      arch/arm/common/built-in.o
arch/arm/kernel/return_address.c:62:2: warning: #warning "TODO: return_address should use unwind tables" [-Wcpp]
 #warning "TODO: return_address should use unwind tables"
  ^
arch/arm/kernel/return_address.c:65:7: error: redefinition of ‘return_address’
 void *return_address(unsigned int level)
       ^
In file included from include/linux/ftrace.h:19:0,
                 from arch/arm/kernel/return_address.c:12:
/home/naveen/data/linux/arch/arm/include/asm/ftrace.h:48:21: note: previous definition of ‘return_address’ was here
 extern inline void *return_address(unsigned int level)
                     ^
scripts/Makefile.build:305: recipe for target 'arch/arm/kernel/return_address.o' failed
make[1]: *** [arch/arm/kernel/return_address.o] Error 1
make[1]: *** Waiting for unfinished jobs....

我的所有步骤都来自this article应该一直有效的步骤。我可以弄清楚(在引用其他类似的文章和问题之后)所使用的编译器版本确实很重要。

我当前的编译器版本是:

insanecoder@worstation ~/data/linux $ arm-linux-gnueabi-gcc --version
arm-linux-gnueabi-gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609

我的问题是:在编译linux内核时,我是否应该真正处理编译器版本(工具链)?如果是,我怎么知道我的特定内核版本最合适的工具链/编译器版本。

我认为任何最新的工具链都应该关注所有以前的内核版本。由于缺少编译器选项(如果使用),旧编译器可能无法编译较新的内核版本。但是,反之亦然不应成为问题。

修改

这个问题的实质是为任何主线linux内核版本找到可靠的信息源,在这里可以找到有关编译器支持的编译器版本的信息。

目标不是编译特定版本的内核。例如,我能够用现有的设置编译v4.9。我只是随机选择旧版本以验证我的学习。

0 个答案:

没有答案