文章目录

  • 1. 编译内核
    • 1.1. 修改gcc优化等级
    • 1.2. 防止`modpost: Section mismatches detected.`错误
    • 1.3. 根据需要编译内核
    • 1.4. 修改子目录Makefile
    • 1.5. 重新执行编译
  • 2. 参考资料

1. 编译内核

进入kernel 源码目录

1.1. 修改gcc优化等级

diff --git a/Makefile b/Makefile
index d4d36c619..1047c83c6 100644
--- a/Makefile
+++ b/Makefile
@@ -701,11 +701,11 @@ KBUILD_CFLAGS     += $(call cc-disable-warning, format-overflow)KBUILD_CFLAGS  += $(call cc-disable-warning, address-of-packed-member)ifdef CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE
-KBUILD_CFLAGS += -O2
+KBUILD_CFLAGS += -O0else ifdef CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE_O3
-KBUILD_CFLAGS += -O3
+KBUILD_CFLAGS += -O0else ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
-KBUILD_CFLAGS += -Os
+KBUILD_CFLAGS += -O0endififdef CONFIG_CC_DISABLE_WARN_MAYBE_UNINITIALIZED

1.2. 防止modpost: Section mismatches detected.错误

如果此时直接执行make进行编译,会出现modpost: Section mismatches detected.错误。

解决方法是修改scripts/mod/modpost.c

diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index d2a30a7b3..58e2237c2 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -2670,7 +2670,7 @@ int main(int argc, char **argv)if (dump_write)write_dump(dump_write);
-       if (sec_mismatch_count && sec_mismatch_fatal)
+       if (0 && sec_mismatch_count && sec_mismatch_fatal)fatal("modpost: Section mismatches detected.\n""Set CONFIG_SECTION_MISMATCH_WARN_ONLY=y to allow them.\n");for (n = 0; n < SYMBOL_HASH_SIZE; n++) {

1.3. 根据需要编译内核

make tinyconfig ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- 2>&1 | tee -a build.log
make vmlinux -j4 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- 2>&1 | tee -a build_error.log

此时编译失败,原因是部分函数未定义,具体原因可以参考宋宝华: 关于Linux编译优化几个必须掌握的姿势

  MODINFO modules.builtin.modinfoLD      vmlinux
mm/page-writeback.o: In function `page_index':
page-writeback.c:(.text+0x21a4): undefined reference to `__page_file_index'
page-writeback.c:(.text+0x21a4): relocation truncated to fit: R_AARCH64_CALL26 against undefined symbol `__page_file_index'
mm/truncate.o: In function `truncate_exceptional_pvec_entries':
truncate.c:(.text+0x199c): undefined reference to `dax_delete_mapping_entry'
truncate.c:(.text+0x199c): relocation truncated to fit: R_AARCH64_CALL26 against undefined symbol `dax_delete_mapping_entry'
......
mm/rmap.o: In function `linear_page_index':
rmap.c:(.text+0x3110): undefined reference to `linear_hugepage_index'
Makefile:1077: recipe for target 'vmlinux' failed
make: *** [vmlinux] Error 1

1.4. 修改子目录Makefile

修改方法就是单独为提示存在未定义符号的文件修改gcc优化等级。方法是在Makefile中添加CFLAGS_file.o += -O

拷贝如下内容新建脚本enbale_O0.sh,使用enabel_O0.sh和上述编译失败的build_error.log文件,执行./enable_O0.sh build_error.log

#!/bin/bash# make clean -j16
# make all -j4 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- 2>&1 |tee -a build_error.logMAKE_LOG=""
BUILD_PATH="$(pwd -P)"if [ $# -ge 1 ]; thenMAKE_LOG=$1
elseecho "Usage: $(basename $0) build_error.log [build_path]"exit -1
fiif [ $# -ge 2 ]; thenif [ -d $2 ]; thenBUILD_PATH=$2BUILD_PATH=${BUILD_PATH%*/}elseecho "$2 No such directory"exit -1fi
fiif [ ! -f ${MAKE_LOG} ]; thenecho "${MAKE_LOG}: No such file"exit -1
fiadd_cflag()
{make_file=$1obj_file=$2if [ -e ${make_file} ]; thenline_no=$(grep -snv '^#' ${make_file}  \| cut -d : -f 1 | head -1)str_cflags="CFLAGS_${obj_file}"if [[ "" == "$(grep ${str_cflags}.*O ${make_file})" ]]; thencmd="${line_no}i\\${str_cflags} += -O"sed -i "${cmd}" ${make_file}echo "${make_file}: add ${str_cflags}"fifi
}vmlinux_add_cflag()
{log_file=$1filelist=$(grep -shw -B1 'undefined reference' ${log_file}      \| grep 'In function' | cut -d : -f 1 | sort -u)for f in ${filelist}dopath=$(dirname ${f})obj_file=$(basename ${f})make_file=${path}/Makefileadd_cflag ${make_file} ${obj_file}done
}process_one()
{# ERROR: "alloc_test_extent_buffer" [fs/btrfs/btrfs.ko] undefined!str=$1symbol=$(echo ${str} | awk '{print $2}')symbol=${symbol:1:0-1}      # 删除 ""ko=$(echo ${str} | awk '{print $3}')ko=${ko:1:0-1}             # 删除 []path=$(dirname ${ko})filelist=$(grep -rl ${symbol} ${BUILD_PATH}/${path}/*.o)echo $filelistmake_file=${path}/Makefilefor f in ${filelist}dof=${f#${BUILD_PATH}/}     # 从左边删除 "${BUILD_PATH}/"obj=$(basename ${f})add_cflag ${make_file} ${obj}done
}module_add_cflag()
{log_file=$1IFS=$'\n'       # 按行遍历str_list=$(grep -sh "^ERROR:.*undefined!" ${log_file} | sort -u)for str in ${str_list}doprocess_one ${str}done
}vmlinux_add_cflag ${MAKE_LOG}
module_add_cflag ${MAKE_LOG}

执行结束后,子目录Makefile改动如下:

diff --git a/mm/Makefile b/mm/Makefile
index d99684669..52a1962ea 100644
--- a/mm/Makefile
+++ b/mm/Makefile
@@ -2,6 +2,14 @@## Makefile for the linux memory manager.#
+CFLAGS_truncate.o += -O
+CFLAGS_rmap.o += -O
+CFLAGS_page-writeback.o += -O
+CFLAGS_mremap.o += -O
+CFLAGS_mprotect.o += -O
+CFLAGS_mincore.o += -O
+CFLAGS_memory.o += -O
+CFLAGS_gup.o += -OKASAN_SANITIZE_slab_common.o := nKASAN_SANITIZE_slab.o := n

1.5. 重新执行编译

make clean
make vmlinux -j4 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- 2>&1 | tee -a build_ok.log

此时可正常编译通过。

  MODINFO modules.builtin.modinfoLD      vmlinuxSORTEX  vmlinuxSYSMAP  System.map

2. 参考资料

  1. 宋宝华: 关于Linux编译优化几个必须掌握的姿势
  2. runninglinuxkernel_4

使用-O0编译Linux内核相关推荐

  1. linux编译.o文件,使用-O0编译Linux内核

    文章目录 1. 编译内核 1.1. 修改gcc优化等级 1.2. 防止`modpost: Section mismatches detected.`错误 1.3. 根据需要编译内核 1.4. 修改子目 ...

  2. Linux内核开发_1_编译LInux内核

    目录 1. 准备工作 1.1 学习环境 1.2 下载Linux内核源码 1.3 解压Linux内核 1.4 目录结构介绍 2. Linux内核配置 2.1 配置选项 1. make config 2. ...

  3. 安装debian总结以及编译linux内核

    1. 安装debian 使用unetbootin(http://unetbootin.sourceforge.net/)来创建启动盘,并且下载debian的基本包. 将磁盘进行压缩操作,并且保留出一个 ...

  4. 如何解决编译linux内核(解决声卡问题),遭遇fatal error: linux/limits.h: 没有那个文件或目录

    如何解决编译linux内核(解决声卡问题),遭遇fatal error: linux/limits.h: 没有那个文件或目录 参考文章: (1)如何解决编译linux内核(解决声卡问题),遭遇fata ...

  5. 【Linux 内核】编译 Linux 内核 ⑥ ( 安装 OpenSSL | 安装其它依赖库 | 内核编译完成 )

    文章目录 一.安装 OpenSSL 二.安装其它依赖库 三.Linux 内核编译完成 一.安装 OpenSSL 参考 [错误记录]编译 Linux 内核报错 ( fatal error: openss ...

  6. 【错误记录】编译 Linux 内核报错 ( fatal error: openssl/opensslv.h: No such file or directory )

    文章目录 一.报错信息 二.解决方案 一.报错信息 编译 Linux 内核 , 执行 sudo make 命令 , 开始正式编译 Linux 内核 , 报如下错误 : root@ubuntu:~/ke ...

  7. 【Linux 内核】编译 Linux 内核 ⑤ ( 查看 .config 编译配置文件 | 正式编译内核 )

    文章目录 一.查看 .config 编译配置文件 二.正式编译内核 一.查看 .config 编译配置文件 在上一篇博客 [Linux 内核]编译 Linux 内核 ④ ( 打开 Linux 内核编译 ...

  8. 【错误记录】编译 Linux 内核报错 ( /bin/sh: 1: bison: not found )

    文章目录 一.报错信息 二.解决方案 一.报错信息 编译 Linux 内核 , 执行 make menuconfig 配置菜单命令 , 报如下错误 : root@ubuntu:~/kernel/lin ...

  9. 【错误记录】编译 Linux 内核报错 ( /bin/sh: 1: flex: not found )

    文章目录 一.报错信息 二.解决方案 一.报错信息 编译 Linux 内核 , 执行 make menuconfig 配置菜单命令 , 报如下错误 : root@ubuntu:~/kernel/lin ...

最新文章

  1. ASP.Net中MD5加密-16位32位
  2. .net Tuple特性
  3. oracle tranc,ORACLE TRUNC()函数
  4. python 练习题-去重排序与字符串分割
  5. 学习笔记(21):Python网络编程并发编程-队列的使用
  6. 枚举重名_举重设计模式示例
  7. FEIM Studios 团队欢迎您加入
  8. 认识计算机硬件实验项目,实验1 认识计算机的硬件与硬件组装
  9. 项目周期一般多久_积木创意:影响小程序开发外包的周期因素有哪些?
  10. js中match的用法
  11. JVM、JRE、JDK、java ee sdk with jdk四者的区别
  12. VTM3.0代码阅读:xCheckRDCostMerge2Nx2N函数
  13. 微型计算机外观分为,2015计算机应用基础单选练习题1.1
  14. PaddleOCR体检报告识别
  15. Prometheus技术系列文章——prometheus调研总结
  16. js如何打开本地html文件,html、js获取本地文件夹路径,打开本地应用程序
  17. 一支笔的测试点_一张纸一支笔,简单一招教你自测是否有眼底黄斑病变
  18. 如何用服务器内存做系统盘,服务器内存扩容怎么做
  19. imshow函数的替代方案,非常方便
  20. 增强 扫描王 源码_OpenCV探索之路(二十二):制作一个类“全能扫描王”的简易扫描软件...

热门文章

  1. 专家建议恢复五一黄金周或者设新长假-全国假日办-五一假期-国家旅游局
  2. dell服务器显示屏不亮,戴尔台式机屏幕不亮的解决方法
  3. linux 快速删除大量小文件(数十万级别)
  4. GML与KML的区别
  5. 数据中心建筑绿色评价系统简介
  6. 计算机电教器材目录,电教设备
  7. 怎样更爽地看PDF杂志
  8. 高通工具SnapdragonProfiler的安装和基本使用说明
  9. biee的书 oracle_BIEE11G配置Oracle数据源
  10. 【DevOps】谁说大象不能跳舞?