Posted on 2008-01-19 15:22
buf 阅读(569)
评论(0) 编辑 收藏 引用 所属分类:
Embedded
有了Getting familiar with uClinux/ARM 2.6一文提供的step by step指导,我的uClinux很快在Armulator中运行起来了。由于我使用了不同的uClinux distro(20051130),编译过程中曾出现一些让我莫名其妙的问题,在此记录一下。
当所有准备工作就绪,执行make menuconfig发现并没有按照uClinux-dist/vendors/GDB/Armulator目录下的默认配置文件进行内核、库、用户程序的设置。从make的输出也发现ARCH=arm,我想这不能啊,应该是armnommu才对啊。于是make mrproper再次执行make menuconfig,依然如此。于是查找ARCH=arm出处:uClinux-dist/vendors/GDB/Armulator/config.arch中包含了一个针对armnommu体系结构的通用配置文件$(ROOTDIR)/vendors/config/armnommu/config.arch
,后者定义了ARCH:
. . .
MACHINE = arm
ifdef CONFIG_DEFAULTS_KERNEL_2_6
ARCH = arm
else
ARCH = armnommu
endif
ENDIAN ?= little
CROSS_COMPILE = arm-elf-
CROSS = $(CROSS_COMPILE)
. . .
问题就在这里了。由于我要编译的是内核版本是linux-2.6.5,于是 CONFIG_DEFAULTS_KERNEL_2_6 会被定义,ARCH自然就定义为arm了。原来在较早的linux-2.6-xx代码树中(比如这里我所使用的linux-2.6.5),armnommu是一个独立的ARCH,但是不知从哪个版本开始,armnommu被合并到arm中去了。我使用了较新的uClinux distro,已经增加了对CONFIG_DEFAULTS_KERNEL_2_6的检查来决定ARCH的定义,所以出现了上面的问题。
解决的办法也很清楚了,去掉上面对 CONFIG_DEFAULTS_KERNEL_2_6的检查,直接定义ARCH为armnommu就OK了:
MACHINE = arm
#ifdef CONFIG_DEFAULTS_KERNEL_2_6
#ARCH = arm
#else
#ARCH = armnommu
#endif
ARCH = armnommu
ENDIAN ?= little
CROSS_COMPILE = arm-elf-
CROSS = $(CROSS_COMPILE)
或者在执行make时在命令行中指定ARCH和CROSS_COMPILE,如:
$ make ARCH=armnommu CROSS_COMPILE=arm-elf- ...
这样makefile文件中所有对ARCH和CROSS_COMPILE的定义就都被忽略了。