Chinaunix
标题:
编译出错跪求帮忙
[打印本页]
作者:
蚊仔perlperl
时间:
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
#include <linux/version.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/string.h>
#include <linux/errno.h>
#include <linux/mm.h>
#include <linux/vmalloc.h>
#include <linux/mman.h>
#include <linux/slab.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
#include <linux/wrapper.h>
#endif
#include "amiwrap.h"
extern int amifldrv_ioctl(void);
extern int amifldrv_mmap(void);
unsigned long ulArg0;
unsigned long ulArg1;
unsigned long ulArg2;
pgprot_t pgArg0;
void *pvArg0;
void *pvArg1;
AFU_ATTRIBUTE_FUNC static int wrap_open(struct inode *inode, struct file *file);
AFU_ATTRIBUTE_FUNC static int wrap_release(struct inode *inode, struct file *file);
AFU_ATTRIBUTE_FUNC static int wrap_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);
AFU_ATTRIBUTE_FUNC static int wrap_mmap(struct file *file, struct vm_area_struct *vma);
struct file_operations amifldrv_fops =
{
owner: THIS_MODULE,
open: wrap_open,
release: wrap_release,
unlocked_ioctl: wrap_ioctl,
mmap: wrap_mmap,
};
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
#define mem_map_reserve(p) set_bit(PG_reserved, &((p)->flags))
#define mem_map_unreserve(p) clear_bit(PG_reserved, &((p)->flags))
MODULE_AUTHOR("American Megatrends Inc.");
MODULE_DESCRIPTION("AMI Flash Update utility driver");
MODULE_LICENSE("Dual BSD/GPL");
#endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
static int device_open_count = 0;
#endif
AFU_ATTRIBUTE_FUNC
int wrap_open(struct inode *inode, struct file *file)
{
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
MOD_INC_USE_COUNT;
#else
if (device_open_count)
return -EBUSY;
device_open_count++;
try_module_get(THIS_MODULE);
#endif
return(0);
}
AFU_ATTRIBUTE_FUNC
int wrap_release(struct inode *inode, struct file *file)
{
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
MOD_DEC_USE_COUNT;
#else
device_open_count--;
module_put(THIS_MODULE);
#endif
return(0);
}
AFU_ATTRIBUTE_FUNC
int wrap_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
{
pvArg0 = inode;
pvArg1 = filp;
ulArg0 = cmd;
ulArg1 = arg;
return amifldrv_ioctl();
}
AFU_ATTRIBUTE_FUNC
int wrap_mmap(struct file *file, struct vm_area_struct *vma)
{
pvArg0 = file;
pvArg1 = vma;
return amifldrv_mmap();
}
AFU_ATTRIBUTE_FUNC
int wrap_register_chrdev()
{
return register_chrdev((unsigned int)ulArg0, "amifldrv", (struct file_operations *)pvArg0);
}
AFU_ATTRIBUTE_FUNC
void wrap_mem_map_reserve()
{
mem_map_reserve((struct page*)pvArg0);
}
AFU_ATTRIBUTE_FUNC
void wrap_mem_map_unreserve()
{
mem_map_unreserve((struct page*)pvArg0);
}
AFU_ATTRIBUTE_FUNC
struct page *wrap_virt_to_page()
{
return virt_to_page(ulArg0);
}
AFU_ATTRIBUTE_FUNC
int wrap_remap_page_range()
{
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
ulArg1 = ulArg1>>PAGE_SHIFT;
return remap_pfn_range((struct vm_area_struct *)pvArg0, ulArg0, ulArg1, ulArg2, pgArg0);
#else
return remap_page_range((struct vm_area_struct *)pvArg0, ulArg0, ulArg1, ulArg2, pgArg0);
#endif
}
AFU_ATTRIBUTE_FUNC
void *wrap_kmalloc()
{
return kmalloc((size_t)ulArg0, (int)ulArg1);
}
AFU_ATTRIBUTE_FUNC
void wrap_kfree()
{
kfree(pvArg0);
}
AFU_ATTRIBUTE_FUNC
int wrap_printk(const char *fmt, ...)
{
va_list args;
char buffer[1024];
va_start(args, fmt);
(void) vsnprintf(buffer, sizeof(buffer), fmt, args);
va_end(args);
return printk("%s", buffer);
}
AFU_ATTRIBUTE_FUNC
unsigned long wrap_copy_from_user()
{
return copy_from_user(pvArg0, pvArg1, ulArg0);
}
AFU_ATTRIBUTE_FUNC
unsigned long wrap_copy_to_user()
{
return copy_to_user(pvArg0, pvArg1, ulArg0);
}
复制代码
这里是一个 amiwarp.h 文件.
#define AFU_ATTRIBUTE_FUNC
AFU_ATTRIBUTE_FUNC int wrap_register_chrdev(void);
AFU_ATTRIBUTE_FUNC void wrap_unregister_chrdev(void);
AFU_ATTRIBUTE_FUNC void wrap_mem_map_reserve(void);
AFU_ATTRIBUTE_FUNC void wrap_mem_map_unreserve(void);
AFU_ATTRIBUTE_FUNC int wrap_remap_page_range(void);
AFU_ATTRIBUTE_FUNC struct page *wrap_virt_to_page(void);
AFU_ATTRIBUTE_FUNC void *wrap_kmalloc(void);
AFU_ATTRIBUTE_FUNC void wrap_kfree(void);
AFU_ATTRIBUTE_FUNC int wrap_printk(const char *fmt, ...);
AFU_ATTRIBUTE_FUNC unsigned long wrap_copy_from_user(void);
AFU_ATTRIBUTE_FUNC unsigned long wrap_copy_to_user(void);
extern unsigned long ulArg0;
extern unsigned long ulArg1;
extern unsigned long ulArg2;
extern pgprot_t pgArg0;
extern void *pvArg0;
extern void *pvArg1;
复制代码
Makefile
ifndef KERNEL
KERNEL = /lib/modules/$(shell uname -r)/build
endif
EXTRA_CFLAGS := -Wall -Wstrict-prototypes -O2 -fno-strict-aliasing
obj-m += amifldrv_mod.o
amifldrv_mod-objs := amifldrv.o amiwrap.o
default:
make -C $(KERNEL) SUBDIRS=$(PWD) modules
rm -f amifldrv_mod.o
mv amifldrv_mod.ko amifldrv_mod.o
.PHONY : clean
clean:
rm -f *.*~
rm -f .*cmd
rm -f *.o
rm -f *mod*
rm -f *.ko
rm -f -d -r .tmp_versions/
复制代码
作者:
4059056
时间:
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,
};
这个结构体好像是位域。不是很懂,求大神指点
作者:
w_anthony
时间:
2014-02-19 16:18
找找struct file_operations的定义,看看有没有成员名称与ioctl类似的,把38行的这个改成那个应该就差不多了吧。
它原先的写法就是amifldrv_fops.ioctl = wrap_ioctl的意思,既然file_operations结构体改动过了,没有ioctl了,那自然过不了编译。
作者:
myworkstation
时间:
2014-02-19 16:35
回复
2#
4059056
这是GCC编译的扩展,不是位域,这种用法叫做”Designated Initializers“
作者:
myworkstation
时间:
2014-02-19 16:38
回复
1#
蚊仔perlperl
去内核源码里看看这个结构的定义啊。在include/linux/fs.h文件中,我这里看到的unlocked_ioctl函数指针原型是:
long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
复制代码
,明显与你赋值的函数指针原型不匹配,所以出错是正常的。
作者:
w_anthony
时间:
2014-02-19 16:45
本帖最后由 w_anthony 于 2014-02-19 16:47 编辑
回复
5#
myworkstation
LZ说“所以修改成unlocked_ioctl: wrap_ioctl ,但还是出错这个错误”,这样说来,其实是另外一个错误吧,提示内容肯定不同,我被误导了。
作者:
4059056
时间:
2014-02-19 18:18
受教
回复
4#
myworkstation
作者:
蚊仔perlperl
时间:
2014-02-20 08:48
回复
5#
myworkstation
请问在这个基上应该怎么修改?
作者:
蚊仔perlperl
时间:
2014-02-20 08:52
回复
6#
w_anthony
在没有修改成 unlocked_ioctl之前是这个错误的
amiwrap.c:39: error: unknown field ‘ioctl’ specified in initializer
38
作者:
myworkstation
时间:
2014-02-20 11:27
回复
8#
蚊仔perlperl
把参数struct inode *inode去掉啊
作者:
蚊仔perlperl
时间:
2014-02-21 09:32
回复
10#
myworkstation
非常非常感谢,经你指教已经顺利编译通可了。
也非常感谢回贴的朋友们
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2