【linux】kernel 编译个人小结

Ubuntu18.04内核编译常见问题及解决方案,
本文介绍了在Ubuntu18.04环境下编译Linux内核时遇到的五个问题,包括编译错误、依赖缺失等,并提供了相应的解决方法,如设置交叉编译环境、安装flex和bison等。

10. 内核编译

开发环境

  1. Ubuntu1804
  2. gcc // 无交叉编译

编译步骤

  1. 下载源码:
    方式一:官网下载压缩包,或者通过git、https等等下载
    方式二:Ubuntu 可以直接通过deb包的形式下载

参考命令:sudo apt-get install linux-source

2 配置编译环境

# 解压到指定路径中
tar -jxvf /usr/src/linux-source-5.4.0.tar.bz2 -C /workspace/
# cd /workspace/
# ln -s linux-source-5.4.0 kernel
  1. 安装依赖
# 仅供参考:
sudo apt-get install build-essential kernel-package libncurses-dev bison flex libssl-dev libelf-dev
  1. 默认编译
1. 生成.config

make defconfig			// 最小配置
# make menuconfig
# make saveconfig
# make oldconfig
2. 开始编译
make		// 无交叉编译环境
3. install等操作
略

20.问题

1. 问题1:cc1: error: code model kernel does not support PIC mode

  1. 问题:编译module时报错
  1. 原因:未指定交叉编译器,导致默认的编译器与内核出现一些功能不匹配的报错
  1. 解决:配置交叉编译环境

参考如下:
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
make


2. 问题2:/usr/bin/ld: scripts/dtc/dtc-parser.tab.o:(.bss+0x50): multiple definition of `yylloc’; scripts/dtc/dtc-lexer.lex.o:(.bss+0x0): first defined here

问题:编译报错,首次编译,应该是dtc工具没编译成功
原因:盲猜是本机编译环境问题,我工作的电脑是ubuntu1804和ubuntu2004都没有问题,换成我自己的ubuntu2204就出问题了。
看别人的说法,是gcc版本的问题,降版本就可以,没试过,但是感觉比较靠谱,因为我用的这个内核4.x版本,可能dtc用的编译器也是老版本吧,本机的gcc 11.2.0,可能有新特性吧,没细研究。
解决:看报错,找第一次报错的地方,修改变量作用域。

vi scripts/dtc/dtc-lexer.lex.c

- YYLTYPE yylloc;
+ extern YYLTYPE yylloc;

3. 问题3:/bin/sh: 1: flex: not found

问题 : 编译kernel报错,linux-5.5.19,make menuconfig

liam@VM-0-2-ubuntu:/workspace/kernel/linux-5.5.19$ make menuconfig
  HOSTCC  scripts/basic/fixdep
  UPD     scripts/kconfig/mconf-cfg
  HOSTCC  scripts/kconfig/mconf.o
  HOSTCC  scripts/kconfig/lxdialog/checklist.o
  HOSTCC  scripts/kconfig/lxdialog/inputbox.o
  HOSTCC  scripts/kconfig/lxdialog/menubox.o
  HOSTCC  scripts/kconfig/lxdialog/textbox.o
  HOSTCC  scripts/kconfig/lxdialog/util.o
  HOSTCC  scripts/kconfig/lxdialog/yesno.o
  HOSTCC  scripts/kconfig/confdata.o
  HOSTCC  scripts/kconfig/expr.o
  LEX     scripts/kconfig/lexer.lex.c
/bin/sh: 1: flex: not found
make[1]: *** [scripts/Makefile.host:9: scripts/kconfig/lexer.lex.c] Error 127
make: *** [Makefile:568: menuconfig] Error 2

原因 :命令缺失

解决 :sudo apt install flex


4. 问题4:/bin/sh: 1: bison: not found

问题 : 编译kernel报错,linux-5.5.19,make menuconfig

 $ make menuconfig
    LEX     scripts/kconfig/lexer.lex.c
  YACC    scripts/kconfig/parser.tab.[ch]
/bin/sh: 1: bison: not found
make[1]: *** [scripts/Makefile.host:17: scripts/kconfig/parser.tab.h] Error 127
make: *** [Makefile:568: menuconfig] Error 2

原因 :命令缺失

解决 :sudo apt install bison


5. 问题5: scripts/sign-file.c:25:10: fatal error: openssl/opensslv.h: No such file or directory

问题

make -j 20
 scripts/sign-file.c:25:10: fatal error: openssl/opensslv.h: No such file or directory
   25 | #include <openssl/opensslv.h>
      |          ^~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[1]: *** [scripts/Makefile.host:107: scripts/sign-file] Error 1
make[1]: *** Waiting for unfinished jobs....
  HOSTLD  scripts/genksyms/genksyms
make: *** [Makefile:1098: scripts] Error 2
make: *** Waiting for unfinished jobs....

原因 : lib库缺失

解决 :sudo apt install libssl-dev


6. 问题6: /usr/bin/ld: scripts/dtc/dtc-parser.tab.o:(.bss+0x50): multiple definition of `yylloc’; scripts/dtc/dtc-lexer.lex.o:(.bss+0x0): first defined here

问题:构建 Linux 内核或设备树编译器时链接报错重复定义

 /usr/bin/ld: scripts/dtc/dtc-parser.tab.o:(.bss+0x50): multiple definition of `yylloc'; scripts/dtc/dtc-lexer.lex.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status

原因:GCC版本问题

链接器发现符号 yylloc 被重复定义了,通常出现在 构建 Linux 内核或设备树编译器(DTC) 时,原因是:
GCC 10 及以上版本默认使用 -fno-common,导致未初始化的全局变量不再合并为 common 符号,而是视为强符号,从而触发 multiple definition 错误。

解决:添加编译 flag 恢复旧行为(推荐)

在 Makefile 或命令行中添加:
KBUILD_CFLAGS += -fcommon
或者临时编译时添加 HOSTCFLAGS="-fcommon"make HOSTCFLAGS="-fcommon" ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

过得精彩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值