加载内核模块-Unknown symbol错误分析

Visual Studio写Linux内核模块?VisualGDB+VisualKernel实战踩坑与性能调优指南 本文详细介绍了如何使用VisualGDB和VisualKernel在Visual Studio中开发Linux内核模块,涵盖环境搭建、开发工作流、常见问题解决及性能调优技巧。特别针对ARM架构嵌入式系统,提供了实用的配置建议和调试方法,帮助开发者在Windows环境下高效完成Linux内核模块开发。 阅读详情

在调试过程中,发现一个问题,编译生成一个KO文件,insmod加载后报错:

Unknown symbol var_set_integer (err 0)

Unknown symbol parse_arg_eq (err 0)

 

问题分析思路:

一、用命令查看内核中是否已有这个内核符号,

例如要查看是否有var_set_integer这个内核符号,输入命令:

#cat   /proc/kallsyms  | grep "var_set_integer"

没有相关打印,而输入其它的函数名则会有打印信息。

如果内核中已经包含了这个符号,那么就会有相关的打印信息,否则不打印。

注:

/proc/kallsyms会显示内核中所有的符号,但是这些符号不是都能被其他模块引用的(绝大多数都不能),能被导出的是符号的类型是大写的那些(例如T,U)。

 

 

二、使用modinfo查看内核相关信息,确定模块依赖关系,再进一步确认符号调用。

例如:

[root@localhost sw_64-3_8]# modinfo linux-bcm-core.ko 
filename:        linux-bcm-core.ko
license:          GPL                                            //权限
description:    BCM Core Device Driver
depends:        linux-kernel-bde                         // 由此可看出linux-bcm-core.ko 依赖于linux-kernel-bde.ko
vermagic:       3.8.0-sw2f SMP mod_unload modversions  //内核版本

 

三、在源码中搜索这几个函数定义的地方,看是否有使用EXPORT_SYMBOL,是否有extern声明;

       并且查看是否要做GPL声明:修改为 MODULE_LICENSE("GPL");

  (1)如果你的模块需要输出符号给其他模块使用, 应当使用下面的宏定义:
EXPORT_SYMBOL(name);
EXPORT_SYMBOL_GPL(name);//只用于包含 GPL 许可权的模块。

 

符号必须在模块文件的全局部分输出, 在任何函数之外, 因为宏定义扩展成一个特殊用途的并被期望是全局存取的变量的声明. 这个变量存储于模块的一个特殊的可执行部分( 一个 "ELF 段" ), 内核用这个部分在加载时找到模块输出的变量. 

 

  (2)EXPORT_SYMBOL使用方法:
1)在模块函数定义之后使用EXPORT_SYMBOL(函数名);
2)在调用该函数的模块中使用extern对之声明;
3)首先加载定义该函数的模块,再加载调用该函数的模块。【模块加载顺序的前后要求,一般就是依赖于符号调用】

编译生成ko模块之后,用insmod命令加载此模块到内核。这个程序加载模块的代码段和数据段到内核。

接着, 连接模块中任何未解决的符号到内核的符号表上.

也就是说:

【insmod使用公共内核符号表来解析模块中未定义的符号】,公共内核符号表中包含了所有的全局内核项(即函数和变量)的地址,这是实现模块化驱动程序所必需的。

同时也可以【导出自身模块中的任何内核符号到公共内核符号表】,如图:

在通常情况下,模块只需实现自己的功能,而无需导出任何符号。但是,如果其他模块需要从某个模块中获得好处时,我们也可以导出符号。

 

四、在模块目录下查看Module.symvers,看是否存在要找的符号。

Module.symvers contains a list of all exported symbols from a kernel build.  

Module.symvers包含所有要导出的列表符号。

 Module.symvers file 的语法格式:
      <CRC>         <Symbol>              <module>
   0x2d036834    scsi_remove_host     drivers/scsi/scsi_mod

当内核编译选项CONFIG_MODVERSIONS关闭时,所有的CRC值都为0x00000000。

 

 

补充:

1,

【 Linux模块间通讯方法非常的多,最便捷的方法莫过于函数符号导出,然后直接调用。】

2,

驱动也是存在于内核空间的,它的每一个函数每一个变量都会有对应的符号,这部分符号也可以称作内核符号,
它们不导出(EXPORT_SYMBOL)就只能为自身所用,导出后就可以成为公用,对于导出的那部分内核符号就是我们常说的内核符号表。

insmod的时候并不是所有的函数都得到内核符号表去寻找对应的符号,
每一个驱动在自已的分配的空间里也会存在一份符号表,里面有关于这个驱动里使用到的变量以及函数的一些符号,首先驱动会在这里面找,如果发现找不到就会去公共内核符号表中搜索,搜索到了则该模块加载成功,搜索不到则该模块加载失败。

2.6内核默认情况下,是不会在模块加载后把模块中的非静态全局变量以及非静态函数自动导出到内核符号表中的,需要显式调用宏EXPORT_SYMBOL才能导出。
对于一个模块来讲,如果仅依靠自身就可以实现自已的功能,那么可以不需要要导出任何符号,只有其他模块中需要使用到该模块提供的函数时,就必须要进行导出操作。
由此启发,因为LKM中所存取的每一个符号(像函数名)也会被列在内核符号表中,有时候我们可以看内核符表就可以看到LKM调用的那些函数,如果这个LKM为非法目的,那么我们可以杀掉这个LKM.

 

名词解释:【LKM:可装载模块(Loadable Kernel Module )】

 

参考:

http://lxr.free-electrons.com/source/Documentation/kbuild/modules.txt

http://blog.youkuaiyun.com/macrossdzh/article/details/4601648

http://secisland.blog.51cto.com/787880/319760

Ubuntu有线网卡驱动安装与排错指南 Linux系统中的网络驱动是硬件与操作系统通信的关键组件,其工作原理是通过内核模块实现网卡芯片的指令翻译和数据传输。对于Ubuntu用户而言,正确安装网卡驱动不仅能解决网络连接问题,还能提升传输性能和系统稳定性。Realtek、Intel等主流网卡厂商的驱动安装涉及DKMS动态内核模块管理、源码编译等核心技术,这些方法同样适用于服务器运维和嵌入式开发场景。当遇到RTL8111/8168等常见网卡无法识别时,通过lspci诊断硬件、编译官方驱动并配置blacklist等操作可有效解决问题。本文特别针对Ubun 阅读详情

相关推荐

Linux内核模块加载失败:Unknown symbol错误排查与解决指南

在Linux内核开发与系统运维中,模块化设计是核心架构思想,它允许通过可加载内核模块动态扩展系统功能。模块间通过符号表机制进行通信,依赖模块导出的函数和变量实现协作。当模块加载时,内核需要解析所有外部符号引用,若依赖模块未加载或符号未导出,就会触发Unknown symbol错误,导致功能无法正常启用。这一机制保障了内核的稳定性和安全性,但在驱动开发、嵌入式系统定制等场景中,依赖问题常成为调试难点。本文以Intel网卡驱动igb与dca模块的依赖关系为例,深入解析符号解析原理,并提供从dmesg日志分析、m

weixin_42640676的博客 579

1)unknown symbol问题

1、出现这个错误的现象是系统起不来,查看串口打印信息有unknown symbol的函数,这种错误一般是函数没有定义或者没有用EXPORT SYMBOL输出函数,导致其他模块看不到,一个模块没有加载成功时,会导致其他依赖的模块也加载不起来,出现更多的unknown symbol问题,出现这种情况先解决第一个出现的,如果再有则依次解决;

u012340443的专栏 5231

内核模块适配(二) - Unkonwn symbol

内核模块适配, 内核模块最好的适配方式介绍

thinker 715

[LINUX] insmod 加载内核模块-Unknown symbol错误分析

https://blog.youkuaiyun.com/u011006622/article/details/78791350

hanfs390的博客 2021

linux服务器slab缓存回收方案设计

如何通过内核驱动去释放服务器上slab内存

木简熙的博客 579

DIY音乐播放器:用VS1053模块+Arduino打造你的专属MP3播放器(附完整代码)

本文详细介绍了如何使用VS1053音频解码模块与Arduino开发板,从零开始构建一个功能完备的桌面级MP3播放器。内容涵盖硬件架构设计、SPI总线共享、底层驱动编写、双缓冲区数据流管理以及用户交互实现,并提供完整的代码示例与性能优化建议,帮助创客打造高度可定制的专属音乐播放设备。

weixin_29189003的博客 287

insmod: can't insert './drivers/galcore.ko': unknown symbol in module, or unknown parameter

参考:linux内核插入模块时 Unknown symbol in module 参考:arm上加载insmod驱动时出现Unknown symbol in module 参考:加载内核模块-Unknown symbol错误分析 安装驱动: (1)编译linux内核 (2)编译驱动 (3)安装驱动 /mnt/mnt1/sdk # insmod ./drivers/galcor...

A person does not really understand something until after teaching it to a computer. Donald.E.Knuth 2366

无刷电机FOC控制入门:磁场、洛伦兹力与坐标转换详解

本文深入解析无刷电机FOC(磁场定向控制)的核心原理,从电磁学基础的磁场与洛伦兹力出发,详细阐述了如何通过Clarke变换、Park变换等坐标转换技术,将三相交流解耦为直流量进行控制,最终利用SVPWM技术实现平滑、高效的电机驱动。文章旨在帮助开发者理解FOC的物理本质与数学框架,为机器人、无人机等高性能应用奠定基础。

weixin_29306011的博客 267

Linux内核加载出现 Unknown symbol in module

编译驱动的时候碰到了 insmod: error inserting ‘./igb.ko’: -1 Unknown symbol in module 的问题,在网上看了下,说是查看 dmesg | tail 看输出信息中的Unknown symbol,加载上这些模块就好。我的输出信息是: [ 3548.357465] igb: Unknown symbol dca_remove_requester [ 3548.358569] igb: Unknown symbol dca_add_requester [

嵌入式技术在路上 2589

unity游戏开发日志(一)将mmd模型导入unity,并解决材质丢失的问题

unity音乐游戏开发,导入角色模型并解决材质问题

yizhigou1的博客 1762

通俗傻瓜式理清光栅化渲染和光线追踪渲染的原理

用通俗语言傻瓜式的讲清楚光栅渲染和光线追踪渲染的原理,方便没有相关理论基础的朋友理解入门。

qq_37366618的博客 2万+

内核模块符号导出:从Unknown symbol到EXPORT_SYMBOL实战解析

内核模块开发中,跨模块函数调用依赖内核的符号解析机制。当加载器在modpost或运行时无法定位符号时,常报Unknown symbol错误,根因往往在于符号未被显式导出。内核通过EXPORT_SYMBOL及EXPORT_SYMBOL_GPL等宏构建导出符号表,生成Module.symvers索引,供其他模块编译与运行时查询。理解符号可见性、许可证约束与命名空间,有助于诊断未定义符号、CRC不一致等依赖问题。在实际工程中,合理设计导出接口能降低模块耦合,避免命名冲突,确保模块加载顺序正确。本文从内核模块重定位

weixin_30582943的博客 200

别再羡慕专业版!用这个批处理脚本,一键给Win11家庭版装上官方沙盒

本文详细介绍了如何通过批处理脚本在Windows 11家庭版上安装官方Windows沙盒(Windows Sandbox),无需复杂操作即可享受专业版功能。脚本自动激活系统内置组件,提供安全隔离的虚拟化环境,适用于软件测试、安全浏览等场景。

weixin_26757925的博客 495

深入解析Linux驱动模块加载错误:unknown symbol问题排查与解决

本文深入解析Linux驱动开发中常见的unknown symbol加载错误,以实际案例video_rkcif.ko为例,详细介绍了如何通过dmesg日志定位未知符号、分析符号依赖来源,并提供了手动加载依赖模块与调整内核编译配置两种核心解决方案,帮助开发者系统性地排查和解决驱动模块加载问题。

weixin_29191081的博客 216

本地部署静态网站托管平台 Netlify 并实现外部访问(Windows 版本)

Netlify 是一款基于云计算的网站部署和托管平台,专为开发者提供便捷的静态网站和 Jamstack 应用部署服务。它的能力在于将网站构建、部署、托管以及持续集成等流程高度集成,简化了开发和运维的复杂程度。用户无需关心服务器的配置、维护等工作。本文将详细介绍如何在本地安装 Netlify 以及结合路由侠内网穿透实现外网访问 Netlify。

lyxnwct的博客 523

MIPI CSI-2 协议解析

CSI-2标准协议前言一、Overview of CSI-2二、CSI-2 layer Definitions三、 Camera Control Interface(CCI)3.1 数据传输协议(Data Transfer Protocol)3.1.1 消息类型(Message Type)3.1.2 读写操作(Read/Write Operations)3.1.2.1 随机位置单次读3.1.2.2 当前位置单次读3.1.2.3 随机位置连续读3.1.2.4 当前位置连续读3.1.2.5 随机位置单次写3.1

Lucky 3万+

unknown symbol in module, or unknown parameter

Linux中我们加载驱动时,经常使用insmod指令来加载驱动ko文件,不过有时加载时,会弹出一些错误提示,例如我想导入pppoe的ko文件,使用insmod pppoe.ko,报错如下 insmod: can't insert 'pppoe.ko': unknown symbol in module, or unknown parameter 这时一般是插入的ko文件,依赖的一部分函数,内...

时有限 1万+

多图详解VSCode搭建Python开发环境

本文通过多图的方式详细介绍了VSCode搭建Python开发环境,希望能对学习Python的同学们有所帮助。 文章目录 1. VSCode的介绍和安装 2. 安装插件 2.1 安装中文插件 2.2 安装Python插件 2.3 安装远程插件 3. 远程连接服务器 3.1 配置ssh 3.2 运行代码 3.3 调试代码

weixin_43178406的博客 8万+

unknown symbol in module, or unknown paramete

insmod的时候并不是所有的函数都得到内核符号表去寻找对应的符号,每一个驱动在自已的分配的空间里也会存在一份符号表,里面有关于这个驱动里使用到的变量以及函数的一些符号,首先驱动会在这里面找,如果发现找不到就会去公共内核符号表中搜索,搜索到了则该模块加载成功,搜索不到则该模块加载失败。注:/proc/kallsyms会显示内核中所有的符号,但是这些符号不是都能被其他模块引用的(绝大多数都不能),能被导出的是符号的类型是大写的那些(例如T,U)。3)首先加载定义该函数的模块,再加载调用该函数的模块。

u010689853的博客 943

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: 存在依赖关系的内核模块的编译问题​​​​​​​
下一篇: linux raid卡信息查询
qing_ping
博客等级 码龄17年 53粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值