在ubuntu下动手编译arm-elf工具

    技术2022-05-11  91

    前言: 为什么一定要建立arm-elf工具呢?其实必要性不是很大,3.x的版本网上有下载,而且现在的arm-linux工具也可以生成裸机代码,从前arm -elf和arm-linux的差别现在已经不是非常重要了。前一阵子在网上看见一个哥们在写操作系统,想参与一下,把我的业余时间填满。这是他的论坛, 有兴趣的可以看一下,目前人气还不是旺,顺便帮忙宣传了。他已经开始了一阵子,他在windows下开发,编译工具用的是arm-elf-4.1.1。 为了更少的更改,我只能选择和他一样的编译器,但是gnuarm网站上竟然只提供cygwin x86和linux x86-64的版本,完全忽视我们linux x86-32的广大用户,至今没搞懂为什么。只好自己编译了…… 准备工作: 下载源文件: gcc-4.1.1.tar.bz2 gdb-6.6.tar.bz2 newlib-1.14.0.tar.gz binutils-2.17.tar.bz2 newlib是redhat社区的一个针对嵌入式系统的开源库文件,gdb你也可以选择insight,差别就是后者是基于图形界面的。这些东西在gnuarm网站有下载,当然在gnu网站上会得到最新的版本。本文只探讨使用上述版本的程序编译。 确认系统环境: 请确定你的系统安装了完整的开发包:gcc, gdb等等,ubuntu系统默认是没有安装的,可以用下面的命令安装: 代码:sudo apt-get install build-essential 最好保证你的系统中的gcc版本和要编译的源程序版本相同,否则容易出现问题;可以用下面的命令查询版本: 代码:gcc -v 解压文件: 现建立工作目录,我的目录建在/home/volans/gcc4,以后把这个目录称为“工作目录”。然后把下载的四个压缩文件拷贝到这个目录下,运行解压缩命令。 代码:   tar zxvf newlib-1.14.0.tar.gz   tar jxvf gcc-4.1.1.tar.bz2   tar jxvf binutils-2.17.tar.bz2   tar jxvf gdb-6.6.tar.bz2 正式编译开始: 我比较笨,记不住那一串串的配置命令,也没大块的时间在电脑面前等,所以我写了一个自动配置编译的脚本文件,把这个脚本拷贝到工作目录下运行就可以了。在此我把脚本文件详细介绍一下,其实也就是手动编译的整个过程了。 代码: #这个是安装的目标路径,编译的结果放在这里 TARGET_PWD="/usr/local/arm/gnuarm4.1.1" #定义各个源文件的目录 GCC_SOURCE="/home/volans/gcc4/gcc-4.1.1" BINUTILS_SOURCE="/home/volans/gcc4/binutils-2.17" LIB_SOURCE="/home/volans/gcc4/newlib-1.14.0" GDB_SOURCE="/home/volans/gcc4/gdb-6.6" 代码: #编译的参数 BINUTILS_CONFIG="--target=arm-elf --prefix=$TARGET_PWD --enable-interwork --enable-multilib --with-float=soft" GCC_CONFIG="--target=arm-elf --prefix=$TARGET_PWD --enable-interwork --enable-multilib --enable-languages=c,c++ --with-newlib --with-headers=$LIB_SOURCE/newlib/libc/include --with-float=soft" LIB_CONFIG=$BINUTILS_CONFIG GDB_CONFIG=$BINUTILS_CONFIG 代码: #把目标路径的bin放入PATH,要用arm-elf工具编译newlib。 export PATH="$PATH:$TARGET_PWD/bin" 代码: #编译binutils cd $BINUTILS_SOURCE ./configure $BINUTILS_CONFIG make all install 代码: #初步编译gcc,为了可以编译newlib cd $GCC_SOURCE ./configure $GCC_CONFIG make all-gcc install-gcc 代码: #编译newlib cd $LIB_SOURCE ./configure $LIB_CONFIG make all install 代码: #完全编译gcc cd $GCC_SOURCE make all install 代码: #编译gdb cd $GDB_SOURCE ./configure $GDB_CONFIG make all install 到此为止,arm-elf就成功建立起来了,编辑/etc/bash.bashrc,加入如下代码,就可以一劳永逸的改变PATH环境变量。 代码: if [ -d /usr/local/arm/gnuarm4.1.1 ]; then         PATH=/usr/local/arm/gnuarm4.1.1/bin:"${PATH}" fi 现在就验证一下自己的成果吧: 代码: //写个小程序,main.c #include <stdio.h> int main() {     printf("Hello world!/n");     return 0; } 编译一下,生成a.out 代码: arm-elf-gcc -I/usr/local/arm/gnuarm4.1.1/arm-elf/include -L/usr/local/arm/gnuarm4.1.1/lib/gcc/arm-elf/4.1.1/ main.c -L/usr/local/arm/gnuarm4.1.1/lib/gcc/arm-elf/4.1.1/ 用arm模拟器运行一下,是不是有输出呢? 代码: arm-elf-run a.out 可以查一下a.out的头信息。 代码: arm-elf-readelf -h  a.out 输出如下: 代码:   ELF 头:   Magic:  7f 45 4c 46 01 01 01 61 00 00 00 00 00 00 00 00   Class:                             ELF32   Data:                              2's complement, little endian   Version:                           1 (current)   OS/ABI:                            ARM   ABI Version:                       0   Type:                              EXEC (可执行文件)   Machine:                           ARM   Version:                           0x1   入口点地址:              0x8100   程序头起点:              52 (bytes into file)   Start of section headers:          48636 (bytes into file)   标志:             0x202, has entry point, GNU EABI, software FP   本头的大小:       52 (字节)   程序头大小:       32 (字节)   程序头数量:       1   节头大小:         40 (字节)   节头数量:         13   字符串表索引节头: 12 到此结束啦,轮到你去折磨arm-elf了,加油吧! 脚本文件链接:http://files.myopera.com/volans/blog/arm-gcc-automatic.sh上一次由volans于2007-1-08 周一, 上午11:56修改,总共修改了2次 返回顶端   <script type="text/javascript" language="JavaScript"> </script>   volans2楼性别: 加入时间: 2006/11/15文章: 34专家分: 1101
    时间: 2007-1-07 周日, 下午8:45    标题:
    脚本的全部内容。 代码: #!/bin/bash # Brif: This is the scrip for build arm-elf tools. # Source file: binutils-2.17.tar.bz2,gcc-4.1.1.tar.bz2,gdb-6.6.tar.bz2,newlib-1.14.0.tar.gz # # Notes: Please run this script with the root account or you can run "sudo bash" #           Express all the compressed file to WORK_PWD below # # Author: Volans Wang #         volansw@gmail.com # #source directory and target director WORK_PWD=$(pwd) echo $WORK_PWD TARGET_PWD="/usr/local/arm/gnuarm4.1.1" GCC_SOURCE="/home/volans/gcc4/gcc-4.1.1" BINUTILS_SOURCE="/home/volans/gcc4/binutils-2.17" LIB_SOURCE="/home/volans/gcc4/newlib-1.14.0" GDB_SOURCE="/home/volans/gcc4/gdb-6.6" #make configure BINUTILS_CONFIG="--target=arm-elf --prefix=$TARGET_PWD --enable-interwork --enable-multilib --with-float=soft" GCC_CONFIG="--target=arm-elf --prefix=$TARGET_PWD --enable-interwork --enable-multilib --enable-languages=c,c++ --with-newlib --with-headers=$LIB_SOURCE/newlib/libc/include --with-float=soft" LIB_CONFIG=$BINUTILS_CONFIG GDB_CONFIG=$BINUTILS_CONFIG #export the cross compiler to the PATH export PATH="$PATH:$TARGET_PWD/bin" #make target dir for install if possible if [ -d $TARGET_PWD ]; then    rm -rf $TARGET_PWD    mkdir $TARGET_PWD else    mkdir $TARGET_PWD fi ######## make binutils ######################### cd $BINUTILS_SOURCE #configure ./configure $BINUTILS_CONFIG #make make all install ################################################# ######### make gcc for build new lib ############ cd $GCC_SOURCE #configure ./configure $GCC_CONFIG #make make all-gcc install-gcc ################################################# ########## make new lib ######################### cd $LIB_SOURCE #configure ./configure $LIB_CONFIG #make make all install ################################################# ######## make all gcc ########################### cd $GCC_SOURCE make all install ################################################# ######### make gdb ############################## cd $GDB_SOURCE #configure ./configure $GDB_CONFIG make all install #################################################

    最新回复(0)