首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

在调试过程中,发现一个问题,编译生成一个KO文件,insmod加载后报错: Unknown symbol var_set_integer (err 0) Unknown symbol parse_arg_eq...EXPORT_SYMBOL,是否有extern声明; 并且查看是否要做GPL声明:修改为 MODULE_LICENSE("GPL"); (1)如果你的模块需要输出符号给其他模块使用, 应当使用下面的宏定义...符号必须在模块文件的全局部分输出, 在任何函数之外, 因为宏定义扩展成一个特殊用途的并被期望是全局存取的变量的声明....【模块加载顺序的前后要求,一般就是依赖于符号调用】 编译生成ko模块之后,用insmod命令加载此模块到内核。这个程序加载模块的代码段和数据段到内核。...2.6内核默认情况下,是不会在模块加载后把模块中的非静态全局变量以及非静态函数自动导出到内核符号表中的,需要显式调用宏EXPORT_SYMBOL才能导出。

3.2K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    可能错误使用了‘offsetof’宏

    前言 问题出现于实际工作当中,最近代码里引进了一个宏offsetof(s,m),这个宏的实际作用就是用来计算结构中的某个变量在结构中的偏移量的,实际的项目是跨平台的,原来一直在windows上开发,今天发现在...linux编译的日志中出现了如下的警告: xxxx.cpp:8: 警告:对 NULL 对象非静态数据成员‘XXX::xxx’的访问无效 xxxx.cpp:8: 警告:(可能错误使用了‘offsetof...’宏) 这个问题实际测试下来仅仅是个警告,没有对程序运行产生影响,但对于多数拥有强迫症的程序猿来说,这是不可忍受的,必须把这个警告搞掉。...测试结果 分析 这个警告中的NULL比较扎眼,考虑把它搞掉们是不是只有NULL才会报警告呢,参考了其他平台和工具的offsetof宏定义,决定把当前环境中的offsetof宏定义改一下: #define...第二次编译结果 总结 看来这g++编译器对NULL很敏感嘛!

    83420

    宏替换、条件编译、头文件展开

    宏替换、文件编译和头文件的展开 程序执行的几个步骤: 1.预处理: ①将头文件展开 ②宏替换 ③条件编译 ④去掉注释 2.编译: ①语义语法纠错 ②将.c文件编译成汇编语言 3.汇编:将汇编语言变成二进制机器语言...// 取消宏 #if // 如果给定的condition为真,则编译下面的代码 #ifdef // 如果宏已定义,则编译下面的代码 #ifndef // 如果宏没有被定义,则编译下面的代码 #elif 如果前面的#if给定条件为假,当前的条件为真,则编译下面的代码 #endif // 结束一个#if…#else条件编译块...#error // 停止编译并显示错误信息 宏的定义 #define机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏或定义宏。...// 由于定义的AXE_TAG宏代表0,#if条件为假,不编译后面的代码,直到#endif,最后只输出 BB。去掉 #define AXE_TAG 0语句,效果也是一样的。

    2.3K20

    gcc编译之常见错误

    关于gcc问题解决 最近gcc编译出来的so库之类的使用总有问题,收集资料后简单整理下解决方法: 首先使用ldd 或者ldd -r XXX 查看文件所连接的so库有没有问题,目前我看到的经常是出现(undefined...而c++由于允许重载,就出现同一个函数名可能对应多个实际的函数问题,于是就会有name mangling ,而且这个mangling完全没有任何规范可循,由编译器自定。...解决方法:简而言之,就是用exturn “C” 对于经常加载一些so时,提示undified symbol,在gcc编译时,需要把链接动态库放最后面 对于编译时候找不到的so的问题,之前已经提过了,主要原因就是库文件没有导入...尤其刚刚编译安装的软件,必须运行ldconfig,才能将新安装的库文件导入ld.so.cache....更多有关具体linux /etc/ld.so.conf 的相关信息参考动态装入器 关于gcc编译链接可参考 GCC/LD编译链接潜规则

    1.5K40

    编码篇-学会小用宏和条件编译

    前言 宏定义在C系开发中可以说占有举足轻重的作用。底层框架自不必说,为了编译优化和方便,以及跨平台能力,宏被大量使用,可以说底层开发离开define将寸步难行。...而在更高层级进行开发时,我们会将更多的重心放在业务逻辑上,似乎对宏的使用和依赖并不多。 编译时编译器会在语义分析认定是宏后,将形参替换为实参,这个过程称为宏的展开。...但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是条件编译(不被编译的代码不会被运行) 条件编译语法格式 1、#if 编译预处理中的条件命令, 相当于C语法中的...所以条件编译的条件一般是利用宏定义,因为宏定义和条件编译都是编译之前进行的。...如下面的一个错误例子: #include void main() { int a =8; #if a>7 printf("a

    77720

    【C 语言】编译过程 分析 ( 预处理 | 编译 | 汇编 | 链接 | 宏定义 | 条件编译 | 编译器指示字 )

    条件编译 示例 简单的条件编译 修改代码实现 3 条件编译 示例 使用命令行生成宏定义控制条件编译 不修改代码实现 include 间接包含 1 间接包含 介绍 2 include 间接包含 示例 错误示例...(错误示例) : 1.宏递归代码示例 : #include //定义一个递归宏, 这种定义时错误的, 宏表达式中不能出现递归 #define FAC(n) ((n > 0)...之后, 可以使用 #undef MIN 限制其作用范围, 只能在 #define 和 #undef 之间使用该宏, 在 #undef 之后就不可使用该宏了; 2.使用示例 (错误示例) : #include...#error 作用 : #error 编译指示字 用于生成 编译错误信息, 立即终止编译 ; 这个编译错误是程序员自定义的编译错误信息; 2....#pragma message 参数 : 1.作用 : 编译器编译时将编译信息输出到窗口中 ; 2.与 #error 编译器指示字对比 : #error只是在出现错误的时候, 将错误信息输出出来, #

    1.3K10

    ARM交叉编译OpenCV错误总结

    ARM交叉编译OpenCV错误总结 最近尝试给两个ARM板子与用交叉编译配置OpenCV,为此查了很多资料,学了很多交叉编译的操作。...,最后还是没有用,还写了这么多技术博客,深深的无力感…… 笔者决定还是痛定思痛,还是得总结一下这段时间交叉编译的错误所在。...这些疑点还是可以记录下来,以后有机会的时候,笔者会重新拿出来看,也许真的是这些原因导致我交叉编译错误呢?...…… (3) 使用错误的编译器 这个本来都不想回忆的,因为实在太低级失误了…… 笔者曾经用了gcc的编译器编译Demo程序,然而库文件是交叉编译的arm-linux-gcc版本,结果肯定是运行不了的…...错误情况总结与猜想 i.MX6Q的系统是和PC机一样的Ubuntu,所以错误情况比较少,基本上还是可以参考BBB的总结……(原谅笔者的懒惰,一是因为错误情况少,二是因为时间稍微有点久远了……) 后记:

    3.1K90

    什么是编译错误,运行时错误及逻辑错误?

    程序的错误主要分成三种: 编译链接错误(语法错误); 编译链接错误又分成编译错和链接错。...编译错就是普通意义上的语法错,编译器进行语法检查不通过,也就是程序违背了计算机语言的语法,例如:括号不匹配、变量名拼写错误、用保留字定义变量名等; 链接错是指程序通过了语法检查,但是无法生成可执行文件...运行错误; 运行错是程序可以执行,但是在执行过程中发生异常,提前退出程序。最常见的是指针越界,打开文件失败继续读取文件,总而言之是让计算机执行一些不能执行的语句。...逻辑错误 逻辑错是程序也能运行,就是结果不对,主要原因有:程序算法本身错误,程序和算法不同义等。 例如:新手经常将判断相等的==写成=赋值,往往就会导致逻辑错。

    9.4K110

    iOS_预编译(宏)#if #ifdef #ifndef #elif #else #endif

    经过预处理后程序可由编译程序对预处理后的源程序进行通常的编译,得到可供执行的目标代码。 OC中的预编译指令分为三种:宏定义、条件编译、文件包含。...1、宏定义 1.1、定义 和 取消定义 #define 标识符 字符串:定义个宏,标识符就是这个宏的名称,一般习惯用大写字母,以便与变量名区别。...#undef 标识符:取消一个宏,之后这个宏的定义就无效了。但可以重新使用#define进行定义。...根据预处理指令判断条件编译对应的代码,未满足条件的代码不会被编译(相当于没这段代码)。...条件编译指令: #if 当条件为真,则编译这段代码 #ifdef(if define) 当宏被定义,则编译这段代码 #ifndef(if no define) 当宏未被定义,则编译这段代码 #elif(

    1.1K20

    编译错误CS1595

    编译错误 说明: 在编译向该请求提供服务所需资源的过程中出现错误。请检查下列特定错误详细信息并适当地修改源代码。...编译器错误信息: CS1595: 已在多处定义“BigTeam.Security.Admin.Controls.UserLists_ascx”;使用“c:\WINDOWS\Microsoft.NET\Framework...删除其中一个就可以了(但要注意:一般情况下,你就算是有两个DLL文件,里面的内容一样也没关系,但就不能有两次编译后得到的两个内容一样的DLL文件,否则就会有上面的错误出现)!   ...特别注意:在更改一次编译选项然后再更改回来且两次都有编译的时候,就要注意了,上面的错误一定会出现,而且可能使两次的版本不一样,所以记得删除里面的任何一个(这时候两个是冲突的,所以删除任何一个都可以使程序运行正常...但要注意,你所删除的一定要是与编译选项不同的那一个,否则再编译的时候就会又得到一个错误了!

    65590
    领券