You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复内核移植时platform_cpu_kill多重定义链接问题

内核移植platform_cpu_kill多重定义链接报错修复方案

问题根因定位

重定义报错本质是两个不同的编译目标输出了同名的全局符号platform_cpu_kill,触发链接器的重定义校验:

  • 错误日志明确标记两处定义分别来自mach-xxx/hotplug.c和mach-tyranno/hotplug.c
  • 你在mach-xxx目录下搜索不到第二处定义,是因为另一处定义位于同级的mach-tyranno目录下,搜索范围限制在了当前目录所以没有命中

修复步骤

  1. 检查内核编译配置,确保仅选中单个目标平台
    进入内核根目录执行make menuconfig,在System Type菜单下确认仅勾选了你正在移植的mach-xxx平台,取消mach-tyranno平台的编译勾选。配置修改完成后执行以下命令清理旧的编译产物,重新编译:
    make clean
    make -j$(nproc)
    
  2. 如果确实需要保留两个平台的编译配置,给platform_cpu_kill函数加作用域限制
    • 方案A(优先推荐):给你自己移植的mach-xxx/hotplug.c里的platform_cpu_kill函数加static修饰,限制符号作用域仅在当前文件内:
      110 static int platform_cpu_kill(unsigned int cpu)
      111 {
      112         return 1;
      113 }
      
    • 方案B:给函数加__weak修饰,声明为弱符号,链接器会优先选择非弱符号的定义,不会触发重定义报错:
      110 __weak int platform_cpu_kill(unsigned int cpu)
      111 {
      112         return 1;
      113 }
      
  3. 额外检查Makefile是否重复引入hotplug.o
    确认你的mach-xxx目录下的Makefile没有在其他obj-y/obj-m规则里重复包含hotplug.o,你提供的Makefile里仅在obj-$(CONFIG_PM)里引入了一次,只要没有额外重复引入就不需要修改。

验证方法

修改完成后重新编译,如果不再抛出multiple definition of 'platform_cpu_kill'报错即可,编译完成后可以执行以下命令确认符号唯一:

grep -r "platform_cpu_kill" vmlinux.symvers

正常仅会返回一条对应你移植平台的符号记录。

内容的提问来源于stack exchange,提问作者SK17

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 19:36:04