uClinux Image Compiling User Guide2 uClinux Image Compiling User Guide2 for lumit4510 : how to compile uClinux kernel 说明: 本小节内容是关于如何编译一个可以运行的 uClinux Kernel ( 基于 20040408 版 ) ------------------------------------------------------------------------- 这篇文档详细说明了如何从 RedHat9.0 开始,建立交叉编译环境,编译 uClinux 内核, 如何通过 SkyEye 模拟器进行事先验证,然后再下载到真实开发板执行,最后添加自己的应用程序。 有 linux pc 环境的可以在自己的机器上面动手试试,特别适合于还没有开发板的初学者。 ************************************************************************** Step 0 : 安装交叉编译器 GNU Toolchain 1. 下载 arm-elf-tools-20011219.tar.gz http://159.226.40.150/lumit/resources/uClinux/Toolchain/arm-elf-tools-20011219.tar.gz
2. 下载 arm-elf-tools-20030314.sh http://159.226.40.150/lumit/resources/uClinux/Toolchain/arm-elf-tools-20030314.sh 3. 这两个文件需要在同一个目录下,arm-elf-tools-20030314.sh 是一个可以自动安装的脚本文件 改变属性为可执行文件: chmod 755 arm-elf-tools-20030314.sh 4. 执行脚本即可完成交叉编译器的安装 ./arm-elf-tools-20030314.sh 5. 测试一下,输入 arm-elf-gcc 看看是否能够自动补齐? [admin@localhost admin]$ arm-elf-gcc -v Reading specs from /usr/local/lib/gcc-lib/arm-elf/2.95.3/specs gcc version 2.95.3 20010315 (release)(ColdFire patches - 20010318 from http://fiddes.net/coldfire/)(uClinux XIP and shared lib patches from http://www.snapgear.com/) [admin@localhost admin]$ which arm-elf-gcc /usr/local/bin/arm-elf-gcc 表明 arm-elf-gcc 已经安装在 /usr/local/bin/ 目录下了。 Step 1 : 交叉编译 uClinux 内核 1. 下载 uClinux-dist-20040408.tar.gz 到当前工作目录下 http://159.226.40.150/lumit/resources/uClinux/uClinux-dist-20040408.tar.gz
2. 解压 uClinux-dist-20040408.tar.gz 文件到 uClinux-dist 目录 tar xvzf uClinux-dist-20040408.tar.gz 此时当前工作目录下增加了一个名为 uClinux-dist 的目录。 3. 进入 uClinux-dist 目录 cd uClinux-dist 4. 修改 vmlinux-armv.lds.in 文件, vi linux-2.4.x/arch/armnommu/vmlinux-armv.lds.in 在 *(got) /* Global Offset table */ 之后添加如下语句: romfs_data = .; romfs.o romfs_data_end = .; 即修改为: 65 *(.got) /* Global offset table */ 66 67 /* add by lumit - http://www.lumit.org */ 68 romfs_data = .; 69 romfs.o 70 romfs_data_end = .; 5. 修改 vendors/Samsung/4510B/Makefile 文件, vi vendors/Samsung/4510B/Makefile 在 image 目标的第三行,增加一条语句: arm-elf-ld -r -o $(ROOTDIR)/$(LINUXDIR)/romfs.o -b binary $(ROMFSIMG) 如下为增加之后: 63 image: 64 [ -d $(IMAGEDIR) ] || mkdir -p $(IMAGEDIR) 65 genromfs -v -V "ROMdisk" -f $(ROMFSIMG) -d $(ROMFSDIR) 66 arm-elf-ld -r -o $(ROOTDIR)/$(LINUXDIR)/romfs.o -b binary $(ROMFSIMG) 67 $(CROSS_COMPILE)objcopy -O binary --remove-section=.romvec / 68 --remove-section=.text --remove-section=.ramvec / 69 --remove-section=.init / 70 --remove-section=.bss --remove-section=.eram / 71 $(ROOTDIR)/$(LINUXDIR)/linux $(IMAGEDIR)/linux.data 6. make menuconfig 在 Vendor/Product Selection ---> 中选择 --- Select the Vendor you wish to target (Samsung) Vendor --- Select the Product you wish to target (4510B) Samsung Products 在 Kernel/Library/Defaults Selection ---> 中选择 (linux-2.4.x) Kernel Version (uClibc) Libc Version 其他选项都不变,按照缺省设置,选择退出,保存配置。 7. make dep 8. make lib_only 9. make user_only [说明] 编译login,boa程序时可能出现 undefined reference to 'crypt_old'的错误, boa.elf2flt: In function `auth_check_userpass': /tmp/liming/uClinux-dist/user/boa/src/auth.c:281: undefined reference to `crypt_old' 可以修改 config/.config 注释掉第25行的 CONFIG_USER_OLD_PASSWORDS 如下: 24 CONFIG_USER_LOGIN_LOGIN=y 25 # CONFIG_USER_OLD_PASSWORDS=y 26 # CONFIG_USER_ONLY_ROOT is not set 然后再 cd user/boa/src/ rm *.o 重新编译 make user_only 一下这个目录里面的 obj 文件就可以了。 10. make romfs 11. make arch/armnommu/mm/mm.o: In function `free_initmem': /tmp/liming/uClinux-dist/linux-2.4.x/arch/armnommu/mm/init.c:240: undefined reference to `machine_is_ta7v' 这个错误只要注释该文件的相关代码即可。 655 void free_initmem(void) 656 { 657 if (!machine_is_integrator() && 658 !machine_is_p52() && 659 !machine_is_cx821xx() && 660 !machine_is_atmel() && 661 !machine_is_netarm() && 662 // !machine_is_ta7v() && 663 !machine_is_ta7s()) { 664 free_area((unsigned long)(&__init_begin), 665 (unsigned long)(&__init_end), 666 "init"); 12. make image 此时得到 linux-2.4.x/linux 文件和 image.bin Step 2: 通过 SkyEye 测试刚才编译得到的 linux-2.4.x/linux 内核是否可以运行。
Step 3: 如果 SkyEye 模拟器上测试通过了,那么就可以下载到 lumit4510 开发板试试了。
Step 4: 如果在 lumit4510 上可以运行 image.ram ,那么就可以添加自己的应用程序了。
|