免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 蚊仔perlperl
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(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/
复制代码

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

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

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

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

论坛徽章:
0
4 [报告]
发表于 2014-02-21 09:32 |显示全部楼层
回复 10# myworkstation

非常非常感谢,经你指教已经顺利编译通可了。
   
也非常感谢回贴的朋友们
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP