免费注册 查看新帖 |

Chinaunix

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

请教关于最简单的hello world 模块,编译出错!!! [复制链接]

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
11 [报告]
发表于 2008-01-11 17:59 |只看该作者
关键的好象应该是/usr/src下的这个kernel的source吧?

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
12 [报告]
发表于 2008-01-11 18:03 |只看该作者
  1. CROSS_COMPILE=/usr/local/arm/3.4.1/bin/arm-linux-
  2. ARCH:=arm
  3. CC:=$(CROSS_COMPILE)gcc
  4. LD:=$(CROSS_COMPILE)ld
  5. obj-m = keyboard.o
  6. module-objs = keyboard.o

  7. KDIR = /root/linux-2.6.12
  8. PWD = $(shell pwd)
  9. default:
  10.         $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
  11. clean:
  12.         rm -rf  *.o *.ko *~
复制代码



我交叉编译我的键盘驱动时,没有问题
至于你的helloworld,我真没看出来哪里有问题


那个/root/Linux-2.6.12是我的开发板版本的source
照我这个抄一下吧


  1. CROSS_COMPILE=/usr/local/arm/3.4.1/bin/arm-linux-
  2. ARCH:=arm
  3. CC:=$(CROSS_COMPILE)gcc
  4. LD:=$(CROSS_COMPILE)ld
  5. obj-m = hello.o
  6. module-objs = hello.o

  7. KDIR = /root/linux-2.6.12
  8. PWD = $(shell pwd)
  9. default:
  10.         $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
  11. clean:
  12.         rm -rf  *.o *.ko *~
复制代码

[ 本帖最后由 T-bagwell 于 2008-1-11 18:04 编辑 ]

论坛徽章:
0
13 [报告]
发表于 2008-01-14 11:26 |只看该作者

回复 #6 jojolin 的帖子

谢谢jojolin,我今天用你的方法在PC机上把helloworld模块调通了........
但是在开发板上却出现问题,我觉得主要是交叉编译的问题...............
下面是我用交叉编译出现的问题.....
代码如下:
CROSS_COMPILE=arm-linux-           #这是我的交叉编译工具,路径已经定义好了
CC=$(CROSS_COMPILE)gcc
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
else
        KDIR=/lib/modules/$(shell uname -r)/build
        PWD:=$(shell pwd)
default:
        $(MAKE) -C $(KDIR) M=$(PWD) modules
endif
                                                                                
clean:
        rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
然后出现错误了:
[root@localhost helloworld]# make
make -C /lib/modules/2.6.8.1/build M=/usr/local/driver-test/helloworld modules
make[1]: Entering directory `/usr/src/linux-2.6.8.1'
  CC [M]  /usr/local/driver-test/helloworld/hello.o
cc1: error: invalid option `preferred-stack-boundary=2'
cc1: error: bad value (i686) for -march= switch
Assembler messages:
Error: unknown architecture `i686'

请问我该怎么样去改呢????????????

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
14 [报告]
发表于 2008-01-14 14:34 |只看该作者
原帖由 guohua219 于 2008-1-14 11:26 发表
谢谢jojolin,我今天用你的方法在PC机上把helloworld模块调通了........
但是在开发板上却出现问题,我觉得主要是交叉编译的问题...............
下面是我用交叉编译出现的问题.....
代码如下:
CROSS_COMPILE ...




  1. [root@localhost code]# cat hello.c
  2. #include <linux/init.h>
  3. #include <linux/module.h>

  4. static int init_hello(void){
  5.         printk(KERN_ALERT"hello, violet world \n");
  6.         return 0;
  7. }
  8. static void cleanup_hello(void){
  9.         printk(KERN_ALERT"goodbye cruel world \n");
  10.                                                                                 
  11. }
  12. MODULE_LICENSE("Dual BSD/GPL");
  13. module_init(init_hello);
  14. module_exit(cleanup_hello);
复制代码

  1. [root@localhost code]# make
  2. make -C /home/liuqi/linux-2.6.8.1 SUBDIRS=/home/liuqi/code modules
  3. make[1]: Entering directory `/home/liuqi/linux-2.6.8.1'
  4.   Building modules, stage 2.
  5.   MODPOST
  6. make[1]: Leaving directory `/home/liuqi/linux-2.6.8.1'
复制代码

  1. [root@localhost code]# cat Makefile
  2. CROSS_COMPILE=/usr/local/arm/3.3.2/bin/arm-linux-
  3. ARCH:=arm
  4. CC:=$(CROSS_COMPILE)gcc
  5. LD:=$(CROSS_COMPILE)ld
  6. obj-m = hello.o
  7. module-objs = hello.o

  8. KDIR = /home/liuqi/linux-2.6.8.1
  9. PWD = $(shell pwd)
  10. default:
  11.         $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
  12. clean:
  13.         rm -rf  *.o *.ko *~
  14. [root@localhost code]#
复制代码




首先要知道一个问题,PC和ARM的区别,要不为什么要有交叉编译环境呢?
你的/lib是for ARM的吗?
还有,你的kernel的源代码是 For ARM的吗?

例如,我的/usr/src/kernels/2.6.23.1-42.fc8-i686/是我的pc的kernel source
而/home/liuqi/linux-2.6.8.1,是我for ARM的kernel source
/usr/local/arm/3.3.2/是我的arm-linux-*放的路径,可以export一下,然后就可以不用这种直接路径来作了,不知道你做了没
还有,kernel source编译一下之后,写driver会更好些,因为不编译一下,编译某些驱动时可能会出错

附件中是我刚刚编译完的file


你看我特意去找了个kernel的源代码编译一下,挺不容易的,就把分给我吧
呵呵

[ 本帖最后由 T-bagwell 于 2008-1-14 15:06 编辑 ]

code.tar.gz

3.55 KB, 下载次数: 26

论坛徽章:
0
15 [报告]
发表于 2008-01-14 16:05 |只看该作者

回复 #13 T-bagwell 的帖子

谢谢你!~~~~~~~~
不过我想问下问题
首先要知道一个问题,PC和ARM的区别,要不为什么要有交叉编译环境呢?
你的/lib是for ARM的吗?
还有,你的kernel的源代码是 For ARM的吗?

例如,我的/usr/src/kernels/2.6.23.1-42.fc8-i686/是我的pc的kernel source
而/home/liuqi/linux-2.6.8.1,是我for ARM的kernel source

这段话有些不明白的地方,望指点一二........
我升级的内核就是从2.4升级到2.6.8.1的,但你说的/lib是for ARM的吗?
我不大理解呀?????????我看了我的/lib下内容,应该是for 686的

我觉得你的意思是得要两个内核,是吧????我在/usr/src下就一个2.6.8.1的内核呀......
是不是还要个for ARM 的内核???这该怎么来获得呢????是通过重新编译的吗?????

你的code我也看了,但我用你的makefile也出现了同样的错误的.........
呵呵,放心,问题要是解决不了分也是全给你的哈

论坛徽章:
0
16 [报告]
发表于 2008-01-14 16:08 |只看该作者
/*

楼上的“背包”兄弟 ,追着你想让你分清楚在pc下运行的驱动模块要找pc上跑得内核,arm平台下运行的模块
要根据你移植目标板上的内核源代码编译出来。肯定就是这问题了。
特别是2.6写makefile给驱动,都可以不指定交叉编译了。只要你给个正确的内核路径,内核都移植成功了,交叉编译肯定是用对了,驱动也用它就好了。
http://www.ibm.com/developerworks/cn/linux/l-module26/
这篇文章你好好学习下,以后对怎么编译2.4还是2.6的驱动模块应该就没有疑问了。

*/

[ 本帖最后由 jojolin 于 2008-1-14 16:18 编辑 ]

论坛徽章:
0
17 [报告]
发表于 2008-01-14 16:09 |只看该作者
上面的5-----------10行是复制你文字哈..................................

论坛徽章:
0
18 [报告]
发表于 2008-01-14 16:23 |只看该作者
KDIR=/lib/modules/$(shell uname -r)/build是什么不是内核路径吧,你不是说内核路径是
home/liuqi/linux-2.6.8.1么????

KDIR= /home/liuqi/linux-2.6.8.1

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
19 [报告]
发表于 2008-01-14 16:24 |只看该作者
原帖由 guohua219 于 2008-1-14 16:05 发表
谢谢你!~~~~~~~~
不过我想问下问题
首先要知道一个问题,PC和ARM的区别,要不为什么要有交叉编译环境呢?
你的/lib是for ARM的吗?
还有,你的kernel的源代码是 For ARM的吗?

例如,我的/usr/src/kerne ...


>这段话有些不明白的地方,望指点一二........
>我升级的内核就是从2.4升级到2.6.8.1的,但你说的/lib是for ARM的吗?

你从2.4升级到2.6.8.1是升级的你的PC里的kernel吧?

>我不大理解呀?????????我看了我的/lib下内容,应该是for 686的
既然你想编译for ARM的,那么,他应该是For arm的,不应该是686的

>我觉得你的意思是得要两个内核,是吧????我在/usr/src下就一个2.6.8.1的内核呀......
不是的,一个就可以了,只要一个for你的arm板的内核就可以了,至于for你的pc的内核,可有可无

>是不是还要个for ARM 的内核???这该怎么来获得呢????是通过重新编译的吗?????
是的,要不怎么让ARM识别你的kernel呢?x86的指令和ARM的指令是有区别的,指令不同
ARM是RISC(精简指令集计算机)和你的PC机是CISC(复杂指令集计算机)
详细的可以参考一下两者的文档,google一下有很多

>你的code我也看了,但我用你的makefile也出现了同样的错误的.........
不应该了,呵呵,如果你的kernel是for arm的

>呵呵,放心,问题要是解决不了分也是全给你的哈
那先谢谢啦,呵呵

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
20 [报告]
发表于 2008-01-14 16:28 |只看该作者
原帖由 jojolin 于 2008-1-14 16:08 发表
/*

楼上的“背包”兄弟 ,追着你想让你分清楚在pc下运行的驱动模块要找pc上跑得内核,arm平台下运行的模块
要根据你移植目标板上的内核源代码编译出来。肯定就是这问题了。
特别是2.6写makefile给驱动,都 ...



这个背包说的是我咩?
叫我t-bag也行,呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP