- 浏览: 864287 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (280)
- java相关 (29)
- linux系统 (55)
- ipsec (0)
- ssl (3)
- 信息安全 (13)
- web相关 (35)
- windows (9)
- c,c++ (14)
- log4j (3)
- hibernate (8)
- sqlite (1)
- 程序人生 (2)
- js (2)
- 生活点滴 (3)
- 网络相关 (14)
- 问题积累 (15)
- 数据库相关 (27)
- 软件测试 (2)
- PKI相关 (2)
- 程序设计 (7)
- 犄角旮旯 (0)
- 杂七杂八 (0)
- 硬件相关 (14)
- 防火墙 (2)
- 电子商务 (2)
- 多媒体相关 (1)
- 内存管理 (4)
- 面向对象 (1)
- csp (1)
- 驱动开发 (3)
- 移动开发 (2)
- openssl多线程实例 (1)
最新评论
-
xiaoyao3857:
博主很有探索精神嘛,学习了
Linux主机名Hostname详解 -
hiskyrisa:
言简意赅,好文章。
Flex是什么 -
layznet:
犯了类似错误。使用的是derby数据库。driverClass ...
java.sql.SQLException: No suitable driver -
idision:
你好,文章有一句createSubjectKeyId(keyT ...
bouncycastle 产生证书 -
zheng12tian:
代码有全的不?只贴一部分,,,,
在LOG4J中把日志写入远程数据库
6. Unresolved Symbols
资料来源:Linux Loadable Kernel Module (LKM) HOWTO。
翻译:Wang Haiguang
在加载一个内核模块时, 最常见的和最令人沮丧的错误信息就是unresolved symbols, 如:
msdos.o: unresolved symbol fat_date_unix2dos
msdos.o: unresolved symbol fat_add_cluster1
多种原因可导致上述错误。但是,在任何情况下,你都可以通过查询/proc/ksyms文件来接近
导致问题的原因,并且确证错误信息中所列的symbols不在上述文件所包含的symbol列表中
6.1. Some LKMs Prerequire Other LKMs
导致这个问题的一个原因是用户没有加载另外一个内核模块, 该内核模块包含了当前模块所
需求的指令或数据。modprobe命令的一个主要目的就是防止这类错误。请参阅5.2节 (未翻译)。
6.2. An LKM Must Match The Base Kernel
动态加载内核模块的设计者意识到当内核包含多个版本时可能会出现问题。假设mydriver.o是
为Linux 1.2.1内核编写的,如果用户在运行Linux 1.2.2内核时加载这个模块会发生什么情
况呢?如果模块mydriver.o所调用的内核函数所包含的代码在内核1.2.1和1.2.2发生了变化,
会发生什么情况呢?这些都是内核函数,如何来阻止这些变化所导致的问题呢?
为了解决这个问题,可动态加载内核模块的创建者赋予每个外部可见函数一个内核版本号。在
mydriver.o目标文件的特殊的.modinfo节包含了版本信息,在上例中为“1.2.1”,原因是它
在编译时使用了内核1.2.1得头文件。在运行内核1.2.1时加载此模块,insmod 命令就会注意
到内核版本不匹配的问题因而停止加载该模块,并且会提示内核版本不匹配的信息。
但是,内核1.2.1和1.2.2的不兼容问题会在多大程度上影响mydriver.o呢? mydriver.o只使
用了内核的几个函数和数据结构而已。在内核改动很小的情况下,这些函数可能根本不会改变。
对每一个要加载该模块的特定内核,我们都必须从新编译该模块吗?
为了减少这些不必要的劳动,insmod命令有一个-f选项,该选项“强制”(forces)insmod
忽略内核版本不匹配的问题,强行加载一个模块。两个版本相近的内核几乎不可能有显著区别,
我推荐用户使用-f选项。但是,用户仍然会收到内核版本不匹配的警告。用户无法关闭该警告。
但是,动态加载内核模块的设计者仍然想解决由于不兼容的改变所导致的问题。于是他们就采用
了一个非常聪明的方法,该方法使得内核模块的加载程序可以很灵敏的探测到该模块所调用的函数
是否发生了改变。该方法利用了symbol版本号来检测程序的变化。此方法在编译内核时是可选的。
你可以通过CONFIG_MODVERSIONS来配置该选项。
当你编译一个基本内核或内核模块时使用了symbol版本号,各种向内核模块输出的symbol使用了宏
定义。这些宏定义是由原有的symbol名字加一个16进制的哈希值,该哈希值是从函数参数与返回值
得出的(通过genksyms程序来产生的)。 让我们来看register_chrdev函数。register_chrdev函数
是基本内核中一个经常被设备驱动程序调用的函数。当使用了symbol版本号时,有一个C宏定义如下:
#define register_chrdev register_chrdev_Rc8dc8350
该宏定义在定义该函数的源文件与任何使用该函数的文件中都是有效的。 所以当你在源文件中看到
register_chrdev函数时,C 预处理器知道这个函数实际上是register_chrdev_Rc8dc8350。
那么那个向垃圾一样的后缀有什么意义呢?他是register_chrdev的参数和返回值类型的哈希
值。对于不同的参数与返回值类型得组合,该值是独一无二的。
比如说在内核1.2.1到1.2.2的升级过程中,有人在register_chrdev加入了一个参数。在内核
1.2.1中,register_chrdev的宏定义是register_chrdev_Rc8dc8350, 但是在内核1.2.2中,
该宏定义是register_chrdev_R12f8dc01. 对于mydriver.o, 如果在编译时使用了内核1.2.1
的头文件,那么他有一个register_chrdev_Rc8dc8350的外部调用,但是在内核1.2.2中并无
此symbol的定义。相反的,在内核1.2.2中向外输出的symbol是register_chrdev_R12f8dc01。
所以当你要加载基于内核1.2.1的模块到内核1.2.2时,你就会遇到加载失败的问题。错误信息
不是内核版本不匹配,而是unresolved symbol reference。
但是这个方法并非十全十美的。对于完全相同的参数列表,genksyms有时会产生不同的哈希值。
symbol版本并不能完全保证兼容性。它只能捕捉到关于函数定义变化的信息。他并不能探测到
由于函数内部代码变化而导致的不兼容性。例如,register_chrdev在使用期中的一个参数时
发生了不兼容性变化。由于参数与返回值类型并没有变化,因此他的版本后缀并没有变化。
当symbol版本不一致时,即使在加载模块(insmod)时使用了-f选项也不能成功。所以,通常来
说最好不要使用symbol版本号。
当然,如果你在编译基本内核时打开了symbol版本选项,那么你编译内核模块是就必须也使用
该选项,反之亦然。否则,在加载模块时,你肯定会遇到unresolved symbol reference的错
误信息。
6.3. If You Run Multiple Kernels
当一个系统同时存在不同版本的内核时,通常使用modprobe命令来搜索对应的模块。该命令会
从/lib/modules/kernel-version目录下搜寻对应模块。
你可以通过编辑内核的makefile来设置 uname -- release值, modprobe使用该值来搜索模
块。
6.4. SMP symbols
除了以上的校验和之外, symbol版本的前缀还会包含 “smp”如果该symbol是面向多处理器
系统的。所以当基本内核在编译时打开了多处理器选项而内核模块在编译时未打开该选项,加
载时也会遇到unresolved symbol reference的错误信息,反之亦然。
6.5. You Are Not Licensed To Access The Symbol
一些内核代码的拥有者有时会在symbol版本号中加入GPLONLY以鼓励Linux使用与开发者公开其
源代码。细节请参考原著。
6.6. An LKM Must Match Prerequisite LKMs
内核模块在与基本内核兼容的同时,也必须与那些包含该模块所调用函数的其它内核模块兼容。
linux kernel里的unresolved symbol
linux
内核里面有很多export给其他模块使用的符号表,一般情况下,如果没有选择CONFIG_MODVERSIONS,这些符号是正常的字串;如果选择了
CONFIG_MODVERSIONS,这些符号就会在后面加一段校验字串。这样做的目的是避免模块不正确加载情况下,使得内核崩溃。
如果内核选择了CONFIG_MODVERSIONS选项,你的模块的Makefile要增加以下几行
CFLAGS += -DMODVERSIONS -include /usr/src/linux/include/linux/modversions.h
或者在你的C源文件里增加
#ifdef CONFIG_MODVERSIONS
#define MODVERSIONS
#include
#endif
这样就可以在编译内核模块时,如果模块里引用了内核符号表,就可以自动计算校验字串,而不会在加载模块时出现unresloved symbol的错误了。
发表评论
-
Linux c的多线程编程实例
2011-07-19 17:28 1970通过创建两个线程来实现对一个数的递加。或许这个实例没有实际运用 ... -
linux下进程的最大线程数、进程最大数、进程打开的文件数
2011-06-22 17:35 1945linux 系统中单个进程的 ... -
Linux中dos2unix的批量转换命令
2011-01-05 10:31 6973在Linux中将DOS 格式转换为Unix格式的文件可以使用d ... -
linux双网关双线路网络设置
2010-08-03 19:10 2010由于电信和网通之间互联互通 的问题,很多 ... -
syslog-ng学习心得之二
2010-07-06 08:58 2438在[url]http://coolerfeng.blog.51 ... -
syslog-ng学习心得之一
2010-07-06 08:58 2743转载一篇syslog-ng的文章的,本来是想打算自己写一篇 ... -
Linux用户进程是如何释放内存
2009-12-25 17:16 2058Linux进程使用内存的基本流程: 见图1 从 ... -
Linux内存使用详解
2009-12-25 16:56 2375一提到内存管理,我们 ... -
linux下查看内存使用情况
2009-12-25 14:56 1992在Linux下查看内存我们 ... -
Linux编程C++内存管理之内存分配详解
2009-12-21 21:33 1756程序员们经常编写内存 ... -
内核模块调试方法
2009-11-17 11:23 2581对 于任何一位内核代 ... -
Linux操作系统下以太网卡的安装及配置
2009-11-11 17:18 1678Linux操作系统以其 独有的开放性、稳定性、高 ... -
跟我一起写 Makefile(3)
2009-11-03 14:38 635“-s” “--silent” “--quiet” 在命 ... -
跟我一起写 Makefile(2)
2009-11-03 14:35 956书写命令 ———— 每 ... -
跟我一起写 Makefile(1)
2009-11-03 14:32 981陈皓 (CSDN) 概述 — ... -
CC与GCC的区别概括介绍
2009-11-03 14:29 1451从名字上看,老的unix系统 的CC程序叫做C Comp ... -
linux内核模块管理命令
2009-10-30 10:54 17091. lsmod 列出已经加载的内核模块 lsmo ... -
分区修复软件Testdisk 安装使用
2009-08-26 14:23 4916linux下超帅的分区表修复软件.以前用过n多的window ... -
Linux下的分区修复软件Testdisk
2009-08-26 10:40 1855好了,这个软件叫testdisk.很帅的。。 如果你是使 ... -
Linux分区数据恢复
2009-08-26 10:18 1445公司的一台redhat机器启动不了了,是由于多次非正常关机造成 ...
相关推荐
unresolved external symbol,multiply defined symbols found 这是一个困扰C语言新手的问题 #include没毛病 但是用多了就出毛病 看代码,哪都没毛病 在B中#include A 在A中#include B 此时build就会报unresolved ...
- 选择`File -> Properties`,在弹出的对话框中选择`Paths and Symbols`选项卡。 - 在`Include Paths`区域点击`Add`按钮,添加包含`xgpio.h`头文件的路径。 - 通常情况下,该路径为`C:\Xilinx\14.4\ISE_DS\EDK\sw...
事件生成器可以轻松创建 Stateflow 图的输入事件序列。 您可以从图表中导入事件名称和类型,然后在时间线中编辑输入事件序列。 事件生成器可以处理更多场景。 要使用 Event Builder,只需解压缩文件,将文件夹添加...
download the symbols (pdb) very simply. sail and visualize in a detailed way the types and their members in the form of tree structure easily find the unused areas in the structures (padding). These ...
包括未引用的局部变量、missing function-prototype、无法打开头文件、函数名称重复定义、未调用的函数、重复定义的地址、missing function-prototype、unresolved external symbols和reference made to unresolved ...
Dynamic linking involves resolving unresolved symbols at runtime, allowing multiple programs to share common libraries. #### Program Header The program header is a table that describes how the file...
3. **WARNING 1 & WARNING 2: UNRESOLVED EXTERNAL SYMBOLS** 这些警告表示在链接阶段找不到引用的外部函数或变量。这意味着在编译过程中,函数或变量的定义没有被包含在工程中。解决这个问题需要检查是否已将包含...
8. ***WARNING 1 & 2: UNRESOLVED EXTERNAL SYMBOLS 这些警告通常指出了程序中调用了未定义或未包含在工程中的函数。解决方法是将函数声明添加到相应的头文件中,并确保这些头文件被包含在工程中进行编译。 9. ***...
错误“_main already defined in a.obj”和“multiply defined symbols found”表明main函数或其他符号在多个对象文件中被重复定义。确保main函数只在一个源文件中定义,并且没有其他不必要的重复定义。 ### 10. ...
WARNING 1 & 2: UNRESOLVED EXTERNAL SYMBOLS **说明**: 编译器无法解析外部符号`MUSIC3`,通常是由于未包含相应函数的源文件进行编译。 **解决方法**: 将包含`MUSIC3`函数的源文件`MUSIC.C`添加到项目中,确保...
10. **unresolved references to schematic sheets**:对原理图图纸的未解决引用可能导致设计缺陷。 以上是ERC错误报告中涉及的主要错误类型,理解并解决这些问题对于提高电路设计的准确性和可靠性至关重要。在设计...
`-match crossmangled`匹配跨平台的Mangled名称,`-via file`通过中间文件处理,`-strict`启用严格的链接检查,`-unresolved symbol`处理未解析的符号,`-MI|-LI|-BI`指定目标机器架构,`[input-file-list]`则是输入...
***WARNING 1: UNRESOLVED EXTERNAL SYMBOLS **说明**:程序中调用了 `MUSIC3` 函数,但未将包含该函数的源文件加入到项目中进行编译和链接。 **解决方法**: - 将包含 `MUSIC3` 函数的源文件(假设为 `MUSIC.c`)...
37. **-unresolved symbol**:处理未解析的符号。 38. **-MI|-LI|-BI**:选择不同的符号表格式。 39. **input-file-list**:指定输入文件列表。 掌握armlink的使用,不仅可以优化链接过程,还能提高软件的效率和...
笔记本的风扇控制 ---------------------------------------- 09 November 2006. Summary of changes for version 20061109: 1) ACPI CA Core Subsystem: Optimized the Load ASL operator in the case where the...