<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 在ubuntu8.10 下建立 ARM-Linux 交叉編譯環(huán)境

          在ubuntu8.10 下建立 ARM-Linux 交叉編譯環(huán)境

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

          《在ubuntu下使用crosstool制作交叉編譯工具》
          《 ubuntu 8.04中編譯ARM交叉平臺(tái)的一點(diǎn)心得!》


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

          (3)如果你運(yùn)行
          ls -la /bin/sh
          命令看到/bin/sh其實(shí)是一個(gè)指向dash的軟鏈接,則請(qǐng)運(yùn)行以下命令,將/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,最后運(yùn)行demo-arm9tdmi.sh。這些過(guò)程請(qǐng)參考我以前的文檔
          《在 Fedora 下建立 ARM-Linux 交叉編譯環(huán)境》

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

          (1)編譯到glibc的時(shí)候,在配置的時(shí)候會(huì)檢測(cè)gcc的版本,configure 腳本認(rèn)為gcc-4.3.2版本太老(其實(shí)是因?yàn)楫?dāng)時(shí)gcc還沒有這么高的版本,只要不是3.2到4.1之間的版本,都認(rèn)為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;;
          這樣就可以騙過(guò)configure ,繼續(xù)編譯下去。
          但是修改的時(shí)機(jī)要把握好,要在 demo-arm9tdmi.sh解壓完glibc-2.3.2后,運(yùn)行其configure之前。我直接就將configure拷出來(lái),修改后在crosstool解壓完所有文件后直接覆蓋源文件。
          其實(shí)這種方法我在fedora9下使用crosstool時(shí)就用過(guò),但是當(dāng)時(shí)發(fā)現(xiàn)f9真是做得比f(wàn)8差,歷史的倒退,所以就到回去用f8了,就沒寫文章總結(jié)。

          (2)編譯gcc-3.3.6的時(shí)候,出現(xiàn)以下錯(cuò)誤:
          /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,因?yàn)槭褂胦pen函數(shù)的時(shí)候,如果在第二個(gè)參數(shù)中使用了 O_CREAT,就必須添加第三個(gè)參數(shù):創(chuàng)建文件時(shí)賦予的初始權(quán)限。而在gcc-3.3.6/gcc/的collect2.c文件中有漏掉第三個(gè)參數(shù)的錯(cuò) 誤,而gcc-4.3對(duì)語(yǔ)法錯(cuò)誤的檢查嚴(yán)格是出了名的(4.1就不會(huì)因此錯(cuò)誤退出),所以就退出了。
          這也是可以解決的,就是在gcc-3.3.6/gcc/collect2.c中的第1575行改為:
          redir_handle = open (redir, O_WRONLY | O_TRUNC | O_CREAT,0777);
          我還發(fā)現(xiàn)glibc-2.3.2/login/tst-grantpt.c也有一個(gè)類似錯(cuò)誤,一起改過(guò)來(lái),除后患。第44行:
          fd = open (file, O_RDWR | O_CREAT,0777);
          修改的時(shí)機(jī)也要把握好,我是在crosstool解壓完所有文件后和之前configure 文件一起直接覆蓋源文件。
          (3)經(jīng)歷了以上的痛苦后,繼續(xù)編譯,會(huì)出現(xiàn)以下錯(cuò)誤:
          * buffer overflow detected *: arm-9tdmi-linux-gnu-ar terminated
          fuck!?。。。。。?!編譯出來(lái)的 arm-9tdmi-linux-gnu-ar根本沒法用!被耍了!放棄gcc-4.3.2!!!!!
          要是哪位仁兄解決了以上問題,并編譯成功,一定要通知小弟啊!
          (4)安裝了gcc-4.1之后,重新編譯。心想這回好了吧?!不想,有出了以下錯(cuò)誤:
          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后發(fā)現(xiàn),原來(lái)是ubuntu將系統(tǒng)默認(rèn)的shell設(shè)置成了dash (the Debian Almquist Shell),所以通過(guò)腳本生成的文件格式和bash的不一樣,導(dǎo)致了編譯錯(cuò)誤。在使用了
          ursa
          的方法后問題解決。
          sudo mv /bin/sh /bin/sh.old
          sudo ln -sf bash /bin/sh
          (5)繼續(xù)重新編譯,在gcc做好后(此時(shí)gcc已可用,只是gdb還沒編譯好),編譯gdb的時(shí)候出了以下錯(cuò)誤:
          configure: error: no termcap library found
          很顯然,是因?yàn)闆]裝一個(gè)庫(kù)文件造成的,google后發(fā)現(xiàn)正解:用新立得安裝libncurses5-dev(或是apt-get install libncurses5-dev)即可。

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


          評(píng)論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();