如何修复内核移植时platform_cpu_kill多重定义链接问题
内核移植
platform_cpu_kill多重定义链接报错修复方案 问题根因定位
重定义报错本质是两个不同的编译目标输出了同名的全局符号platform_cpu_kill,触发链接器的重定义校验:
- 错误日志明确标记两处定义分别来自
mach-xxx/hotplug.c和mach-tyranno/hotplug.c - 你在
mach-xxx目录下搜索不到第二处定义,是因为另一处定义位于同级的mach-tyranno目录下,搜索范围限制在了当前目录所以没有命中
修复步骤
- 检查内核编译配置,确保仅选中单个目标平台
进入内核根目录执行make menuconfig,在System Type菜单下确认仅勾选了你正在移植的mach-xxx平台,取消mach-tyranno平台的编译勾选。配置修改完成后执行以下命令清理旧的编译产物,重新编译:make clean make -j$(nproc) - 如果确实需要保留两个平台的编译配置,给
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 }
- 方案A(优先推荐):给你自己移植的
- 额外检查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
相关产品推荐
相关产品推荐

