新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 在ubuntu8.10 下建立 ARM-Linux 交叉編譯環境

        在ubuntu8.10 下建立 ARM-Linux 交叉編譯環境

        作者: 時間:2016-11-09 來源:網絡 收藏
        很久都沒有寫文章了 ,經過了將近半年的奔波,終于可以寫點東西了!在廣州工作時 ,同事極力推薦我用ubuntu,使用之后的確很爽,并決定以后在ubuntu下工作,完全可以拋棄windows(暈到死)。決定開始 移植Linux到mini2440。首先就是在ubuntu下建立交叉編譯工具鏈。借著在Fedora 下建立ARM-Linux的交叉編譯工具的經驗,按理說應該是不會有問題的,但是結果是比在Fedora下碰到的問題多得多了。以下先介紹成功編譯的過 程,碰到的問題和解決辦法后面說。
        這次編譯過程中對我有重大幫助的資料有:
        《 編譯Mysql時configure: error: No curses/termcap library found 的錯誤解決方法》
        《[原創]在ubuntu下動手編譯arm-elf工具》

        《在ubuntu下使用crosstool制作交叉編譯工具》
        《 ubuntu 8.04中編譯ARM交叉平臺的一點心得!》


        關于crosstool的基本知識在我以前的
        《在 Fedora 下建立 ARM-Linux 交叉編譯環境
        中已有介紹,這里我再多說,以下是具體過程:
        (1)保證你的ubuntu8.10下安裝了以下軟件開發工具。
        Bison
        flex
        build-essential
        patch
        libncurses5-dev
        我并沒有試過沒裝這些工具的后果,都是網上的經驗,你要是不信這個邪,就自己吃吃這個螃蟹。
        (2)因為ubuntu8.10自帶的是gcc-4.3.2無法用crosstool正常編譯交叉編譯器,所以必須安裝gcc-4.1,但是不必卸載4.3.2。方法是用新立得軟件包管理器安裝gcc-4.1,之后 參考
        chinazcw
        的方法
        sudo rm /usr/bin/gcc (刪除GCC,它只是個到gcc-4.3.2的軟連接文件)
        sudo ln-s /usr/bin/gcc-4.1 /usr/bin/gcc (建立GCC到gcc-4.1的軟連接)

        (3)如果你運行
        ls -la /bin/sh
        命令看到/bin/sh其實是一個指向dash的軟鏈接,則請運行以下命令,將/bin/sh鏈接到bash。
        sudo mv /bin/sh /bin/sh.old
        sudo ln -sf bash /bin/sh
        (4)按照老方法修改crosstool的文件:demo-arm9tdmi.sh、gcc-4.1.1-glibc-2.3.2.dat,最后運行demo-arm9tdmi.sh。這些過程請參考我以前的文檔
        《在 Fedora 下建立 ARM-Linux 交叉編譯環境》

        過程就這么簡單,但是有些是用失敗換來的。下面介紹下我的編譯血淚史:
        一開始,我并不想用gcc-4.1而是想用自帶的gcc-4.3.2,然后......................

        (1)編譯到glibc的時候,在配置的時候會檢測gcc的版本,configure 腳本認為gcc-4.3.2版本太老(其實是因為當時gcc還沒有這么高的版本,只要不是3.2到4.1之間的版本,都認為too old),不能編譯。
        這是可以解決的,方法就是修改glibc-2.3.2根目錄下的configure 文件中的第1275行:
        test -n "$CC" && break
        done
        if test -z "$CC"; then
        ac_verc_fail=yes
        else
        # Found it, now check the version.
        echo "$as_me:$LINENO: checking version of $CC" >&5
        echo $ECHO_N "checking version of $CC... $ECHO_C" >&6
        ac_prog_version=`$CC -v 2>&1 | sed -n s/^.*version /([egcygnustpi-]*[0-9.]*/).*$//1/p`
        case $ac_prog_version in
        ) ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
        3.[2-9]*|4.[0-3]*)
        ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
        *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
        這樣就可以騙過configure ,繼續編譯下去。
        但是修改的時機要把握好,要在 demo-arm9tdmi.sh解壓完glibc-2.3.2后,運行其configure之前。我直接就將configure拷出來,修改后在crosstool解壓完所有文件后直接覆蓋源文件。
        其實這種方法我在fedora9下使用crosstool時就用過,但是當時發現f9真是做得比f8差,歷史的倒退,所以就到回去用f8了,就沒寫文章總結。

        (2)編譯gcc-3.3.6的時候,出現以下錯誤:
        /usr/include/bits/fcntl2.h:51: error: call to __open_missing_mode declared with attribute error: open with O_CREAT in second argument needs 3 arguments
        這純屬軟件bug,因為使用open函數的時候,如果在第二個參數中使用了 O_CREAT,就必須添加第三個參數:創建文件時賦予的初始權限。而在gcc-3.3.6/gcc/的collect2.c文件中有漏掉第三個參數的錯 誤,而gcc-4.3對語法錯誤的檢查嚴格是出了名的(4.1就不會因此錯誤退出),所以就退出了。
        這也是可以解決的,就是在gcc-3.3.6/gcc/collect2.c中的第1575行改為:
        redir_handle = open (redir, O_WRONLY | O_TRUNC | O_CREAT,0777);
        我還發現glibc-2.3.2/login/tst-grantpt.c也有一個類似錯誤,一起改過來,除后患。第44行:
        fd = open (file, O_RDWR | O_CREAT,0777);
        修改的時機也要把握好,我是在crosstool解壓完所有文件后和之前configure 文件一起直接覆蓋源文件。
        (3)經歷了以上的痛苦后,繼續編譯,會出現以下錯誤:
        * buffer overflow detected *: arm-9tdmi-linux-gnu-ar terminated
        fuck!!!!!!!!編譯出來的 arm-9tdmi-linux-gnu-ar根本沒法用!被耍了!放棄gcc-4.3.2!!!!!
        要是哪位仁兄解決了以上問題,并編譯成功,一定要通知小弟啊!
        (4)安裝了gcc-4.1之后,重新編譯。心想這回好了吧?!不想,有出了以下錯誤:
        Infileincluded from version.c:33:
        /home/tekkaman/working/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-4.1.1-glibc-2.3.2/build-glibc/csu/version-info.h:2:1: missing terminating "character
        /home/tekkaman/working/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-4.1.1-glibc-2.3.2/build-glibc/csu/version-info.h:3:1: missing terminating" character
        google后發現,原來是ubuntu將系統默認的shell設置成了dash (the Debian Almquist Shell),所以通過腳本生成的文件格式和bash的不一樣,導致了編譯錯誤。在使用了
        ursa
        的方法后問題解決。
        sudo mv /bin/sh /bin/sh.old
        sudo ln -sf bash /bin/sh
        (5)繼續重新編譯,在gcc做好后(此時gcc已可用,只是gdb還沒編譯好),編譯gdb的時候出了以下錯誤:
        configure: error: no termcap library found
        很顯然,是因為沒裝一個庫文件造成的,google后發現正解:用新立得安裝libncurses5-dev(或是apt-get install libncurses5-dev)即可。

        最后,編譯成功,看到了盼望已久的“done”。


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 萍乡市| 枣庄市| 宁安市| 黑山县| 乌拉特前旗| 梅河口市| 朝阳市| 东丽区| 岫岩| 蒲城县| 福泉市| 呼玛县| 黔东| 竹山县| 彩票| 昆山市| 府谷县| 北票市| 郸城县| 自治县| 池州市| 老河口市| 合作市| 陵川县| 太仆寺旗| 扶绥县| 兴海县| 和硕县| 南投县| 曲靖市| 正宁县| 扶绥县| 祥云县| 彝良县| 天水市| 望谟县| 曲阜市| 固阳县| 昌宁县| 东乌珠穆沁旗| 莱西市|