免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5872 | 回复: 18
打印 上一主题 下一主题

unresolved symbol sys_mount? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-19 16:10 |只看该作者 |倒序浏览
又来发帖,都不好意思了,但我GOOGLE了半天,也按照里面的做法做了
但insmod的时候还是出现了这个问题unresolved symbol sys_mount

我的环境是2.4.20,自己写的一个模块,其中调用了sys_mount这个函数,也#include <linux/namespace.h>了。

也声明了这个函数
extern asmlinkage long sys_mount(char * dev_name, char * dir_name, char * type,unsigned long flags, void * data);

编译命令为
gcc -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -I /usr/src/linux-2.4/include/ -DMODULE -D__KERNEL__ -c inode.c

该整的都整了,还是有这个错误,有点崩溃。
希望有经验的人不吝赐教。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
2 [报告]
发表于 2008-12-19 16:16 |只看该作者
这个头文件不用include吧,这个头文件没有定义这个函数

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
3 [报告]
发表于 2008-12-19 16:16 |只看该作者
原帖由 youmin0 于 2008-12-19 16:10 发表
又来发帖,都不好意思了,但我GOOGLE了半天,也按照里面的做法做了
但insmod的时候还是出现了这个问题unresolved symbol sys_mount

我的环境是2.4.20,自己写的一个模块,其中调用了sys_mount这个函数,也# ...


这是模块编程比较常见的错误。通常来说,你引用其它模块的函数接口,如果该模块没有使用EXPORT_SYMBOL or EXPORT_SYMBOL_GPL导出符号的话,就不能引用这个接口,也就是你上面出现的错误。

通常有两种方法可以解决:
1、修改其它模块,并使用EXPORT_SYMBOL or EXPORT_SYMBOL_GPL导出符号;
2、把源文件拿过来和你的模块一起编译、链接;

其它的方法,我就不太清楚了。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
4 [报告]
发表于 2008-12-19 16:18 |只看该作者
按理说2.4下extern就可以了。不过这里这个函数MS是给上面的系统调用使用的

论坛徽章:
0
5 [报告]
发表于 2008-12-19 16:26 |只看该作者
我用cat /proc/ksyms |grep sys_mount查看的时候也是空的,这说明什么?

论坛徽章:
0
6 [报告]
发表于 2008-12-19 16:28 |只看该作者
原帖由 dreamice 于 2008-12-19 16:16 发表


这是模块编程比较常见的错误。通常来说,你引用其它模块的函数接口,如果该模块没有使用EXPORT_SYMBOL or EXPORT_SYMBOL_GPL导出符号的话,就不能引用这个接口,也就是你上面出现的错误。

通常有两种方法 ...


第二种方法我试下,但正如版主所说的是不是因为sys_mount是只留给系统用的,我就没有办法了?

论坛徽章:
0
7 [报告]
发表于 2008-12-19 16:29 |只看该作者
原帖由 youmin0 于 2008-12-19 16:10 发表
又来发帖,都不好意思了,但我GOOGLE了半天,也按照里面的做法做了
但insmod的时候还是出现了这个问题unresolved symbol sys_mount

我的环境是2.4.20,自己写的一个模块,其中调用了sys_mount这个函数,也# ...


我以前写过一个在内核中调用sys_open的方法,不过是2.6的,不晓得2.4是否可行。你看看:

  1. #include<linux/kernel.h>
  2. #include<linux/module.h>
  3. #include<linux/init.h>
  4. #include<linux/fs.h>
  5. #include<linux/string.h>
  6. #include<linux/syscalls.h>
  7. #include<asm/unistd.h>
  8. #include<asm/uaccess.h>
  9. #include<linux/unistd.h>


  10. int fd;
  11. int errno;

  12. #define __NR_sys_open1 __NR_open
  13. static inline _syscall3(long, sys_open1, char __user*, s, int, flags, int, mode);
  14. #define __NR_sys_write1 __NR_write
  15. static inline _syscall3(long, sys_write1, unsigned int, fd, const char __user*, buf, size_t, count);
  16. #define __NR_sys_close1 __NR_close
  17. static inline _syscall1(long, sys_close1, unsigned int, fd);


  18. static int __init init(void)
  19. {

  20.         char buf[10] = "hello";
  21.         mm_segment_t old_fs = get_fs();
  22.         set_fs(get_ds());
  23.         fd = sys_open1("/root/myfile", O_RDWR|O_CREAT, 0644);
  24.         if (fd < 0)
  25.         {
  26.                 printk("error\n");
  27.                 return -1;
  28.         }
  29.         printk("open ok \n");

  30.         sys_write1(fd, buf, sizeof(buf));

  31.         set_fs(old_fs);
  32.         return 0;
  33. }

  34. static void __exit exit(void)
  35. {
  36.         if (fd != 0)
  37.                 sys_close1(fd);
  38. }
  39. module_init(init);
  40. module_exit(exit);
  41. MODULE_LICENSE("GPL");
复制代码


不过我觉得你可以再回到你问题的起点,看是否非得使用sys_mount这个函数。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
8 [报告]
发表于 2008-12-19 16:30 |只看该作者
原帖由 youmin0 于 2008-12-19 16:26 发表
我用cat /proc/ksyms |grep sys_mount查看的时候也是空的,这说明什么?


这说明估计不是给模块编程使用的了。

论坛徽章:
0
9 [报告]
发表于 2008-12-19 16:30 |只看该作者
有时候一个问题可能有多个解决的方法。

论坛徽章:
0
10 [报告]
发表于 2008-12-19 16:31 |只看该作者
原帖由 Godbach 于 2008-12-19 16:16 发表
这个头文件不用include吧,这个头文件没有定义这个函数


呵呵,我看sys_mount在这里面,而且我也用到了struct namespace *namespace = current->namespace这样的代码。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP