0%

编译过程中遇到的各种问题(持续更新)

我在用gcc编译时出现的错误如下,用ai解决这些问题之后,编译居然成功了
但是给我的米板4刷进去之后并不能开机……

二编:我换了个内核进行编译,还想集成kernelsu,可是一直都不成功,气得我鬼火冒

NR_CPUS配置错误

可能出现的报错:

1
include/trace/events/sched.h:875:2: error: #error "Unsupported NR_CPUS for lb tracepoint."

解决方法:

1
2
3
4
5
6
# 编辑内核配置
make menuconfig

# 进入"General setup" -> "Maximum number of CPUs"
# 将值设置为一个较小的数字(如8或16)
# 保存配置并退出

或者编辑内核配置文件

1
2
3
4
5
# 编辑.config文件
vi .config

# 找到并修改CONFIG_NR_CPUS
CONFIG_NR_CPUS=8

函数cpuid_feature_extract_field参数不匹配

可能出现的报错:

1
./arch/arm64/include/asm/kvm_mmu.h:309:17: error: too few arguments to function 'cpuid_feature_extract_field'

解决方法:

编辑文件./arch/arm64/include/asm/kvm_mmu.h,找到第309行附近的代码:

1
return (cpuid_feature_extract_field(reg, ID_AA64MMFR1_VMIDBITS_SHIFT) == 2) ? 16 : 8;

修改为:

1
return (cpuid_feature_extract_field(reg, ID_AA64MMFR1_VMIDBITS_SHIFT, 0) == 2) ? 16 : 8;\

注意:第三个参数的具体值需要根据cpuid_feature_extract_field函数的定义来确定,可能需要查看相关头文件

devfreq_simple_ondemand_data结构体类型不完整

可能出现的报错:

1
2
3
include/linux/mmc/host.h:331:54: error: field 'ondemand_gov_data' has incomplete type
331 | struct devfreq_simple_ondemand_data ondemand_gov_data;
| ^~~~~~~~~~~~~~~~~

解决方法:

1
2
3
4
5
6
# 编辑内核配置
make menuconfig

# 导航到以下路径并启用选项:
# Device Drivers -> Generic Driver Options -> Devfreq drivers -> Generic Dynamic Voltage and Frequency Scaling (DVFS) support
# 然后启用 "Simple Ondemand" governor

或者编辑内核配置文件

1
2
3
4
5
6
# 启用相关配置
echo "CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y" >> .config
echo "CONFIG_PM_DEVFREQ=y" >> .config

# 重新生成配置
make oldconfig

变量phdr重复声明

可能出现的报错:

1
2
3
4
5
6
7
drivers/soc/qcom/smem.c: In function 'qcom_smem_alloc_private':
drivers/soc/qcom/smem.c:305:39: error: redeclaration of 'phdr' with no linkage
305 | struct smem_partition_header *phdr;
| ^~~~
drivers/soc/qcom/smem.c:303:39: note: previous declaration of 'phdr' with type 'struct smem_partition_header *'
303 | struct smem_partition_header *phdr;
| ^~~~

解决方法:

1
2
3
4
5
6
# 编辑文件 drivers/soc/qcom/smem.c
vi drivers/soc/qcom/smem.c

# 找到函数 qcom_smem_alloc_private
# 删除第305行的重复声明:
# struct smem_partition_header *phdr;

或者用sed命令修复

1
2
# 删除第305行的重复声明
sed -i '305d' drivers/soc/qcom/smem.c

DTC链接错误

可能出现的报错:

1
2
3
4
/usr/bin/ld: scripts/dtc/dtc-parser.tab.o:(.bss+0x10): multiple definition of `yylloc'; scripts/dtc/dtc-lexer.lex.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status
make[3]: *** [scripts/Makefile.host:100:scripts/dtc/dtc] 错误 1
make[2]: *** [../scripts/Makefile.build:489:scripts/dtc] 错误 2

解决方式:
在内核源码根目录中找到Makefile文件
然后搜索找到HOSTCFLAGS项,添加HOSTCFLAGS += -fcommon
重新运行./build.sh

编译VDSO时出现的汇编语法错误

可能出现的报错:

1
2
3
../arch/arm64/kernel/vdso/gettimeofday.S:223:24: error: too many positional arguments
clock_gettime_return, shift=1
^

解决方式:
找到/arch/arm64/kernel/vdso/gettimeofday.S文件
然后修改此文件中第223、246和267行的宏调用方式:

1
2
3
4
5
# 原代码
clock_gettime_return, shift=1

# 应修改为
clock_gettime_return shift=1

然后重新运行./build.sh

ld无法辨认aarch64linux仿真模式

可能出现的报错:

1
2
/usr/bin/ld: 无法辨认的仿真模式: aarch64linux
支持的仿真: elf_x86_64 elf32_x86_64 elf_i386 elf_iamcu elf_l1om elf_k1om i386pep i386pe

解决方式:
移除/bin/ld以确保使用的是/bin/ld.lld