gcc-9编译Linux 3.14.0内核问题汇总
1 编译环境
1.1 操作系统
![]()
1.2 gcc
2 编译步骤
代码根目录执行:
make menuconfig
make –j8
3 问题汇总
3.1 code model kernel does not support PIC mode

原因是当前版本gcc默认开启了fpie,因此修改Makefile中的KBUILD_FLAGS,添加-fno-pie到其中:

参考:https://blog.csdn.net/qq_34905587/article/details/107386659
3.2 linux/compiler-gcc9.h: No such file or directory

原因是被编译内核代码版本太低,和gcc版本不匹配,因此把include/linux目录下的compiler-gcc4.h复制一份命名成compiler-gcc9.h:
参考:https://blog.csdn.net/ysheng76/article/details/104943794
3.3 storage size of ‘__mod_x86cpu_device_table’ isn’t known

原因是这个变量名由宏展开,MODULE_DEVICE_TABLE预期cpu类型结构体名字为x86cpu_device_id,因此在include/linux/mod_devicetable.h中添加如下定义:
#define x86cpu_device_id x86_cpu_id

参考:https://github.com/manjaro/packages-core/blob/master/linux318/fix-mod-devicetable.patch
3.4 ‘-mfentry’ isn’t supported for 32-bit in combination with ‘-fpic’

原因是当前版本gcc默认开启了fpic,因此修改Makefile中的CC_USING_FENTRY,添加-fno-pic到其中:
参考:https://blog.csdn.net/qq_34905587/article/details/107386659
3.5 storage size of ‘__mod_vmbus_device_table’ isn’t known

原因是这个变量名由宏展开,MODULE_DEVICE_TABLE预期vmbus类型结构体名字为vmbus_device_id,因此在include/linux/mod_devicetable.h中添加如下定义:
#define vmbus_device_id hv_vmbus_device_id

参考:https://github.com/manjaro/packages-core/blob/master/linux318/fix-mod-devicetable.patch
3.6 storage size of ‘__mod_rapidio_device_table’ isn’t known

原因是这个变量名由宏展开,MODULE_DEVICE_TABLE预期rapidio类型结构体名字为rapidio_device_id,因此在include/linux/mod_devicetable.h中添加如下定义:
#define rapidio_device_id rio_device_id

参考:https://github.com/manjaro/packages-core/blob/master/linux318/fix-mod-devicetable.patch
3.7 storage size of ‘__mod_mei_device_table’ isn’t known

原因是这个变量名由宏展开,MODULE_DEVICE_TABLE预期mei类型结构体名字为mei_device_id,因此在include/linux/mod_devicetable.h中添加如下定义:
#define mei_device_id mei_cl_device_id

参考:https://github.com/manjaro/packages-core/blob/master/linux318/fix-mod-devicetable.patch
3.8 static declaration of ‘qla8044_need_reset_handler’ follows non-static declaration

原因是qla_nx2.c中定义qla8044_need_reset_handler为static,而qla_gbl.h中声明不一致,注释掉声明即可:
3.9 multiple definition of `mpihelp_add'

原因是在lib/mpi/mpi-internal.h和lib/mpi/mpi-inline.h中都声明或定义了mpihelp_add、mpihelp_add_1、mpihelp_sub和mpihelp_sub_1,并且mpi-internal.h include了mpi-inline.h,而mpi-internal.h又被多次include,注释掉mpi-internal.h中的声明,把mpi-inline.h中的extern改成static即可:
后面还有多个类似的问题,都一样操作,将相应的extern改成static即可。
4 编译输出件
4.1 vmlinux
4.2 bzImage
相关推荐
CentOS 7下安装gcc 9.3.0
目录CentOS 7下安装gcc 9.3.0安装gcc安装bzip2下载gcc-9.3.0.tar.gz解压gcc-9.3.0.tar.gz安装gcc-9.3.0查看gcc版本注意事项 CentOS 7下安装gcc 9.3.0 本文主要介绍怎么在CentOS 7环境下安装GCC 9.3.0,适用于部分源码包需要高版本的gcc进行编译的场景,需要准备的环境有: CentOS 7 gcc-9.3.0.tar.gz 安装gcc 使用下面命令安装gcc、gcc-c++,若已安装则忽略此步骤 yum install -y gcc gcc-c++ 安装bzip2 使用以下命令安装bzip2,主要用于之
如何玩转CentOS Linux内核升级?手把手教你内核编译升级至最新版本
如何玩转CentOS Linux内核升级?手把手教你内核编译升级至最新版本1 升级环境2 升级需求2.1 升级前的内核版本2.2 升级后的内核版本3 升级步骤3.1 安装编译环境3.2 更新GCC版本
Ubuntu 18.04环境下Linux 0.11 内核编译及在bochs 2.6.9中的调试运行
Ubuntu 18.04环境下Linux 0.11 内核编译及在bochs 2.6.9中的调试运行
编译Linux内核的错误汇总
此文档是编译Linux内核的错误汇总,自己搜集了一些在编译Linux内核的时候出现的常见错误,希望对大家有用
linux-arm-gcc-4.9.2交叉编译工具
linux-arm-gcc-4.9.2交叉编译工具,已验证,决对可以使用


