#KernelSU# #内核比rom还重要# #内核#
(coolapk 不支持 Markdown ,凑活看吧.jpg)
注:
1.本人是小白,如有勘误请多多指教。
2.我会默认读者看过我上一篇文章。
context (仅供娱乐):
你是一个开挂大手子,听说昨天有个大佬开发了 xx 最新内核驱动能过三角洲检测。你为了带妹装逼于是就要到了文件。然后跟着 coolapk 上不计其数的编译教程开始编译,然后遇到了一堆报错,然后就没有然后了。
所以遇到编译报错要怎么办呢?删库跑路吗?不!报错不应该成为阻挡每个人求知的脚步。本文章会列出部分报错供参考。
注: 本文章会有一些旁门左道,请谨慎使用。
编译前报错
1.xxx not found
依赖没装全,解决办法用包管理器搜索相关字符串然后安装。但是有些包会没有,例如 生成 dtbo.img 时部分源码的 mkdtboimg.py 会用到 Python2. 但是软件源里没有。
解决办法办法: 1.用旧版本源安装,2.手动编译,3.关掉生成 dtbo 选项,只生成内核,以此类推。
2. .config file does noe exist
检查配置阶段是否配置了 O= 变量,如果配置过了则需要添加进去。
3. can’t source xxx/Kconfig
没有 Kconfig 文件,多出于 oplus 内核。
解决办法: 下载对应的 vendor kernel source 并放到指定位置。可查看 xxx 指向的链接然后调整位置。
4. gold linker is not supported.
内核不支持 gold 连接器,解决办法: 换成 bfd linker 或者 lld linker。如 LD=ld.lld
5. /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
检查 本机 linker 的路径。如果认为没有问题但还是出现了这个报错的话请将 YYLTYPE yylloc 这行前面加上 extern
6. Kconfig: syntax error/invaild option
Kconfig 语法问题,没救了,换个源码吧,
7. exec format error
多出现在 arm64 环境编译时,而对应工具使用了不同的编译架构,如 amd64
解决方法: 使用 box64 或者 qemu-user-static
编译时报错(指的是从 WARP 到 OBJCOPY 阶段)
此阶段排错方向为 编译器 > 配置文件 > 源码
当然并不是一定得遵循这个方向。这个方向只是给个参考。
注: 我们的目标是先解决报错,再解决启动的问题。
注: 少部分报错是配置阶段直接使用 defconfig 导致的
注: 善用 ai,不要滥用,也不要伸手。多动脑。
1.固定报错部分
- 1.error:CROSS_COMPILE_ARM32 not defined or empty, the compat vDSO will not be built.
没有指定 32 位交叉编译器
解决办法: 1,指定一个 32 位交叉编译器。2,配置文件中关掉 CONFIG_COMPAT_VDSO - 2.ld: unknown -xxx option
linker 不支持这个参数
解决办法: 1,换一个支持的 linker, 2.检查报错文件夹的 Makefile 或者 KBuild 是否有这个参数然后删掉。 - 3.xxx.h not found
没有这个头文件
解决办法: 使用 find 命令找到这个头文件,复制到报错目录,修改编译报错的 c 文件中出错的行(编译器会给出来)改成 “xxx.h” - 4.no number named xxx
类没有成员变量 xxx,处理类定义之前,发现了同名的宏,在预处理阶段把类成员当成了宏作为宏的替换
解决方法:
#ifdef xxx
#undef xxx
#endif
2.不固定报错部分
- 1.带-Werror参数报错并给出了修正提示
解决方法: 1.在编译参数添加 KCFLAGS+=”-Wno-error”.2.修改对应Makefile并在第一行添加 KCFLAGS+=”-Wno-error” 3.按照提示修改,4.换编译器,5.配置文件关掉这个功能,6.换源码 - 2.-Werror参数报错但没有出了修正提示
解决办法同上,但第三点不适用。 - 3.编译错误但是错误点指向的符号
检查是否漏写分号,花括号等,或者换一个源码
3.链接部分 - 1.符号问题
多为符号未定义或者符号重定义。
符号未定义: 检查符号是否声明,是否定义了实现。是否在作用范围内,或者关掉对应选项
2.符号重定义
函数不匹配,检查对应函数或者头文件,如一个是 #include <asm/uaccess.h> 一个是#include <linyx/uaccess.h> 且都调用了相同的函数,这个时候需要吧asm改成linux,或者关掉对应选项
3类似于 .Section mismatch in reference from the function bootloader_log_probe() to the function .init.text:of_bootloader_log_platform_data() 这样的报错
一个用了 __init 一个没用,__init的意思是仅在系统启动时使用。检查函数是否启动后一直使用然后确定是否去掉或加上 __init
-------------本文结束感谢您的阅读-------------