首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >生成了中间文件导致 ko文件冲突?

生成了中间文件导致 ko文件冲突?

原创
作者头像
用户10171634
发布2025-10-16 20:07:56
发布2025-10-16 20:07:56
1980
举报

你这个问题非常关键 ⚙️ ——“生成了中间文件导致 .ko 文件冲突”,在 Android/MTK 平台编译内核模块(Kernel Module) 时是一个常见的坑。 我来帮你详细拆解原因与解决思路👇


💥 一、什么是「中间文件导致 .ko 冲突」?

当你执行 makemmm 时,编译系统会在如下目录生成中间产物:

代码语言:javascript
复制
out/
├── target/
├── obj/
│   ├── KERNEL_OBJ/
│   ├── KERNEL_MODULES/
│   ├── ...  ← 中间文件都在这里

如果你:

  • 修改了 .c.h 或 Makefile,
  • 或切换了不同的内核配置(例如 Android 14 vs Android 15 的 v_sys 与 u_sys), 但没有清理旧的 out/ 文件夹,

那么旧版本编译生成的 .o(目标文件)或 .mod.c 文件就可能被复用, 导致生成的 .ko 文件冲突(符号不匹配、重复定义、版本签名不同)。


⚠️ 二、常见错误现象

  1. 报错信息类似: ERROR: could not insert module xxx.ko: Invalid module format 或者: conflicting module names: xxx.ko already defined
  2. 链接阶段冲突: ld: duplicate symbol xxx_init ld: warning: module version mismatch
  3. 不同路径生成同名模块: out/target/product/xxx/obj/KERNEL_OBJ/drivers/abc/abc.ko out/target/product/xxx/obj/KERNEL_MODULES/abc/abc.ko → 导致系统最终不知道该用哪个 .ko

🔍 三、为什么 Android 编译会产生这种情况?

因为 Android 的 build system (Soong + Make) 支持增量编译。 当你切换不同的系统版本(例如 u_sysv_sys), 或者仅部分重新编译 vendor 代码时:

  • 系统不会自动清理旧的中间文件;
  • 导致相同模块路径下,遗留了不同内核版本编译的 .o 文件;
  • 链接时就会冲突。

🧹 四、解决方案

✅ 方案 1:彻底清理中间文件再编译

执行:

代码语言:javascript
复制
make clean
make clobber

或手动删除:

代码语言:javascript
复制
rm -rf out/target/product/*/obj/KERNEL_OBJ
rm -rf out/target/product/*/obj/KERNEL_MODULES

然后重新:

代码语言:javascript
复制
source build/envsetup.sh
lunch <your_target>
make -j$(nproc)

⚠️ 特别是从 u_sys(Android 14)切到 v_sys(Android 15)时,一定要清干净。


✅ 方案 2:仅清特定模块

如果你只改了一个模块,比如 drivers/misc/example,可以:

代码语言:javascript
复制
cd kernel-xxx/drivers/misc/example
make clean

然后在 Android 顶层重新构建:

代码语言:javascript
复制
mmm kernel-xxx/drivers/misc/example

✅ 方案 3:检查 .ko 路径冲突

搜索系统中重复的 .ko 文件:

代码语言:javascript
复制
find out/ -name "*.ko" | grep your_module_name

确认是否同一个模块被不同路径生成两次。


✅ 方案 4:关闭并行冲突(极端情况)

.configMakefile 中,确保相同模块名不会在不同目录被 include 两次。 有时 MTK 设备 vendor 代码会重复定义一个模块(如 mtk_bt_drv.ko)。


🔧 五、建议实践

操作

建议

切系统版本

make clean 一次

改内核配置

rm -rf out/target/product/*/obj/KERNEL_OBJ

同名模块冲突

检查 vendor/ 和 device/mediatek/ 中是否同时定义

新增模块

确认 Android.mk / Android.bp 没有重复导出相同名字


要不你贴一下报错日志中关于 .ko 的冲突那一段? 我可以帮你 pinpoint 到是哪个中间产物或路径引起的冲突。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 💥 一、什么是「中间文件导致 .ko 冲突」?
  • ⚠️ 二、常见错误现象
  • 🔍 三、为什么 Android 编译会产生这种情况?
  • 🧹 四、解决方案
    • ✅ 方案 1:彻底清理中间文件再编译
    • ✅ 方案 2:仅清特定模块
    • ✅ 方案 3:检查 .ko 路径冲突
    • ✅ 方案 4:关闭并行冲突(极端情况)
  • 🔧 五、建议实践
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档