Invalid module format (-1): Exec format error
我仿照网上的例子编译字符驱动,在linux9 上能编译gcc -D__KERNEL__ -DMODULE -static -DLINUX -I /usr/src/linux-2.4/include -c -o globalvar.o globalvar.c
然后在本机insmod globalvar.o。可是用检查编译arm-linux-gcc -D__KERNEL__ -DMODULE -static -DLINUX -I /home/global/k26/linux/include -c -o globalvar.o globalvar.c生成globalvar.o后,下载到arm板上,arm板上的linux内核也是在同一个pc主机,用同样的编译器编译的。下载到arm板上,insmod globalvar.o,则抱错:insmod: cannot insert `globalvar.o': Invalid module format (-1): Exec format error
不知道是哪里出了问题?想请教。
以下是
字符驱动
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
MODULE_LICENSE("GPL");
#define MAJOR_NUM 254 //主设备号
static ssize_t globalvar_read(struct file *, char *, size_t, loff_t*);
static ssize_t globalvar_write(struct file *, const char *, size_t, loff_t*);
//初始化字符设备驱动的file_operations结构体
struct file_operations globalvar_fops =
{
read: globalvar_read, write: globalvar_write,
};
static int global_var = 0; //"globalvar"设备的全局变量
static int __init globalvar_init(void)
{
int ret;
//注册设备驱动
ret = register_chrdev(MAJOR_NUM, "globalvar", &globalvar_fops);
if (ret)
{
printk("globalvar register failure");
}
else
{
printk("globalvar register success");
}
return ret;
}
static void __exit globalvar_exit(void)
{
int ret;
//注销设备驱动
ret = unregister_chrdev(MAJOR_NUM, "globalvar");
if (ret)
{
printk("globalvar unregister failure");
}
else
{
printk("globalvar unregister success");
}
}
static ssize_t globalvar_read(struct file *filp, char *buf, size_t len, loff_t *off)
{
//将global_var从内核空间复制到用户空间
if (copy_to_user(buf, &global_var, sizeof(int)))
{
return - EFAULT;
}
return sizeof(int);
}
static ssize_t globalvar_write(struct file *filp, const char *buf, size_t len, loff_t *off)
{
//将用户空间的数据复制到内核空间的global_var
if (copy_from_user(&global_var, buf, sizeof(int)))
{
return - EFAULT;
}
return sizeof(int);
}
module_init(globalvar_init);
module_exit(globalvar_exit);
[ 本帖最后由 againyuan 于 2007-10-27 21:21 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我的pc机上linux是2.4的,目标板上的是2.6.9,是不是他们的编译方式不一样。
.o .ko 。到底应该怎样编译呢?
谢谢哦!
把ldd3看一下, 2.4 与2.6 kernel 的驱动的不同