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

开启DRM_MSM内核配置后编译失败:符号多重定义问题求助

内核编译冲突修复与Techpack概念说明

一、Techpack是什么?

Techpack是高通为自家SoC推出的半开源/闭源扩展组件包,里面都是针对特定硬件优化的驱动、功能模块——比如显示、相机、音频这类和硬件强绑定的组件。它是高通在标准Linux内核之外做的定制补充代码,用来实现标准内核没覆盖的硬件特性,或者提升硬件性能。

二、冲突原因

你碰到的msm_dss_clk_set_rate等符号重复定义问题,本质是两套同功能驱动代码同时编译:

  • 开启DRM_MSM后,内核自带的MSM DRM驱动(路径drivers/gpu/drm/msm/)会编译dpu_io_util.c,里面定义了这些全局符号;
  • 仓库里的techpack/display/路径下,是高通Techpack提供的另一套显示驱动代码,其中sde_io_util.c也定义了完全一样的全局符号;
  • 链接器在合并目标文件时,发现同一个符号被定义了两次,直接抛出编译错误。

三、修复方案

给你三个可行的修复思路,按需选择:

方案1:禁用Techpack显示驱动

如果不需要Techpack的特殊显示功能,直接通过内核配置关掉它:

  • 执行make menuconfig进入图形配置界面;
  • 找到Techpack Display相关配置项(一般在Device Drivers > Display support或者单独的Techpack分类里),把它设为n(不编译);
  • 保存配置后重新编译内核即可。

方案2:修改符号作用域

如果必须同时保留两套代码,把其中一套的重复符号改成静态(只在当前文件可见):

  1. 打开重复定义的文件,比如techpack/display/msm/sde_io_util.c;
  2. 找到msm_dss_clk_set_rate这类重复函数,在函数开头加static关键字,示例:
    static int msm_dss_clk_set_rate(struct msm_dss_clk *clk, unsigned long rate)
    {
        // 原函数内容不变
    }
    
  3. 如果这些函数在头文件里有全局声明,也要对应改成静态或者删掉全局声明;
  4. 重新编译内核。

方案3:删除重复代码文件

直接删掉其中一套重复的代码文件:

  • 如果你打算用内核自带的MSM DRM驱动,就删掉techpack/display/msm/sde_io_util.c;
  • 如果要用Techpack的驱动,就删掉drivers/gpu/drm/msm/disp/dpu1/dpu_io_util.c;
  • 注意删之前确认下该文件没有其他依赖代码,别搞出新的编译错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 13:02:34