免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4053 | 回复: 10

[C] 编译出错跪求帮忙 [复制链接]

论坛徽章:
0
发表于 2014-02-18 22:34 |显示全部楼层
本帖最后由 蚊仔perlperl 于 2014-02-18 22:40 编辑

各位前辈,本人不懂C,我想要编译下面一段代码,提示错误: amiwrap.c:39: warning: initialization from incompatible pointer type  (在这里38行)
请教是哪里出了问题,帮忙修正。我用的kernel是 3.7.5
38行是修改过的,原来的是 :ioctl:   wrap_ioctl, 出现的错误是amiwrap.c:39: error: unknown field ‘ioctl’ specified in initializer
在网上找了一遍这个错误,是kernel的这个对象什么结构变了(不怎么懂),所以修改成unlocked_ioctl:  wrap_ioctl ,但还是出错这个错误.
还有就是这个可以在2.6.x的kernel编译通过

amiwarp.c
  1. #include <linux/version.h>
  2. #include <linux/module.h>
  3. #include <linux/kernel.h>
  4. #include <linux/init.h>
  5. #include <linux/fs.h>
  6. #include <linux/string.h>
  7. #include <linux/errno.h>
  8. #include <linux/mm.h>
  9. #include <linux/vmalloc.h>
  10. #include <linux/mman.h>
  11. #include <linux/slab.h>
  12. #include <asm/io.h>
  13. #include <asm/uaccess.h>

  14. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
  15. #include <linux/wrapper.h>
  16. #endif
  17. #include "amiwrap.h"

  18. extern int amifldrv_ioctl(void);
  19. extern int amifldrv_mmap(void);
  20. unsigned long   ulArg0;
  21. unsigned long   ulArg1;
  22. unsigned long   ulArg2;
  23. pgprot_t        pgArg0;
  24. void            *pvArg0;
  25. void            *pvArg1;

  26. AFU_ATTRIBUTE_FUNC static int wrap_open(struct inode *inode, struct file *file);
  27. AFU_ATTRIBUTE_FUNC static int wrap_release(struct inode *inode, struct file *file);
  28. AFU_ATTRIBUTE_FUNC static int wrap_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);
  29. AFU_ATTRIBUTE_FUNC static int wrap_mmap(struct file *file, struct vm_area_struct *vma);
  30. struct file_operations amifldrv_fops =
  31. {
  32.   owner:   THIS_MODULE,
  33.   open:    wrap_open,
  34.   release: wrap_release,
  35.   unlocked_ioctl:   wrap_ioctl,
  36.   mmap:    wrap_mmap,
  37. };

  38. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
  39. #define mem_map_reserve(p) set_bit(PG_reserved, &((p)->flags))
  40. #define mem_map_unreserve(p) clear_bit(PG_reserved, &((p)->flags))
  41. MODULE_AUTHOR("American Megatrends Inc.");
  42. MODULE_DESCRIPTION("AMI Flash Update utility driver");
  43. MODULE_LICENSE("Dual BSD/GPL");
  44. #endif

  45. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
  46. static int device_open_count = 0;
  47. #endif

  48. AFU_ATTRIBUTE_FUNC
  49. int wrap_open(struct inode *inode, struct file *file)
  50. {
  51. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
  52.     MOD_INC_USE_COUNT;
  53. #else
  54.     if (device_open_count)
  55.         return -EBUSY;
  56.     device_open_count++;
  57.     try_module_get(THIS_MODULE);
  58. #endif
  59.     return(0);
  60. }
  61. AFU_ATTRIBUTE_FUNC
  62. int wrap_release(struct inode *inode, struct file *file)
  63. {
  64. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
  65.     MOD_DEC_USE_COUNT;
  66. #else
  67.     device_open_count--;
  68.     module_put(THIS_MODULE);
  69. #endif
  70.     return(0);
  71. }

  72. AFU_ATTRIBUTE_FUNC
  73. int wrap_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
  74. {
  75.     pvArg0 = inode;
  76.     pvArg1 = filp;
  77.     ulArg0 = cmd;
  78.     ulArg1 = arg;
  79.     return amifldrv_ioctl();
  80. }

  81. AFU_ATTRIBUTE_FUNC
  82. int wrap_mmap(struct file *file, struct vm_area_struct *vma)
  83. {
  84.     pvArg0 = file;
  85.     pvArg1 = vma;
  86.     return amifldrv_mmap();
  87. }

  88. AFU_ATTRIBUTE_FUNC
  89. int wrap_register_chrdev()
  90. {
  91.         return register_chrdev((unsigned int)ulArg0, "amifldrv", (struct file_operations *)pvArg0);
  92. }

  93. AFU_ATTRIBUTE_FUNC
  94. void wrap_mem_map_reserve()
  95. {
  96.         mem_map_reserve((struct page*)pvArg0);
  97. }

  98. AFU_ATTRIBUTE_FUNC
  99. void wrap_mem_map_unreserve()
  100. {
  101.         mem_map_unreserve((struct page*)pvArg0);
  102. }

  103. AFU_ATTRIBUTE_FUNC
  104. struct page *wrap_virt_to_page()
  105. {
  106.         return virt_to_page(ulArg0);
  107. }

  108. AFU_ATTRIBUTE_FUNC
  109. int wrap_remap_page_range()
  110. {
  111. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
  112. ulArg1 = ulArg1>>PAGE_SHIFT;
  113.   return remap_pfn_range((struct vm_area_struct *)pvArg0, ulArg0, ulArg1, ulArg2, pgArg0);
  114. #else
  115.   return remap_page_range((struct vm_area_struct *)pvArg0, ulArg0, ulArg1, ulArg2, pgArg0);
  116. #endif
  117. }
  118. AFU_ATTRIBUTE_FUNC
  119. void *wrap_kmalloc()
  120. {
  121.         return kmalloc((size_t)ulArg0, (int)ulArg1);
  122. }

  123. AFU_ATTRIBUTE_FUNC
  124. void wrap_kfree()
  125. {
  126.         kfree(pvArg0);
  127. }

  128. AFU_ATTRIBUTE_FUNC
  129. int wrap_printk(const char *fmt, ...)
  130. {
  131.         va_list args;
  132.         char buffer[1024];
  133.         va_start(args, fmt);
  134.         (void) vsnprintf(buffer, sizeof(buffer), fmt, args);
  135.         va_end(args);
  136.         return printk("%s", buffer);
  137. }

  138. AFU_ATTRIBUTE_FUNC
  139. unsigned long wrap_copy_from_user()
  140. {
  141.         return copy_from_user(pvArg0, pvArg1, ulArg0);
  142. }

  143. AFU_ATTRIBUTE_FUNC
  144. unsigned long wrap_copy_to_user()
  145. {
  146.         return copy_to_user(pvArg0, pvArg1, ulArg0);
  147. }

复制代码
这里是一个 amiwarp.h 文件.
  1. #define AFU_ATTRIBUTE_FUNC
  2. AFU_ATTRIBUTE_FUNC int wrap_register_chrdev(void);
  3. AFU_ATTRIBUTE_FUNC void wrap_unregister_chrdev(void);
  4. AFU_ATTRIBUTE_FUNC void wrap_mem_map_reserve(void);
  5. AFU_ATTRIBUTE_FUNC void wrap_mem_map_unreserve(void);
  6. AFU_ATTRIBUTE_FUNC int wrap_remap_page_range(void);
  7. AFU_ATTRIBUTE_FUNC struct page *wrap_virt_to_page(void);
  8. AFU_ATTRIBUTE_FUNC void *wrap_kmalloc(void);
  9. AFU_ATTRIBUTE_FUNC void wrap_kfree(void);
  10. AFU_ATTRIBUTE_FUNC int wrap_printk(const char *fmt, ...);
  11. AFU_ATTRIBUTE_FUNC unsigned long wrap_copy_from_user(void);
  12. AFU_ATTRIBUTE_FUNC unsigned long wrap_copy_to_user(void);
  13. extern unsigned long   ulArg0;
  14. extern unsigned long   ulArg1;
  15. extern unsigned long   ulArg2;
  16. extern pgprot_t        pgArg0;
  17. extern void            *pvArg0;
  18. extern void            *pvArg1;
复制代码
Makefile
  1. ifndef KERNEL
  2. KERNEL = /lib/modules/$(shell uname -r)/build
  3. endif
  4. EXTRA_CFLAGS := -Wall -Wstrict-prototypes -O2 -fno-strict-aliasing
  5. obj-m   += amifldrv_mod.o
  6. amifldrv_mod-objs       :=      amifldrv.o amiwrap.o
  7. default:
  8.         make -C $(KERNEL) SUBDIRS=$(PWD) modules
  9.         rm -f amifldrv_mod.o
  10.         mv amifldrv_mod.ko amifldrv_mod.o
  11. .PHONY : clean
  12. clean:
  13.         rm -f *.*~
  14.         rm -f .*cmd
  15.         rm -f *.o
  16.         rm -f *mod*
  17.         rm -f *.ko
  18.         rm -f -d -r .tmp_versions/
复制代码

论坛徽章:
2
技术图书徽章
日期:2014-02-24 10:31:04技术图书徽章
日期:2014-03-20 16:11:43
发表于 2014-02-19 12:36 |显示全部楼层
struct file_operations amifldrv_fops =
{
  owner:   THIS_MODULE,
  open:    wrap_open,
  release: wrap_release,
  unlocked_ioctl:   wrap_ioctl,
  mmap:    wrap_mmap,
};
这个结构体好像是位域。不是很懂,求大神指点

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
发表于 2014-02-19 16:18 |显示全部楼层
找找struct file_operations的定义,看看有没有成员名称与ioctl类似的,把38行的这个改成那个应该就差不多了吧。
它原先的写法就是amifldrv_fops.ioctl = wrap_ioctl的意思,既然file_operations结构体改动过了,没有ioctl了,那自然过不了编译。

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
发表于 2014-02-19 16:35 |显示全部楼层
回复 2# 4059056


    这是GCC编译的扩展,不是位域,这种用法叫做”Designated Initializers“

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
发表于 2014-02-19 16:38 |显示全部楼层
回复 1# 蚊仔perlperl


    去内核源码里看看这个结构的定义啊。在include/linux/fs.h文件中,我这里看到的unlocked_ioctl函数指针原型是:
  1. long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
复制代码
,明显与你赋值的函数指针原型不匹配,所以出错是正常的。

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
发表于 2014-02-19 16:45 |显示全部楼层
本帖最后由 w_anthony 于 2014-02-19 16:47 编辑

回复 5# myworkstation


    LZ说“所以修改成unlocked_ioctl:  wrap_ioctl ,但还是出错这个错误”,这样说来,其实是另外一个错误吧,提示内容肯定不同,我被误导了。

论坛徽章:
2
技术图书徽章
日期:2014-02-24 10:31:04技术图书徽章
日期:2014-03-20 16:11:43
发表于 2014-02-19 18:18 |显示全部楼层
受教回复 4# myworkstation


   

论坛徽章:
0
发表于 2014-02-20 08:48 |显示全部楼层
回复 5# myworkstation

请问在这个基上应该怎么修改?
   

论坛徽章:
0
发表于 2014-02-20 08:52 |显示全部楼层
回复 6# w_anthony

在没有修改成 unlocked_ioctl之前是这个错误的
amiwrap.c:39: error: unknown field ‘ioctl’ specified in initializer
                38

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
发表于 2014-02-20 11:27 |显示全部楼层
回复 8# 蚊仔perlperl


    把参数struct inode *inode去掉啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP