4,465
社区成员




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
感谢大佬的保姆级教程hh