ARM926的Linux工具链的制作和测试

ARM926的Linux工具链的制作(续 : 基于uclibc)

本次制作与前一篇类似,出来用uClibc代替了Glibc

下载的代码目录 root: /home/lake/arm-uclibc-linux
目标目录
 dir: /home/lake/arm-uclibc-linux/uclibc-tools


1. 准备工作:

下载 Binutil2.17/Gcc3.4.6/uClibc0.9.28/Linux-kernel2.6.24
Patch:
  URL: http://gcc.gnu.org/bugzilla/attachment.cgi?id=6132
此时针对Gcc3.4编译libstd的补丁

环境设定
export PREFIX=/home/lake/arm-uclibc-linux/uclibc-tools
export TARGET=arm-uclibc-linux
export TARGET_PREFIX=$PREFIX/$TARGET
export  PATH=$PREFIX/bin:$PATH
编译的host环境是LFS6.3 /Gcc4.1.2版本,不过在Redhat Enterprise Linux4或者5上也可以编译通过。
lake:~/mysrc$ uname  -a
Linux LFS 2.6.24 #2 SMP Thu Apr 30 03:05:00 CST 2009 i686 i686 i386 GNU/Linux
lake:~/mysrc$

2.   编译binutil
 
#mkdir binutils
# cd build_binutils
# rm -fr *
# ../binutils-2.17/configure --target=$TARGET --prefix=$PREFIX --disable-multilib --disable-nls
# make all
# make install

3. 获得核心针对ARM926的头文件
cd  ~/lfs/linux-2.6.24  
make ARCH=arm CROSS_COMPILE=arm-linux-  defconfig
#make ARCH=arm CROSS_COMPILE=arm-linux-  menuconfig ------> Select ARM type
make ARCH=arm CROSS_COMPILE=arm-linux- 
make include/linux/version.h
cp -ar include/linux ${TARGET_PREFIX}/include/
cp -ar include/asm-arm ${TARGET_PREFIX}/include/asm
cp -ar include/asm-generic ${TARGET_PREFIX}/include/asm-generic
 cd $TARGET_PREFIX/
 ln -s include sys-include  ###GCC编译时候默认使用sys-include,做一个软连接

4. 编译GCC---第一阶段

patch URL: http://gcc.gnu.org/bugzilla/attachment.cgi?id=6132

lake:~/arm-uclibc-linux$ patch -p1 -d gcc-3.4.6 < gcc3.4-libstdc++-uclibc.patch
 ==============================================================
###Compile first stage gcc
# mkdir build_bootstrap
# cd build_bootstrap
# rm -fr *   ----->必须删除就的编译

../gcc-3.4.6/configure --target=$TARGET --prefix=$PREFIX /
--with-local-prefix=$TARGET_PREFIX --disable-multilib /
--with-newlib --disable-nls --enable-threads=no --enable-symvers=gnu /
--enable-__cxa_atexit --enable-languages=c --disable-shared /

注意有些编译器版本支持 --with-float=soft --with-softfloat-supp,这对编译U-boot有帮助,不过在Gcc3.4.6上,笔者未试成功
# make all-gcc
# make install-gcc


5. 编译uClibc
==================
#### 进入uClibc的解压目录
# make CROSS=arm-uclibc-linux-   menuconfig
-----> Choose ARM/ARM926T   . 
-----> Kernel header dir :  /home/lake/arm-uclibc-linux/uclibc-tools/arm-uclibc-linux

if not enable GCC"--with-float=soft --with-softfloat-supp", enable the following options
-----> Enable FPU etc
   │ │[*] Enable floating point number support       
   │ │[*]   Target CPU has a floating point unit (FPU) 
   │ │[*]   Enable full C99 math library support  

if enable GCC"--with-float=soft --with-softfloat-supp", disable all FPU options
     Target Processor Type (Arm 926T)  --->
   │ │[ ] Enable floating point number support    
## 以上是针对FPU软件实现的选择,在本例中,全选中FPU

# make CROSS=arm-uclibc-linux-
# make PREFIX=$TARGET_PREFIX install


6. 完整的编译GCC链接uClibc
=================
###Compile final stage gcc
# mkdir build_gcc2
# cd build_gcc2
# rm -fr *   ---->必须清除上次的编译文件
#
../gcc-3.4.6/configure --target=$TARGET --prefix=$PREFIX /
--with-local-prefix=$TARGET_PREFIX /
--enable-multilib /
--disable-nls /
--enable-threads=posix /
--enable-symvers=gnu /
--disable-__cxa_atexit /
--enable-languages=c,c++ /
--enable-shared /
--enable-c99 /
--enable-long-long /
--with-headers=$TARGET_PREFIX/include /
--with-libs=$TARGET_PREFIX/lib
# make all
make install
注: --with-float=soft --with-softfloat-supp  软件FPU本文不支持
 
7. 修改Gcc的默认链接spec文件
这一步很重要, Gcc默认的动态连接器是/lib/ld-linux.so.x,与glibc连接。需要修改为ld-uClibc.so

===============================================================
## Update Cross GCC spec
vi    $PREFIX/lib/gcc/arm-uclibc-linux/3.4.6/specs
 
 %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}
修改为 %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}


8. OK, 我们测试一下
测试的平台为一个已经运行的ARM926的Linux系统

/mnt/lake/mysrc $ uname -a
Linux (none) 2.6.14-xxxxxx-release #1 Sat Mar 21 18:06:04 CST 2009 armv5tejl unknown
~ $ cat /proc/cpuinfo
Processor       : ARM926EJ-Sid(wb) rev 5 (v5l)
BogoMIPS        : 146.63
Features        : swp half thumb fastmult edsp java
CPU implementer : 0x41
CPU architecture: 5TEJ
CPU variant     : 0x0
CPU part        : 0x926
CPU revision    : 5
Cache type      : write-back
Cache clean     : cp15 c7 ops
Cache lockdown  : format C
Cache format    : Harvard
I size          : 16384
I assoc         : 4
I line length   : 32
I sets          : 128
D size          : 16384
D assoc         : 4
D line length   : 32
D sets          : 128

Hardware        : Hi3511v100
Revision        : 0000
Serial          : 0000000000000000
~ $
目标机器昂已经存在uClibc的相关动态dll文件
/ $ ls /lib
ld-uClibc-0.9.28.so     libm-0.9.28.so          librt.so.0
ld-uClibc.so.0          libm.so.0               libthread_db-0.9.28.so
libc.so.0               libnsl-0.9.28.so        libthread_db.so.1
libcrypt-0.9.28.so      libnsl.so.0             libuClibc-0.9.28.so
libcrypt.so.0           libpthread-0.9.28.so    libutil-0.9.28.so
libdl-0.9.28.so         libpthread.so.0         libutil.so.0
libdl.so.0              libresolv-0.9.28.so     modules
libgcc_s.so             libresolv.so.0
libgcc_s.so.1           librt-0.9.28.so

测试程序
lake:~/mysrc$ cat hello.c
#include <stdio.h>

int main()
{
 printf("hello  /n");
 return 1;
}

lake:~/mysrc$ cat hello.cpp

#include <iostream>
    int main()
    {
        std::cout << "Hello, world!/n" << std::endl;
    }
lake:~/mysrc$ ~/arm-uclibc-linux/uclibc-tools/bin/arm-uclibc-linux-gcc -v
Reading specs from /home/lake/arm-uclibc-linux/uclibc-tools/lib/gcc/arm-uclibc-linux/3.4.6/specs
Configured with: ../gcc-3.4.6/configure --target=arm-uclibc-linux --prefix=/home/lake/arm-uclibc-linux/uclibc-tools --with-local-prefix=/home/lake/arm-uclibc-linux/uclibc-tools/arm-uclibc-linux --enable-multilib --disable-nls --enable-threads=posix --enable-symvers=gnu --disable-__cxa_atexit --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long --with-headers=/home/lake/arm-uclibc-linux/uclibc-tools/arm-uclibc-linux/include --with-libs=/home/lake/arm-uclibc-linux/uclibc-tools/arm-uclibc-linux/lib
Thread model: posix
gcc version 3.4.6

在host机器上编译
lake:~/mysrc$ arm-uclibc-linux-gcc  hello.c -o hello
lake:~/mysrc$ arm-uclibc-linux-g++  hello.cpp -o hellocpp

在目标机器上运行, /mnt/lake/sysrc为在目标机器上挂接的NFS目录
/mnt/lake/mysrc $ /mnt/lake/mysrc/hello
hello
/mnt/lake/mysrc $ ./hellocpp
./hellocpp: can't load library 'libstdc++.so.6'
由于目标板上/lib中没有C++需要的动态链接库,因此设定LD_LIBRARY_PATH使其指向NFS挂接的host机器上的libstdc++.so所在目录
/mnt/lake/mysrc $ echo   $LD_LIBRARY_PATH
/usr/local/lib:/usr/lib

/mnt/lake/mysrc $ export LD_LIBRARY_PATH=/mnt/lake/arm-uclibc-linux/uclibc-tools/arm-uclibc-linux/lib:$LD_LIBRARY_PATH
/mnt/lake/mysrc $ echo   $LD_LIBRARY_PATH
/mnt/lake/arm-uclibc-linux/uclibc-tools/arm-uclibc-linux/lib:/usr/local/lib:/usr/lib
/mnt/lake/mysrc $ ./hellocpp 
Hello, world!

执行成功

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Linux系统移植到ARM架构上需要按照以下步骤进行操作: 1.了解ARM架构和目标平台:首先需要了解目标平台的硬件架构和规格,包括处理器的型号、内存大小等。同时,需要熟悉ARM架构,包括特殊的寄存器、指令集等。 2.准备交叉编译工具链:由于ARM和x86等不同架构的指令集不兼容,所以需要使用交叉编译工具链,将针对ARM架构编译生成的可执行文件在x86架构的机器上进行编译。可以选择使用已有的交叉编译工具链,或者自行构建。 3.配置内核和设备树:下载Linux内核源码,然后根据目标平台的硬件规格和内核配置需求,进行相应的配置。同时,需要编写设备树描述文件,描述硬件设备的布局和特性,以供内核在启动阶段使用。 4.交叉编译内核和驱动程序:使用之前准备好的交叉编译工具链,编译内核源码和相关的驱动程序,生成适用于ARM架构的可执行文件。同时,也需要针对目标平台的特殊驱动程序进行移植和编译。 5.制作启动镜像:将编译得到的内核、文件系统镜像和设备树等文件整合到一个启动镜像中,以便在目标平台上进行引导和运行。可以使用工具如U-Boot进行生成和引导。 6.调试和测试:将制作好的启动镜像烧录到目标平台上,然后通过串口等方式进行调试和测试,确保系统能够正常启动和运行。如果有问题,需要进行排除和修复。 总结:将Linux移植到ARM架构上需要了解硬件和架构,准备交叉编译工具链,配置内核和设备树,编译内核和驱动程序,制作启动镜像,以及进行调试和测试。这些步骤需要耐心和细致的操作,但一旦成功,就可以在ARM平台上运行Linux系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值