gcc-9编译Linux 3.14.0内核问题汇总

lcc_0416 2022-04-13 21:47:52

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

 

 

 

 

 

 

 

 

 

 

...全文
1434 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
剑与月光 2022-09-12
  • 打赏
  • 举报
回复

感谢大佬的保姆级教程hh

4,465

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧