之前移植了linux-2.6.24.4和根文件系统(使用busybox-1.10.1创建)在GEC2410平台上运行。可参考之前的笔记:
内核配置: http://blog.csdn.net/shevsten/archive/2010/05/17/5599790.aspx
根文件系统: http://blog.csdn.net/shevsten/archive/2010/05/26/5625133.aspx
在测试一个用4.3(支持EABI)编译的应用程序时开始出现找不到库,将4.3.2编译器目录/usr/local/arm/compiler/arm-none-linux-gnueabi/libc/armv4t/lib中所有的库复制到根文件系统的lib目录,运行结果出现Illegal instruction。结果发现是编译器及EABI的问题,内核和根文件系统有必要使用新的编译器编译了。
那时候用的是crosstool编译出来的3.4.5的支持softfloat的编译器,如今的编译器早已升级到4.*, 浮点处理采用eabi方式.
EABI(Embedded Application Binary Interface)有许多革新之处,其中最突出的改进就是Float Point Performance,它使用Vector Float Point(矢量浮点),因此可以极大提高涉及到浮点运算的程序。
在原来移植好的linux-2.6.24.4基础上进行修改(详见上一篇文章):
一.内核移植
1.修改makefile中的CROSS_COMPILE,即设置编译器路径
ARCH ?= arm
CROSS_COMPILE ?= /usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-
2.配置内核,增加eabi支持
[localhost linux-2.6.24.4]$ make gec2410_defconfig
[localhost linux-2.6.24.4]$ make menuconfig
在Kernel Features里勾选上EABI的支持.
[*] Use the ARM EABI to compile the kernel
[*] Allow old ABI binaries to run with this kernel (EXPERIMENTAL) (NEW)
3.重新编译
$ make
编译过程中会出现undefined reference to `__udivdi3'的错误.
网上搜索了一下,解决办法为:
在makefile中查找到:
KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs /
-fno-strict-aliasing -fno-common /
-Werror-implicit-function-declaration 改为:
改为
KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs /
-fno-strict-aliasing -fno-common /
-fno-tree-scev-cprop /
-Werror-implicit-function-declaration
然后重新编译就OK了
4.生成uImage并烧写到板子中
5.重启班子,就可以看到linux的启动信息了(红色为编译器信息)
## Booting image at 30008000 ...
Image Name: linux-2.6.24
Created: 2010-12-24 7:43:06 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1541736 Bytes = 1.5 MB
Load Address: 30008000
Entry Point: 30008040
Verifying Checksum ... OK
XIP Kernel Image ... OK
Starting kernel ...
Uncompressing Linux.............................................................
....................................... done, booting the kernel.
Linux version 2.6.24.4 (matt@localhost) (gcc version 4.3.2 (Sourcery G++ Lite 20
08q3-72) ) #1 Fri Dec 24 15:40:53 CST 2010
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=00007177
......
二.根文件系统移植
1.修改makefile为新的编译器路径
CROSS_COMPILE ?= /usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-
2.重新编译
[localhost busybox-1.10.1]$ make
[localhost busybox-1.10.1]$ make install
3.将_install新的文件生成新的根文件系统(cramfs,ramdisk...)
具体方法可参考:http://blog.csdn.net/shevsten/archive/2010/05/26/5625133.aspx
尝试了使用新的busybox,如1.14.3, 1.15.2,但是做出来的根文件系统都会在Freeing init memory: 132K处挂起,网上说是和eabi有关系,尝试了很多次也没有找到解决办法,可能要使用更新版的linux内核吧。
三.测试程序
1. 写一个很简单的hello程序:
[localhost GEC2410]$ vi hello.c
#include <stdio.h>
int main(void)
{
printf("Hello, World!/n");
return 0;
}
保存退出
:x
2.编译
首先设置编译器路径环境变量,这样就可以直接使用arm-linux-gcc的命令了。这里使用修改.bashrc文件的方法。增加PATH路径
[localhost GEC2410]$ cd ~
[localhost ~] $ vi .bashrc
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# User specific aliases and functions
export CROSS_COMPILE=arm-linux-
export PATH=/usr/local/arm/4.3.2/bin:$PATH
保存退出
:x
[localhost ~] $ source .bashrc
可以使用export命令来看看新的环境变量生效了没有,如果没有需要注销重启
[localhost ~] $ export
declare -x PATH="/usr/local/arm/4.3.2/bin:/usr/local/arm/4.3.2/bin:/usr/lib/qt-3.3/bin:/usr/kerberos/bin:/usr/lib/ccache:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/matt/bin"
可以看到路径已经被添加了
接着就来编译上面的hello.c
[localhost GEC2410] $ arm-linux-gcc –o hello hello.c
这样编译出来的是动态链接的hello
运行的话需要有动态库的支持,这时就需要将/usr/local/arm/compiler/arm-none-linux-gnueabi/libc/armv4t/lib的库复制到根文件系统的lib目录中,否则运行会报找不到库的错误。(有些应用程序还需要/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/lib中的库文件)
[localhost GEC2410] $ arm-linux-gcc -static–o hello hello.c
加上-static的标签就将hello静态链接了,这样就可以直接运行了,但是文件体积会大了不少
将新的根文件系统烧写到目标机的flash上运行:
$ ./hello
Hello, World!
为了确保软件的EABI匹配性,不出现Illegal instruction的错误,应该保证
1. 编译kernel的时候在Kernel Features选项中选上EABI
2. 所有的软件都是用支持EABI的编译器(例如arm-linux-4.3.2)来编译