遇到“Unknown symbol xxx”怎么办?(So easy)

Why:为什么会出现“Unknown Symbol”

当你insmod加载一个ko模块时,它总需要依赖一些其他模块。比如在linux上display驱动会依赖drm、drm_kms_helper等。如果被依赖的模块还未加载,而直接加载目标ko,则会出现“Unknown Symbol”的情况,即“未知符号”,也即“找不到模块依赖的xxx函数接口”。
如下:

xxgpu: Unknown symbol drm_dp_clock_recovery_ok (err -2)

Where:怎么查找所在模块

可以根据日志查看缺少的函数接口,从函数名出发,定位所在ko库。

  1. 查找驱动文件
    drm_dp_clock_recovery_okdrivers/gpu/drm/display/drm_dp_helper.c文件中定义。
    // drivers/gpu/drm/display/drm_dp_helper.c
    bool drm_dp_clock_recovery_ok(const u8 link_status[DP_LINK_STATUS_SIZE],
    			int lane_count)
    {
    	int lane;
    	u8 lane_status;
    
    	for (lane = 0; lane < lane_count; lane++) {
    		lane_status = dp_get_lane_status(link_status, lane);
    		if ((lane_status & DP_LANE_CR_DONE) == 0)
    			return false;
    	}
    	return true;
    }
    EXPORT_SYMBOL(drm_dp_clock_recovery_ok);
    
  2. 查找库
    drm_dp_helper.cdrivers/gpu/drm/display/Makefile位置被编译,打包到drm_display_helper库,同时受CONFIG宏CONFIG_DRM_DISPLAY_DP_HELPER控制。
    // drivers/gpu/drm/display/Makefile
    drm_display_helper-$(CONFIG_DRM_DISPLAY_DP_HELPER) += \
    	drm_dp_dual_mode_helper.o \
    	drm_dp_helper.o \
    	drm_dp_mst_topology.o \
    	drm_dsc_helper.o
    

How:如何加载这个模块

  1. 首先确认系统中是否包含这个库。
    可以使用find命令查找这个库文件:
    find / -name drm_display_helper.ko
    
    一般会在/usr/lib/modules/$(uname -r)/kernel/drivers/gpu/drm/display/drm_display_helper.ko
  2. 如果有这个库文件,则可以直接加载
    sudo insmod $(path)/drm_display_helper.ko
    
  3. 如果没有这个库文件,则需要确认是否开启了CONFIG_DRM_DISPLAY_DP_HELPER
    修改config文件:
    make menuconfig
    
    待系统中包含了drm_display_helper.ko之后,再执行加载命令:
    sudo insmod $(path)/drm_display_helper.ko
    

Done:加载目标库

drm_display_helper库加载之后,Unknown symbol的问题就解决了,接下来就可以加载目标库文件。

sudo insmod xxxgpu.ko

Display依赖的几个库

缺少drm_display_helper库(linux6.6)

/usr/lib/modules/$(uname -r)/kernel/drivers/gpu/drm/display/drm_display_helper.ko

xxgpu: Unknown symbol drm_dp_clock_recovery_ok (err -2)
xxgpu: Unknown symbol drm_dsc_compute_rc_parameters (err -2)
xxgpu: Unknown symbol drm_dp_get_adjust_request_voltage (err -2)
xxgpu: Unknown symbol drm_dp_channel_eq_ok (err -2)
xxgpu: Unknown symbol drm_dp_bw_code_to_link_rate (err -2)
xxgpu: Unknown symbol drm_dp_aux_unregister (err -2)
xxgpu: Unknown symbol drm_dp_psr_setup_time (err -2)
xxgpu: Unknown symbol drm_dp_dpcd_write (err -2)
xxgpu: Unknown symbol drm_dp_dpcd_read (err -2)
xxgpu: Unknown symbol drm_dp_link_train_channel_eq_delay (err -2)
xxgpu: Unknown symbol drm_scdc_write (err -2)
xxgpu: Unknown symbol drm_scdc_read (err -2)
xxgpu: Unknown symbol drm_dp_aux_register (err -2)
xxgpu: Unknown symbol drm_scdc_set_scrambling (err -2)
xxgpu: Unknown symbol drm_dsc_pps_payload_pack (err -2)
xxgpu: Unknown symbol drm_scdc_set_high_tmds_clock_ratio (err -2)
xxgpu: Unknown symbol drm_dp_dpcd_read_link_status (err -2)
xxgpu: Unknown symbol drm_dp_get_adjust_request_pre_emphasis (err -2)
xxgpu: Unknown symbol drm_dp_link_train_clock_recovery_delay (err -2)

缺少drm_kms_helper库(linux5.4)

/usr/lib/modules/$(uname -r)/kernel/drivers/gpu/drm/drm_kms_helper.ko

xxgpu: Unknown symbol drm_dp_channel_eq_ok (err -2)
xxgpu: Unknown symbol drm_atomic_helper_crtc_reset (err -2)
xxgpu: Unknown symbol drm_atomic_helper_update_plane (err -2)
xxgpu: Unknown symbol drm_atomic_helper_plane_duplicate_state (err -2)
xxgpu: Unknown symbol drm_mode_config_helper_suspend (err -2)
xxgpu: Unknown symbol drm_scdc_read (err -2)
xxgpu: Unknown symbol drm_atomic_helper_update_legacy_modeset_state (err -2)
xxgpu: Unknown symbol drm_atomic_helper_connector_destroy_state (err -2)
xxgpu: Unknown symbol drm_dp_clock_recovery_ok (err -2)
xxgpu: Unknown symbol drm_dp_get_adjust_request_pre_emphasis (err -2)
xxgpu: Unknown symbol drm_dp_get_adjust_request_voltage (err -2)
xxgpu: Unknown symbol drm_atomic_helper_crtc_duplicate_state (err -2)
xxgpu: Unknown symbol drm_atomic_helper_connector_duplicate_state (err -2)
xxgpu: Unknown symbol drm_atomic_helper_connector_reset (err -2)
xxgpu: Unknown symbol drm_scdc_set_scrambling (err -2)
xxgpu: Unknown symbol drm_atomic_helper_disable_plane (err -2)
xxgpu: Unknown symbol drm_dp_bw_code_to_link_rate (err -2)
xxgpu: Unknown symbol drm_dp_dpcd_read_link_status (err -2)
xxgpu: Unknown symbol drm_atomic_helper_crtc_destroy_state (err -2)
xxgpu: Unknown symbol drm_dsc_pps_payload_pack (err -2)
xxgpu: Unknown symbol drm_dp_link_train_clock_recovery_delay (err -2)
xxgpu: Unknown symbol drm_atomic_helper_page_flip (err -2)
xxgpu: Unknown symbol drm_atomic_helper_check_planes (err -2)
xxgpu: Unknown symbol drm_dp_aux_register (err -2)
xxgpu: Unknown symbol drm_atomic_helper_cleanup_planes (err -2)
xxgpu: Unknown symbol drm_helper_probe_single_connector_modes (err -2)
xxgpu: Unknown symbol drm_mode_config_helper_resume (err -2)
xxgpu: Unknown symbol drm_atomic_helper_shutdown (err -2)
xxgpu: Unknown symbol drm_gem_fb_create (err -2)
xxgpu: Unknown symbol drm_kms_helper_poll_init (err -2)
xxgpu: Unknown symbol drm_atomic_helper_check_modeset (err -2)
xxgpu: Unknown symbol drm_dp_psr_setup_time (err -2)
xxgpu: Unknown symbol drm_atomic_helper_commit_modeset_enables (err -2)
xxgpu: Unknown symbol drm_scdc_write (err -2)
xxgpu: Unknown symbol drm_helper_probe_detect (err -2)
xxgpu: Unknown symbol drm_dp_dpcd_write (err -2)
xxgpu: Unknown symbol drm_atomic_helper_fake_vblank (err -2)
xxgpu: Unknown symbol drm_dp_dpcd_read (err -2)
xxgpu: Unknown symbol drm_atomic_helper_commit_hw_done (err -2)
xxgpu: Unknown symbol drm_dp_aux_unregister (err -2)
xxgpu: Unknown symbol drm_atomic_helper_commit_modeset_disables (err -2)
xxgpu: Unknown symbol drm_atomic_helper_plane_destroy_state (err -2)
xxgpu: Unknown symbol drm_dsc_compute_rc_parameters (err -2)
xxgpu: Unknown symbol drm_fbdev_generic_setup (err -2)
xxgpu: Unknown symbol drm_atomic_helper_commit_planes (err -2)
xxgpu: Unknown symbol drm_atomic_helper_commit (err -2)
xxgpu: Unknown symbol drm_scdc_set_high_tmds_clock_ratio (err -2)
xxgpu: Unknown symbol drm_atomic_helper_set_config (err -2)
xxgpu: Unknown symbol drm_self_refresh_helper_alter_state (err -2)
xxgpu: Unknown symbol drm_gem_fb_get_obj (err -2)
xxgpu: Unknown symbol drm_kms_helper_poll_fini (err -2)
xxgpu: Unknown symbol drm_kms_helper_hotplug_event (err -2)
xxgpu: Unknown symbol drm_atomic_helper_plane_reset (err -2)
xxgpu: Unknown symbol drm_dp_link_train_channel_eq_delay (err -2)

缺少gpu_sched库(linux5.4)

/usr/lib/modules/$(uname -r)/kernel/drivers/gpu/drm/scheduler/gpu-sched.ko

xxgpu: Unknown symbol drm_sched_entity_push_job (err -2)
xxgpu: Unknown symbol drm_sched_init (err -2)
xxgpu: Unknown symbol drm_sched_job_init (err -2)
xxgpu: Unknown symbol drm_sched_entity_init (err -2)
xxgpu: Unknown symbol drm_sched_stop (err -2)
xxgpu: Unknown symbol drm_sched_job_cleanup (err -2)
xxgpu: Unknown symbol drm_sched_resubmit_jobs (err -2)
xxgpu: Unknown symbol drm_sched_start (err -2)
xxgpu: Unknown symbol drm_sched_entity_destroy (err -2)
xxgpu: Unknown symbol drm_sched_fini (err -2)
xxgpu: Unknown symbol drm_sched_increase_karma (err -2)

insmod 与 modprobe

modprobe命令相对于insmod来讲,会更加方便。

insmod:
insmod命令用于载入指定模块。
只载入当前指定的模块,不会载入相依的模块。

modprobe:
modprobe可载入指定的个别模块,或是载入一组相依的模块。
modprobe会根据depmod所产生的相依关系,决定要载入哪些模块。
若在载入过程中发生错误,在modprobe会卸载整组的模块。

sudo modprobe xxx来加载xxx.ko,并会自动加载xxx.ko所依赖的库。

insmod

使用insmod加载xxxgpu.ko,需要挨个手动加载。先加载被依赖库,再加载目标库,顺序不能乱,否则会出现“Unknown symbol”。

$ lsmod | grep drm
# drm
$ sudo insmod /lib/modules/5.4.0-42-generic/kernel/drivers/gpu/drm/drm.ko
$ lsmod | grep drm
drm                   491520  0
# sysfillrect, syscopyarea, sysimgblt
$ sudo insmod /lib/modules/5.4.0-42-generic/kernel/drivers/video/fbdev/core/sysfillrect.ko
$ sudo insmod /lib/modules/5.4.0-42-generic/kernel/drivers/video/fbdev/core/syscopyarea.ko
$ sudo insmod /lib/modules/5.4.0-42-generic/kernel/drivers/video/fbdev/core/sysimgblt.ko
$ lsmod | grep -E drm\|fb\|sys
sysimgblt              16384  0
syscopyarea            16384  0
sysfillrect            16384  0
drm                   491520  0
# fb_sys_fops
$ sudo insmod /lib/modules/5.4.0-42-generic/kernel/drivers/video/fbdev/core/fb_sys_fops.ko
$ lsmod | grep -E drm\|fb\|sys
fb_sys_fops            16384  0
sysimgblt              16384  0
syscopyarea            16384  0
sysfillrect            16384  0
drm                   491520  0
# drm_kms_helper
$ sudo insmod /lib/modules/5.4.0-42-generic/kernel/drivers/gpu/drm/drm_kms_helper.ko
$ lsmod | grep -E drm\|fb\|sys
drm_kms_helper        184320  0
fb_sys_fops            16384  1 drm_kms_helper
sysimgblt              16384  1 drm_kms_helper
syscopyarea            16384  1 drm_kms_helper
sysfillrect            16384  1 drm_kms_helper
drm                   491520  1 drm_kms_helper
# drm_display_helper, gpu-sched
$ sudo insmod /lib/modules/$(uname -r)/kernel/drivers/gpu/drm/display/drm_display_helper.ko # kernel6.6
$ sudo insmod /lib/modules/5.4.0-42-generic/kernel/drivers/gpu/drm/scheduler/gpu-sched.ko
# xxgpu.ko
$ sudo insmod $(path)/xxgpu.ko

modprobe

$ lsmod | grep drm # 此时没有drm相关的库被加载
$ sudo modprobe xxgpu
$ lsmod | grep -E drm\|fb\|sys\|gpu # 自动加载了依赖的库
Module                  Size  Used by
xxgpu                3313664  0
gpu_sched              32768  1 xxgpu
drm_kms_helper        184320  3 xxgpu
drm                   491520  4 gpu_sched,xxgpu,drm_kms_helper
fb_sys_fops            16384  1 drm_kms_helper
syscopyarea            16384  1 drm_kms_helper
sysfillrect            16384  1 drm_kms_helper
sysimgblt              16384  1 drm_kms_helper
$ sudo modprobe -r xxgpu # 自动卸载依赖相关的库
$ lsmod | grep -E drm\|fb\|sys\|gpu # 空空如也
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值