一个OpenHarmony rk3568编译问题

发布于:2024-10-10 ⋅ 阅读:(13) ⋅ 点赞:(0)

Hihope的rk3568是OpenHarmony社区的样板项目,一般测试和验证代码问题都会使用该项目,但OpenHarmony工程庞大,实践中不免出现各种各样的问题。通常我们会使用如下命令编译rk3568项目

./build.sh --product-name rk3568 --ccache --no-prebuild-sdk --enable_notice_collection=false --gn-args build_product_type=DEBUG --gn-args load_test_config=false

在编译到内核时可能会报这样的错误:

  GEN     .tmp_initcalls.lds
  LTO     vmlinux.o
  MODPOST vmlinux.symvers
WARNING: modpost: vmlinux.o(___ksymtab_gpl+rockchip_clk_register_armclk+0x0): Section mismatch in reference from the variable __ksymtab_rockchip_clk_register_armclk to the function .init.text:rockchip_clk_register_armclk()
The symbol rockchip_clk_register_armclk is exported and annotated __init 
Fix this by removing the __init annotation of rockchip_clk_register_armclk or drop the export.

  MODINFO modules.builtin.modinfo
  GEN     modules.builtin
  LD      .tmp_vmlinux.btf
ld.lld: error: undefined symbol: __aarch64_cas4_acq_rel
>>> referenced by hdf_vnode_adapter.c:294 (/home/smile/OpenHarmony-v4.1.1-Release/out/kernel/OBJ/linux-5.10/../../../../drivers/hdf_core/framework/core/adapter/vnode/src/hdf_vnode_adapter.c:294)
>>>               vmlinux.o:(HdfVNodeAdapterIoctl)
>>> referenced by hdf_vnode_adapter.c:303 (/home/smile/OpenHarmony-v4.1.1-Release/out/kernel/OBJ/linux-5.10/../../../../drivers/hdf_core/framework/core/adapter/vnode/src/hdf_vnode_adapter.c:303)
>>>               vmlinux.o:(HdfVNodeAdapterIoctl)
>>> referenced by hdf_vnode_adapter.c:428 (/home/smile/OpenHarmony-v4.1.1-Release/out/kernel/OBJ/linux-5.10/../../../../drivers/hdf_core/framework/core/adapter/vnode/src/hdf_vnode_adapter.c:428)
>>>               vmlinux.o:(HdfDeviceSendEventToClient)
>>> referenced 1 more times
  BTF     .btf.vmlinux.bin.o
pahole: .tmp_vmlinux.btf: No such file or directory
  LD      .tmp_vmlinux.kallsyms1
ld.lld: error: .btf.vmlinux.bin.o: unknown file type
make[2]: *** [/home/smile/OpenHarmony-v4.1.1-Release/out/kernel/src_tmp/linux-5.10/Makefile:1225: vmlinux] Error 1
make[1]: *** [arch/arm64/Makefile:208: rk3568-toybrick-x0-linux.img] Error 2
make[1]: Leaving directory '/home/smile/OpenHarmony-v4.1.1-Release/out/kernel/OBJ/linux-5.10'
make: *** [Makefile:192: __sub-make] Error 2

这个问题的根本原因在这里有解释 undefined reference to `__aarch64_cas4_sync' error on arm64 native build ,简单来说就是编译器的默认参数有问题,因此可以修改出问题的内核模块编译参数。找到 hdf_vnode_adapter.c 的Makefile文件 drivers/hdf_core/adapter/khdf/linux/manager/Makefile,增加 -mno-outline-atomics 参数,如

ccflags-y += -mno-outline-atomics

修改完成后重新编译系统即可。

如果依然不能解决,可以尝试以下三种解决方法,第一种:

删除OBJ/linux-5.10目录后单编内核

cd out/kernel/src_tmp/linux-5.10
rm -rf ../../OBJ/linux-5.10
export KBUILD_OUTPUT=../../OBJ/linux-5.10
./make-ohos.sh TB-RK3568X0

第二种:

vim kernel/linux/patches/linux-5.10/rk3568_patch/kernel.patch

找到 +MAKE="make LLVM=1 LLVM_IAS=1 CROSS_COMPILE=aarch64-linux-gnu-" ,删除掉CROSS_COMPILE=aarch64-linux-gnu- ,然后重新编译系统。

第三种:

在build.log中找到内核的编译命令行,类似

/usr/bin/env ../../device/board/hihope/rk3568/kernel/build_kernel.sh ../../kernel/linux/linux-5.10 /home/smile/OpenHarmony-v4.1.1-Release/out/rk3568/packages/phone/images /home/smile/OpenHarmony-v4.1.1-Release/device/board/hihope/rk3568 vendor/hihope/rk3568 /home/smile/OpenHarmony-v4.1.1-Release rockchip rk3568 hihope root default disable_lto_O0 enable_ramdisk

复制后,进入out/rk3568目录,执行这个复制的命令行。如果编译通过,可以重新尝试编译系统。

其它解决方法可以尝试:rk3568 arm、arm64编译失败undefined symbol: __aarch64_cas4_acq_rel · Issue #I6VB7R · OpenHarmony/build - Gitee.com