请教大家:
我在Intel PXA270 ARM开发板上/usr/local和/root/code/两个地方放了开发板附带的交错编译工具,在/toxp/linux-2.6.9目录放了开发板附带的Linux内核文件,
我自己编写了一个空的驱动测试程序,用以下命令行编译:
/usr/local/arm-linux/bin/arm-linux-gcc -D__KERNEL__ -DMOUDULE -DDEBUG_PRINTK -static -I /root/code/arm-linux/arm-linux/include/linux -Wall -c driver.c
生成testm.o文件拷到ARM板上用insmod testm.o加载,提示错误如下:
[[email protected] /]#insmod testm.o
Using testm.o
No module found in object
insmod: cannot insert `testm.o ': Invalid module format (-1): Exec format error
[[email protected] /]#
我又用命令行:
/usr/local/arm-linux/bin/arm-linux-gcc -D__KERNEL__ -DMOUDULE -DDEBUG_PRINTK -static -I /toxp/linux-2.6.9/include -Wall -c driver.c
生成testm.o文件拷到ARM板上用insmod testm.o加载,提示同样的错误。
我用file testm.o命令查看testm.o的信息,屏幕显示:
testm.o: ELF 32-bit LSB relocatable, ARM, version 1 (ARM), not stripped
用uname -a在PXA270板上查看LINUX版本显示:Linux 2.6.9-270 SLI。
我想请问:
是否我用的gcc编译命令行有错误? --是否还要加什么参数?或应该加什么库文件编译?
全部程序代码如下:
#ifndef __KERNEL__
# define __KERNEL__
#endif
#ifndef MODULE
# define MODULE
#endif
#include <linux/init.h>
#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/module.h>
/*#ifdef CONFIG_SMP
#define __SMP__
#endif*/
MODULE_LICENSE( "GPL ");
static int hello_init(void)
{
printk(KERN_ALERT "Hello,world\n ");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye,cruel world\n ");
}
module_init(hello_init);
module_exit(hello_exit);
------解决方案--------------------
感觉gcc编译命令行没问题
我一般都是用:
gcc -D__KERNEL__ -DMODULE -DLINUX -I /usr/local/src/linux2.4/include -c -o hello.o hello.c
试试在hello_init前加__init
hello_exit前加__exit
------解决方案--------------------
要不你就换个2.4的内核,要不你就按照2.6的编译方法编译。不要弄混了。
2.6的编译方法网上找找,很多。编译出来是.ko文件,makefile也不是你命令行里那样。
------解决方案--------------------
a.在Makefile中找到下面这一行:
SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
-e s/arm.*/arm/ -e s/sa110/arm/ \
-e s/s390x/s390/ -e s/parisc64/parisc/ \
-e s/ppc64/powerpc/ )
前面加#,将它注销掉。
b.找到下列行:
ARCH ?=$(SUBARCH)
CROSS_COMPILE ?=
改成:
ARCH := arm
CROSS_COMPILE =/usr/local/arm-linux/bin/arm-linux-gcc
也可以用别的办法,方法较多。
------解决方案--------------------
如果是2.6的内核,那你就看LINUX设备驱动第3版
那上边有比较完备的makefile
2.4-> 2.6在驱动上做了很大改动,2.4的驱动基本用不了。