ubuntu下编译uclinux skyeye上运行
一、建立交叉编译环境
准备交叉编译器# wgethttp://www.uclinux.org/pub/uClinux/uclinux-elf-tools/arm-elf-tools-20030314.sh
1、chmod 755 arm-elf-tools-20030314.sh改变权限
2、sudo sh ./arm-elf-tools-20030314.sh
一般情况下,会提示以下错误:
#################################
#tail: cannot open `+43'for reading: No such file or directory
#
#gzip: stdin: not in gzipformat
#tar: This does not looklike a tar archive
#tar: Error exit delayedfrom previous errors
#################################
解决方法:
*tail问题:tail: cannot open `+43'for reading: No such file or directory
用VIM打开该文件,将第39行的代码:
tail +${SKIP} ${SCRIPT} | gunzip | tar xvf -
改成如下:
tail -n +${SKIP} ${SCRIPT} | gunzip | tar xvf -
vim arm-elf-tools*
3、arm-elf-gcc -v 查看是否安装成功
二、编译ucclinux内核
1、准备内核 wget http://www.uclinux.org/pub/uClinux/dist/uClinux-dist-20041215.tar.gz
2、解压内核 tar zxvfuClinux-dist-20041215.tar.gz
3、cd uClinux-dist
编译步骤 :
1、make mrproper(一定要做这步哦)然后vi linux-2.4.x/arch/armnommu/vmlinux-armv.lds.in
在__sto__kallsyms = ,;
*(.got)后面加上:
romfs_data = .;
romfs.o
romfs_data_end = .;
然后wq退出 注意等号两边都有空格
2、makemenuconfig
主要是选择Vendor为GDB,Product为ARMulator;内核版本要选Linux-2.4.x,不要使用默认的2.6.x,因为交叉编译器版本才2.95.3,太低,2.6.x要求交叉编译器版本不低于3.2。lib选择uclibc。
3、makedep
在第一次编译的时候执行,为了是建立文件之间的依赖关系,make命令会根据这个依赖关系来确定哪些文件需要重新编译,哪些文件可以跳过
4、makelib_only
编译uClibc库
5、makeuser_only
编译用户制定的应用程序,比如初始化进程init,bash,以及集成了很多常用工具的嵌入式软件包busybox。
我使用uClinux-dist-20051110.tar.gz时总是出现一个错误
make[3]: *** [alias.o]段错误 (core dumped)
make[3]:正在离开目录 `/usr/src/uClinux-dist/user/boa/src'
make[2]: *** [all] 错误 2
make[2]:正在离开目录 `/usr/src/uClinux-dist/user/boa'
make[1]: *** [all] 错误 2
make[1]:正在离开目录 `/usr/src/uClinux-dist/user'
make: *** [user_only] 错误 2
这个困扰我好久,实在没办法我就换了一个uclinux-dist,也就是现在用的uClinux-dist-20041215.tar.gz,使用这个uclinux版本没有错误。尴尬。。。。。。
6、makeromfs
uClinux经常才用romfs(只读文件系统)来作为系统的根文件系统,所以首先需要将之前编译的很多应用程序以uClinux所需要的目录格式存放起来。比如将可执行文件放在bin目录下,将配置文件放在etc目录下。该命令执行后会在uClinux-dist目录下生成一个romfs的目录,并且将文件系统所需要的文件组织起来,以便之后生成fomfs的映象文件。
7、makelinux
执行该命令之后将生成linux内核文件。这一步一定要在make image前编译。因为我在这出现过错误。
8、make image
生成romfs文件系统的映象文件,以及linux的映象文件。该linux的映象文件是elf格式的,是不能直接下载到开发板上执行的(里面包含了大量的调试信息,elf文件执行前的环境建立信息等内容。该文件可以使用arm-elf-objcopy工具来生成可以直接在RAM中执行的binary文件)。
9、编译成功后image中的文件
image.bin linux.data linux.text romfs.img
4、编译错误
错误1、在make user_only后make image会出现一个arm-elf-objcopy: /home/init/learn_linux/arm-uclinux/uClinux-dist/linux- 2.4.x/linux:文件不存在
解决方法: 先make linux后在make image 不会出现如此错误。
错误2、cannot open romfs.o: No such fileordirectory make[1]: *** [linux] Error 1
解决方法: cp ./linux-2.4.x/fs/romfs/romfs.o ./linux-2.4.x/其实romfs.o文件已经生成,把它拷贝到linux-2.4.x目录下即可。
错误3、 multipledefinition of`romfs_file_operations'
romfs.o(.data+0x80):/curret1/uClinux-dist/linux-2.4.x/fs/romfs/inode.c:107:第一次在此定义
make[1]: *** [linux]错误 1
make[1]: Leavingdirectory`/curret1/uClinux-dist/linux-2.4.x'
make: *** [linux] 错误1
解决方法:vi uClinux-dist/linux-2.4.x/fs/romfs/inode.c
static(这地方没有加上)struct file_operationsromfs_file_operations 将static加上即可。
这些是我编译uClinux-dist-20041215.tar.gz的错误,至于uClinux-dist-20051110.tar.gz的编译出现过很多错误,也不知道是为啥。
三、skyeyes上运行
1、安装skyeye
code: apt-get install skyeye
2、linux内核文件在uClinux-dist/linux-2.4.x/目录下,拷贝linux到images文件夹下,
code: cp ./linux-2.4.x/linux ./images
3、到image目录下编辑skyeye.conf,内容如下:
code:cd image/
code :vi skyeye.conf
#skyeyeconfig file sample
arch:arm
cpu:arm7tdmi
mach:at91
mem_bank:map=M, type=RW, addr=0x00000000, size=0x00004000
mem_bank:map=M, type=RW, addr=0x01000000, size=0x00400000
mem_bank:map=M, type=R, addr=0x01400000, size=0x00400000, file=./romfs.img
mem_bank:map=M, type=RW, addr=0x02000000, size=0x00400000
mem_bank:map=M, type=RW, addr=0x02400000, size=0x00008000
mem_bank:map=M, type=RW, addr=0x04000000, size=0x00400000
mem_bank:map=I, type=RW, addr=0xf0000000, size=0x10000000
#setnic info
#net:type=cs8900a, base=0xfffa0000, size=0x20,int=16, mac=0:4:3:2:1:f,ethmod=tuntap, hostip=10.0.0.1
net:type=cs8900a, ethmod=tuntap, hostip=10.0.0.1
uart:mod = term
#dbct:state=on
ESC后,:wq退出
4、在image下执行
code: skyeye -c skyeye.conf -elinux
见到下图即为正确
ctrl+c 退出
四、添加自己的小程序到uclinux上运行
1、在user目录下建立自己的程序hello.c
code: cd user/
mkdir test
cd test
vi hello.c 代码如下
#include<stdio.h>
intmain(void)
{
printf("Hello,uClinux!");
return(0);
}
2、编译hello.c并拷贝hello
code: arm-elf-gcc -Wall -elf2flt -o hellohello.c
cp ./hello ../../romfs/bin/
3、在test目录下建立一个Makefile文件
code:vi Makefile
EXEC =hello
OBJS =hello.o
all:$(EXEC)
$(EXEC):$(OBJS)
$(CC) $(LDFLAGS) -o $@ $(OBJS)$(LDLIBS)
$(OBJS):hello.c
romfs:
$(ROMFSINST) /bin/$(EXEC)
clean:
-rm -f $(EXEC) *.elf *.gdb *.o
4、相关配置
1、编辑uClinux目录下的文件user/Makefile,增加下面这行文字:dir_$(CONFIG_USER_TEST_HELLO) += test
2、编辑uClinux目录下的文件config/Configure.help,在文件末尾追加下面这段文字:
CONFIG_USER_TEST_HELLO
Thisis an example C program in uClinux OS, and it will print "Hello,uClinux!" on screen.
3、编辑uClinux目录下的文件config/config.in,在文件末尾追加下面这段文字:
#########################
mainmenu_optionnext_comment
comment'Test'
bool 'hello' CONFIG_USER_TEST_HELLO
endmenu
#########################
5、重新编译内核
code:
genromfs-v -V "ROMdisk" -f ./images/romfs.img -d ./romfs
make image
make
6、在image下运行
code: skyeye -c skyeye.conf -e linux
转载:请注明出处http://blog.csdn.net/paoxungan5156/article/details/72667924