新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > arm交叉編譯環(huán)境搭建

        arm交叉編譯環(huán)境搭建

        作者: 時間:2016-11-21 來源:網(wǎng)絡(luò) 收藏
        arm交叉編譯環(huán)境搭建
        今天搭建了一個基于arm的嵌入式開發(fā)環(huán)境,特記錄搭建過程及其中遇到的問題。

        一:準備
        1、使用的軟件版本
        kernel:(http://www.kernel.org/pub/linux/kernel/v2.4/)
        linux-2.4.21.tar.gz
        (patch下載地址:ftp://ftp.arm.linux.org.uk/pub/linux/arm/kernel/v2.4/)
        patch-2.4.21-rmk1.gz

        binutils:(ftp://ftp.gnu.org/gnu/binutils)
        binutils-2.14.tar.gz

        gcc:(ftp://ftp.gnu.org/gnu/gcc)
        gcc-core-2.95.3.tar.gz
        gcc-g++-2.95.3.tar.gz
        (patch下載地址:http://www.linuxfromscratch.org/patches/downloads/gcc/)
        gcc-2.95.3-2.patch
        gcc-2.95.3-no_fixinc-1.patch
        gcc-2.95.3-returntype_fix-1.patch

        glibc:(ftp://ftp.gnu.org/gnu/glibc)
        glibc-2.2.4.tar.gz
        glibc-linuxthreads-2.2.4.tar.gz

        gdb:(ftp://ftp.gnu.org/gnu/gdb)
        gdb-6.0.tar.bz2

        二:建立工作目錄
        #cd /
        #mkdir crosstool
        #mkdir linux-2.4.21 binutils gcc glibc gdb

        把下載的源代碼的壓縮文件放入對應(yīng)的文件夾:
        /crosstool/linux-2.4.21:linux-2.4.21.tar.gz、patch-2.4.21-rmk1.gz
        /crosstool/binutils: binutils-2.14.tar.gz
        /crosstool/gcc: gcc-core-2.95.3.tar.gz、gcc-g++-2.95.3.tar.gz、gcc-2.95.3-2.patch、gcc-2.95.3-no_fixinc-1.patch、gcc-2.95.3-returntype_fix-1.patch
        /crosstool/glibc: glibc-2.2.4.tar.gz 、glibc-linuxthreads-2.2.4
        /crosstool/gdb: gdb-6.0.tar.bz2

        三:建立二進制工具
        #cd /crosstool/binutils
        #tar -xvzf binutils-2.14.tar.gz
        #cd binutils-2.14
        #mkdir build-arm-linux
        #../binutils-2.14/configure --target=arm-linux --prefix=/usr/local/arm/2.95.3
        #make
        #make install
        --target 選項是指出交叉工具的體系結(jié)構(gòu),所有運行在主機上的交叉工具都要
        配置這個選項。
        --prefix 選項是指定路徑前綴,編譯完成之后,將安裝到這個目錄下。

        要使用這些工具,我們必須在 linux 的啟動腳本中添加如下環(huán)境變量:
        #vi /etc/profile
        在 profile 文件中添加如下 PATH 環(huán)境變量:
        pathmunge /usr/local/arm/2.95.3/bin
        保存。
        使用source /etc/profile使修改生效。

        四:建立gcc編譯器(初始編譯器)
        #cd /crosstool/gcc
        #tar -xvzf gcc-core-2.95.3.tar.gz
        #tar –xvzf gcc-g++-2.95.3.tar.gz
        #cd gcc-2.95.3
        #patch -p1< ../gcc-2.95.3-2.patch
        #patch -p1< ../gcc-2.95.3-no_fixinc-1.patch
        #patch -p1< ../gcc-2.95.3-returntype_fix-1.patch

        配置 t-linux 文件。因為我們現(xiàn)在還沒有 glibc 庫的支持,所以需要簡單配置一些簡單的選項。對于arm-linux 工具可以通過修改
        /crosstool/gcc/gcc-2.95.3/gcc/config/arm/t-linux 配置文件。
        編輯 t-linux 文件,在文件末尾加入如下 2 行:
        #vim /crosstool/gcc/gcc-2.95.3/gcc/config/arm/t-linux
        TARGET_LIBGCC2-CFLAGS += -Dinhibit_libc -D__gthr_posix_h
        T_CFLAGS = -Dinhibit_libc -D__gthr_posix_h
        -Dinhibit_libc 的意思是禁止使用 libc,因為現(xiàn)在還沒有編譯出 glibc 庫。

        #mkdir build-arm-linux
        #cd build-arm-linux
        #../configure --target=arm-linux --prefix=/usr/local/arm/2.95.3 --with-headers=/crosstool/linux-2.4.21/linux-2.4.21/include --disable-shared –disable-threads –enable-languages="c"

        該編譯命令中:
        --target 指定交叉編譯工具的目標體系結(jié)構(gòu)是 arm-linux
        --prefix 指定安裝路徑為/usr/local/arm/2.95.3
        --with-headers 指定內(nèi)核頭文件所在的路徑為:/crosstool/linux-2.4.21/linux-2.4.21/include
        --disable-shared 選項指定不使用共享庫,這樣就不依賴 glibc 了
        --disable-threads 選項指定不使用線程,也就不使用線程庫了。
        --enable-languages 指定僅支持 c 語言

        #make
        在make的時候出現(xiàn)錯誤,在/crosstool/gcc/gcc-2.95.3/gcc/config/arm目錄下的arm.c文件中,“arm_prog_mode = TARGET_APCS_32 ? PROG_MODE_PROG32 : PROG_MODE_PROG26;”句報錯。可以將其注銷。可以正常編譯。
        #make install

        五:生成glibc庫
        #cd /crosstool/glibc
        #tar -xvzf glibc-2.2.4.tar.gz
        #cd glibc-2.2.4
        #tar -xzvf ../glibc-linuxthreads-2.2.4.tar.gz
        #mkdir build-arm-linux
        #cd build-arm-linux
        #CC=arm-linux-gcc AS=arm-linux-as LD=arm-linux-ld ../configure --host=arm-linux --with-headers=/crosstool/linux-2.4.21/linux-2.4.21/include/ --enable-add-ons=linuxthreads –enable-shared --prefix=/usr/local/arm/2.95.3/arm-linux

        CC=arm-linux-gcc 是把 CC 變量設(shè)成你剛編譯生成的 arm-linux-gcc,用它來編譯你的glibc。
        --host 指定目標板的體系結(jié)構(gòu)
        --with-headers 指定內(nèi)核頭文件的路徑為/crosstool/linux-2.4.21/linux-2.4.21/include
        --enable-add-ons=linuxthreads 支持線程庫。
        --enable-shared 選項支持共享庫
        --prefix 指定工具鏈目標板相關(guān)文件的目錄

        #make
        #make install

        此時在/usr/local/arm/2.95.3/arm-linux 目錄下的 lib 等目錄中,安裝了 glibc共享庫等文件。然后修改/usr/local/arm/2.95.3/arm-linux/lib/目錄下的libc.so文件:

        #vim /usr/local/arm/2.95.3/arm-linux/lib/libc.so

        將“GROUP ( /usr/local/arm/2.95.3/arm-linux//lib/libc.so.6 /usr/local/arm/2.95.3/arm-linux//lib/libc_nonshared.a )”
        修改為
        “GROUP ( libc.so.6 libc_nonshared.a )”
        這樣連接程序 ld 就會在 libc.so 所在的目錄查找它需要的庫,因為你的機子的/lib 目錄可能已經(jīng)裝了一個相同名字的庫,一個為編譯可以在你的宿主機上運行的程序的庫,而不是用于交叉編譯的。

        如果不這樣修改,會在后面第六步建立g++編譯器的時候報錯。(/crosstool/gcc/gcc-2.95.3/build-arm-linux/arm-linux/libiberty目錄下找不到Makefile文件。)
        出現(xiàn)編譯錯誤問題。

        六:建立全套編譯器(gcc和g++)
        #cd /crosstool/gcc/gcc-2.95.3

        首先,將我們添加的2行-Dinhibit_libc去掉,因為此時不需要禁止使用libc了,我們在第 5 步中已經(jīng)生成了libc。
        #vim gcc/cpmfog/arm/t-linux

        然后,進入 build-arm-linux 清除臨時目錄及臨時文件。
        #cd build-arm-linux
        #make distclean
        #rm –rf ./*

        #../configure –target=arm-linux --prefix=/usr/loacal/arm/2.95.3 --with-headers=/crosstool/linux-2.4.21/linux2.4.21/include --enable-threads=pthreads --enable-shared --enable-static --enable-languages="c,c++"
        #make
        #make install

        最后在/usr/loacal/arm/2.95.3/bin目錄多了arm-linux-g++ 、arm-linux-protoize 和 arm-linux-c++幾個文件

        七:驗證交叉編譯工具
        #cd /crosstool/
        #mkdir test
        #cd test
        #vim helloworld.c

        #include

        int main(void)
        {
        printf("Hello World!n");
        return 0;
        }

        #arm-linux-gcc helloworld.c -o helloworld
        #file helloworld
        helloworld: ELF 32-bit LSB executable, ARM, version 1, dynamically linked (uses shared libs), for GNU/Linux 2.0.0, not stripped
        表示編譯了一個能在 arm 體系結(jié)構(gòu)下運行的helloworld程序,說明編譯工具做成功了。



        八:其它制作交叉編譯環(huán)境的方法
        1、使用的工具
        crosstool-0.43.tar.gz
        Download URL:http://kegel.com/crosstool/crosstool-0.43.tar.gz

        2、需要下載的源代碼(以制作arm-linux gcc-4.1.1為例子)
        binutils-2.16.1.tar.bz2
        Download URL:http://ftp.gnu.org/gnu/binutils/

        glibc-2.3.2.tar.bz2
        Download URL:http://ftp.gnu.org/gnu/glibc/

        glibc-linuxthreads-2.3.6.tar.bz2
        Download URL:http://ftp.gnu.org/gnu/glibc/

        linux-2.6.25.tar.bz2
        Download URL:http://ftp.kernel.org/pub/linux/kernel/v2.6/

        gdb-6.5.tar.bz2
        Download URL:http://ftp.gnu.org/gnu/gdb/

        gcc-4.1.1.tar.bz2
        Download URL:http://ftp.gnu.org/gnu/gcc/gcc-4.1.1/

        gcc-3.3.6.tar.bz2
        Download URL:http://ftp.gnu.org/gnu/gcc/gcc-3.3.6/

        linux-libc-headers-2.6.12.0.tar.bz2
        glibc-linuxthreads-2.3.2.tar.bz2

        3、注意事項
        您可以事先下載相關(guān)源代碼到本地機器,也可以不用下載,因為在編譯的時候,會自動下載相關(guān)的文件到本地文件夾。但是,那樣的話,編譯速度會很慢的。所以,這里推薦事先將這些源代碼給下載下來。
        編譯需要在非root用戶下才可以進行。如果您是root用戶,請您切換到普通用戶模式。

        4、操作流程
        [test@localhost ~]$ echo $HOME
        /home/test
        [test@localhost ~]$ pwd
        /home/test
        [test@localhost ~]$

        可見,當前用戶為test,當前所在目錄為/home/test。

        [test@localhost ~]$ mkdir download crosstool-4.1.1
        [test@localhost ~]$
        創(chuàng)建download 和 crosstool-4.1.1文件夾;然后將下載好的源代碼放置到download文件夾中。

        [test@localhost ~]$ tar -zxvf crosstool-0.43.tar.gz
        [test@localhost ~]$ cd crosstool-0.43
        [test@localhost crosstool-0.43]$
        解壓crosstool-0.43,然后進入crosstool-0.43目錄。

        [test@localhost crosstool-0.43]$ vim demo-arm.sh
        *********************************************

        #!/bin/sh
        # This script has one line for each known working toolchain
        # for this architecture. Uncomment the one you want.
        # Generated by generate-demo.pl from buildlogs/all.dats.txt

        set -ex
        #TARBALLS_DIR=$HOME/downloads
        TARBALLS_DIR=/home/test/downloads
        #RESULT_TOP=/opt/crosstool
        RESULT_TOP=/home/test/crosstool-4.1.1
        export TARBALLS_DIR RESULT_TOP
        GCC_LANGUAGES="c,c++"
        export GCC_LANGUAGES

        ............

        #eval `cat arm.dat gcc-4.1.0-glibc-2.3.2.dat` sh all.sh --notest
        #eval `cat arm.dat gcc-4.1.0-glibc-2.3.2-tls.dat` sh all.sh --notest
        eval `cat arm.dat gcc-4.1.1-glibc-2.3.2.dat` sh all.sh --notest

        echo Done.

        *********************************************
        修改TARBALLS_DIR和RESULT_TOP的值,同時添加語句“eval `cat arm.dat gcc-4.1.1-glibc-2.3.2.dat` sh all.sh --notest”。
        TARBALLS_DIR:是下載的工具源碼壓縮包的存放目錄。
        RESULT_TOP :是要生成的工具鏈的存放目錄,要有寫權(quán)限的目錄,不然無法編譯。

        [test@localhost crosstool-0.43]$ vim gcc-4.1.1-glibc-2.3.2.dat
        *********************************************

        BINUTILS_DIR=binutils-2.16.1
        GCC_CORE_DIR=gcc-3.3.6
        GCC_DIR=gcc-4.1.1
        GLIBC_DIR=glibc-2.3.2
        LINUX_DIR=linux-2.6.25
        LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
        GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2
        GDB_DIR=gdb-6.5

        *********************************************
        將“LINUX_DIR=LINUX_DIR=linux-2.6.15.4”修改為“LINUX_DIR=LINUX_DIR=linux-2.6.25”;

        [test@localhost crosstool-0.43]$ vim arm.dat
        *********************************************

        KERNELCONFIG=`pwd`/arm.config
        TARGET=arm-linux
        TARGET_CFLAGS="-O"

        *********************************************
        將“TARGET=arm-unknown-linux-gnu”修改為“TARGET=arm-linux”

        [test@localhost crosstool-0.43]$ ./demo-arm.sh
        執(zhí)行編譯操作。生成的工具鏈在如下的位置:/home/test/crosstool-4.1.1/gcc-4.1.1-glibc-2.3.2,也就是我們剛才建立的crosstool-4.1.1文件夾中。

        九:后記
        那些組合可以編譯成功,可以參考:http://kegel.com/crosstool/crosstool-0.43/buildlogs/表格


        關(guān)鍵詞: arm交叉編譯環(huán)境搭

        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 古丈县| 潜江市| 柳林县| 苏尼特右旗| 丰台区| 昌图县| 怀来县| 西贡区| 威海市| 宽城| 五华县| 剑阁县| 南雄市| 洛扎县| 青海省| 梁河县| 三门峡市| 广宁县| 潼关县| 贵州省| 浠水县| 无锡市| 武强县| 凯里市| 鄂托克前旗| 成安县| 连南| 永州市| 东光县| 镇安县| 当涂县| 淄博市| 新闻| 方城县| 普定县| 新民市| 治县。| 庆城县| 兰州市| 敦煌市| 澄江县|