解决高版本Linux中EXPORT-SYMBOL共享变量extern导入未定义错误

需积分: 5 0 下载量 118 浏览量 更新于2024-09-29 收藏 6KB RAR 举报
资源摘要信息:"在处理Linux内核模块开发时,开发者可能会遇到 EXPORT-SYMBOL 导出的共享变量在通过 extern 关键字导入时出现 undefined 错误的问题。本文将详细介绍解决此类问题的方法和步骤。 首先,需要理解 EXPORT-SYMBOL 是 Linux 内核提供的一种机制,允许内核模块之间共享变量和函数。EXPORT-SYMBOL 宏定义通常位于模块的 C 源文件中,用于声明哪些变量或函数可供其他模块使用。相反,导入方则需要使用 extern 关键字来声明它将要使用的共享变量或函数。 当出现 undefined 错误时,通常意味着编译器在链接阶段无法找到该变量或函数的定义。解决此类错误的常见方法包括: 1. 检查 EXPORT-SYMBOL 的使用是否正确。 EXPORT-SYMBOL 应该紧邻变量或函数定义的声明,而不是在函数体内或者单独的头文件中。确保 EXPORT-SYMBOL 宏的使用符合内核的模块编程规范。 2. 确认变量或函数确实被正确导出。可以通过检查生成的模块信息文件(.ko文件)来确认该变量或函数是否在导出符号表中。 3. 核对导入方的 extern 声明是否准确。extern 关键字仅用于声明,并不分配存储空间,确保声明的变量名与导出的符号完全一致。 4. 确保内核版本兼容性。高版本的 Linux 内核可能会对模块编程有一些新的要求或者变更,检查内核文档确保使用的接口和宏是当前版本支持的。 5. 使用 modinfo 工具来检查 ko 文件中的导出符号。例如: # modinfo mymodule.ko 这可以帮助开发者确认符号是否真的被导出,以及确认导出的符号名。 6. 检查编译器和链接器的配置。确保链接器能够找到导出符号的定义文件。如果模块定义和使用在不同的编译单元,确保编译单元之间有正确的依赖关系,并且链接时包含了正确的库文件。 7. 对于模块间的依赖问题,可以使用 'depmod' 命令来生成模块依赖关系,并通过 'modprobe' 命令来加载模块时,确保内核能够正确解析这些依赖。 8. 查看编译器的错误信息和警告,它们通常会提供解决问题的线索。 9. 如果问题依旧无法解决,可以考虑查阅 Linux 内核文档、社区论坛或邮件列表,寻求其他内核开发者的帮助。 通过上述方法,大部分因 EXPORT-SYMBOL 导出导致的 undefined 错误应该能够被解决。注意,在处理内核模块开发中的符号导出和导入时,需要有内核编程的知识背景,并且要理解 Linux 内核的模块加载机制。" 总结来说,解决高版本 Linux 系统中 EXPORT-SYMBOL 共享变量通过 extern 导入出现 undefined 错误的问题,需要检查 EXPORT-SYMBOL 宏的正确使用、确认导出和导入声明的一致性、检查内核版本兼容性、使用 modinfo 检查导出符号、调整编译器和链接器配置、使用 'depmod' 和 'modprobe' 管理模块依赖,并充分理解错误信息。这些步骤对深入理解 Linux 内核模块开发以及系统编程有着重要的作用。

(1)在内核中实现缺页次数统计: 1.cd /usr/sec/linux-2.6.32.60 // 切换到预编译内核 2.sudo gedit arch/x86/mm/fault.c / /编辑fault.c 3.Unsigned long volatile pfcount //在fault.c中定义缺页次数全局变量. 4.将pfcount加入到do_page_fault中,用以统计缺页次数. 5.sudo gedit include/linux/mm.h //声明全局变量pfcount到头文件mm.h. 6.在extern int page_cluster下面添加代码 Extern unsigned long volatile pfcount; 7.Sudo gedit kernel/kallsym.c // 导出pfcount全局变量,整个内核都可以访问. 8.在最后一行添加代码EXPORT_SYMBOL(pfcount); (2)编译安装新内核: 1.sudo make mrproper //删除原来编译产生的垃圾 2.sudo cp /boot/config-3.2.0-29-generic-pag .config //导入原系统的内核配置 3.sudo make odlconfig; //更改配置 4.Sudo make clean; 5.make bzImage //编译内核 6.make modules //编译内核模块 7.make modules_install //安装内核模块 8.make install //安装内核 9.Sudo reboot //重新启动Linux系统 (3)新建内核模块,通过/proc实现用户态下查看缺页次数: 1.make source //创建source文件,存放编写的模块程序. 2.cd source/ //切换到source目录. 3.gedit pf.c// 新建用于构建模块的代码 4.Gedit Makefile //构建Makefile 5.在Makefile中添加 obj-m := pf.o 6.Sudo make -C /usr/src/linux-2.6.32.60 SUBDIRS=$PWD modules //编译、构建内核模块 7.sudo insmod pf.ko //加载模块到内核 8.sudo lsmod | grep pf //验证pf内核模块是否加载到内核进程中,运行命令出现pf信息说明加载成功 9.cat /proc/pf/pfcount //查看缺页统计次数通过以上步骤,你能帮我解读实验的结果吗

2023-06-08 上传