日期:2014-05-16  浏览次数:20606 次

编写ARM上Linux驱动程序出错,请教高手要写些什么结构
我弄了一个最简单的驱动程序编译完了在PC机上可以运行,用交差编译器和ARM C语言库编译后到ARM上运行,提示:Invalid   module   format(-1):Exec   format   error,请问我的程序错在哪里,要改些什么结构?(我的开发板是Intel270,OS是BusyBox Linux).谢谢!

#ifndef   __KERNEL__
#   define   __KERNEL__
#endif

#ifndef   MODULE
#   define   MODULE
#endif

#include   <linux/config.h>
#include   <linux/module.h>

MODULE_LICENSE( "GPL ");
#ifdef   CONFIG_SMP
#define   __SMP__
#endif


#include   <linux/kernel.h>   /*   printk()在这个文件里   */

static   int   init_module()
{
printk( "Hello,test   World!\n ");
return   0;   /*   如果初始工作失败,就返回非0   */
}

static   void   cleanup_module()
{
printk( "Bye!\n ");
}

------解决方案--------------------
按提示是你编译的问题,不是目标机器所认识的格式
------解决方案--------------------
提示编译的目标格式不对啊

是不是编译也要相应的arm内核源代码?
------解决方案--------------------
很显然,是你的MAKEFILE没对
再者,编译是需要arm-linux内核源码的,因为需要头文件
------解决方案--------------------
你开发板上的内核版本(配置)和你交叉编译环境的内核版本(配置)不一致吧。
你需要把用目标板上的系统代码和lib拿来交叉编译才行。
------解决方案--------------------
请用静态编译 makefile 里加 -static
------解决方案--------------------
这是我在用的一个Makefile

ifeq ($(KERNELRELEASE),)
KERNELDIR ?=/linuxsrc
PWD := $(shell pwd)

modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

else
obj-m = mymodule
endif

不过在使用以前要设置几个环境PATH,ARCH和CROSS_COMPILE,而且Makefile里面的linux源代码树是用交叉编译环境编译过的,要不然会缺少文件。然后直接make就K.O.了。
Good luck!
------解决方案--------------------
请教:我在FC6 下编译,编译在FC6 下的模块,库文件用的是 /usr/src/kernels/2.6.18-1.2798.fc6-i686/include/ ,编译的时候,提示很多库文件里面有很多错误,自己去下了个Linux 2.6.18内核,也是一样很多错误,,

库文件要怎么设置?

------解决方案--------------------
去下载<<LINUX设备驱动程序> > 第三版中的例程源代码,稍改一下就OK了,至于下载地点,你去看一看那本书的前言,里面说了源码的下载地址