文章目录
- 10. 内核编译
- 20.问题
- 1. 问题1:cc1: error: code model kernel does not support PIC mode
- 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
- 3. 问题3:/bin/sh: 1: flex: not found
- 4. 问题4:/bin/sh: 1: bison: not found
- 5. 问题5: scripts/sign-file.c:25:10: fatal error: openssl/opensslv.h: No such file or directory
- 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
10. 内核编译
开发环境
- Ubuntu1804
- gcc // 无交叉编译
编译步骤
- 下载源码:
方式一:官网下载压缩包,或者通过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
- 安装依赖
# 仅供参考:
sudo apt-get install build-essential kernel-package libncurses-dev bison flex libssl-dev libelf-dev
- 默认编译
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
- 问题:编译module时报错
- 原因:未指定交叉编译器,导致默认的编译器与内核出现一些功能不匹配的报错
- 解决:配置交叉编译环境
参考如下:
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
本文介绍了在Ubuntu18.04环境下编译Linux内核时遇到的五个问题,包括编译错误、依赖缺失等,并提供了相应的解决方法,如设置交叉编译环境、安装flex和bison等。
1036

被折叠的 条评论
为什么被折叠?



