我的问题可能听起来很愚蠢,但这是我过去两天面临的一个简单问题。在写这个问题时,最新的内核版本是 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....
我的所有步骤都遵循这篇文章,应该有效。我所能弄清楚的(在参考了其他类似的文章和问题之后)所使用的编译器版本确实很重要。
我当前的编译器版本是:
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。我只是随机选择了一个旧版本来验证我的学习。
我只测试了2个内核版本的这个方法,所以你们需要在使用它作为指南/手册之前进行更多测试
所以我们需要在这个网站上检查内核版本以获得准确的 yocto(poky)版本来获取工具
https://wiki.yoctoproject.org/wiki/Linux_Yocto
例如我想构建内核 5.10.xx -> linux-yocto_5.10 -> Yocto Project 3.3/3.4/4.0
我选择3.4
然后访问这个网站
https://downloads.yoctoproject.org/
选择 /releases/yocto/yocto-3.4.4/toolchain/x86_64/ x86_64是我的主机,目标是arm64(所以我选择交叉编译器,如果你想使用本机编译器就在这个文件夹中找到)
进入主机,使用此命令下载工具链
wget poky-glibc-x86_64-core-image-minimal-cortexa57-qemuarm64-toolchain-ext-3.4.4.sh
并授予它权限(chmod 777 poky-...)然后执行 最后,执行上述命令后,按照屏幕上的指南来“获取”环境