青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

幽幽
 
posts - 51,  comments - 28,  trackbacks - 0
首先,制作交叉工具鏈的目的是為了給我的手機--MOTO ROKR E2編譯程序。
然后,順便學習一下嵌入式軟件的開發
先說一下,搞這個需要很大的耐心。
我用的硬件是Sempron3100+, 512MB內存, 編譯環境是windowsXP + vmware5.5 + gentoo,
在CUI下,花了大概20個小時才編譯完(我從晚上八點一直弄到第二天下午四點)。

1.
準備源碼:
 binuitls-2.17
 gcc-4.1.1
 glibc-2.5
 glibc-ports-2.5
 
以上都可以在gnu.orgftp上下載
 
默認glibc不支持其它處理器, glibc-ports是支持其它處理器架構的補丁
 
另外還有kernel,我使用最新的2.19.1(kernel用于提供編譯頭文件)

2.
準備補丁:
 
這個可以在cross-lfs.org上面根據它的指南下載,我使用了下面的補丁:
 Binutils Branch Update
 Binutils Posix Patch
 GCC Cross Search Paths Patch
 GCC PR20425 Patch
 GCC Posix Patch
 Glibc Branch Update
 Glibc Cross-Compiling Hacks Patch
 Glibc Disable linking with libgcc_eh.a
 Glibc Localedef Segfault

 
準備編譯環境,我直接使用的debian(sid)并且所有包都是最新狀態,另外需要安裝texinfo, gawk(注意mawk編譯glibc header時會有問題), bison, flex

4.
準備環境變量.我寫了一個pre.sh,所有相關內容都放里面
 set +h #
關閉bashhash功能,hash功能用來記憶系統中所有可執行文件來避免查找path. 編譯時可能會增加新的同名可執行程序在其它目錄下
 umask 022
 export CLFS_HOST="$(echo $MACHTYPE | sed "s/$(echo $MACHTYPE | cut -d- -f2)/cross/")"
 export CLFS_TARGET="arm-unknown-linux-gnu"
 export CLFS=/home/lizl/arm
 export LC_ALL=POSIX #
舊的libc2.2.4以下在LOCALE為其它時chroot回來可能會有異常
 export PATH=$CLFS/bin:$PATH

 # CFLAGS
CXXFLAGS對編譯時可能會有影響
 unset CFLAGS
 unset CXXFLAGS


5.
準備環境.執行source pre.sh后執行下面的操作:
 install -dv ${CLFS} #
創建目標目錄
 install -dv ${CLFS}/include
 install -dv ${CLFS}/usr/include

 
另外最好使用其它用戶身份去進行編譯的操作, 因為root可能會對系統造成破壞.建議創建一個clfs用戶和組專門操作(我是直接使用的root):
 groupadd clfs #
增加組
 useradd -s /bin/bash -g clfs -m -k /dev/null clfs #
創建用戶
 passwd clfs #
給用戶指定口令
 chown -Rv clfs ${CLFS} #
修改輸出目錄的權限
 CLFS
建議clfs帳號登錄時, 最好不要被系統中其它環境變量影響, 所以它在clfs帳號的~/.bash_profile里面寫入下面內容:
 exec env -i HOME=${HOME} TERM=${TERM} PS1='\u:\w\$ ' /bin/bash
 
因為我是root, 沒有修改.

 su - clfs #
切換到clfs用戶執行操作

 
開始創建一些目錄. 這里我沒有創建, 因為我只需要gcc, binutilsglibc這三個

6.
編譯binutils:
 
下載binutils-2.17并解壓.
 
下載補丁:
 
注意安裝gcc bison flex texinfo
 
不然編譯過程會出錯

 
我編譯時報的錯是 missing makeinfo
 
然后安裝了texinfo還是不行
 
后面檢查makefile才發現bison等都沒有安裝

 patch -Np1 -i ../patch/binutils-2.17-posix-1.patch
 patch -Np1 -i ../patch/binutils-2.17-branch_update-1.patch

 binutils
建議編譯時在其它目錄編譯,所以我們創建binutils-build并在里面執行操作
 mkdir -v ../binutils-build
 cd ../binutils-build

 
 
如果你在binutils-2.17執行操作的話,那后面的make configure-host時可能會報錯
 
我因為報錯然后重做了一下干凈的解壓目錄重執行

 
開始配置
 ../binutils-2.17/configure --prefix=${CLFS} \
  --host=${CLFS_HOST} --target=${CLFS_TARGET} --with-sysroot=${CLFS} \
  --disable-nls --enable-shared --disable-multilib

 
檢查看主機上的運行條件是不是符合
 make configure-host

 
編譯并安裝:
 make
 make install
 cp -v ../binutils-2.17/include/libiberty.h ${CLFS}/usr/include


7.
安裝內核頭文件:
 clfs
中是直接復制目錄, 我則是先make menuconfig然后修改一此事配置后才復制的

 clfs
中操作:
 install -dv ${CLFS}/usr/include
 cp -av include/{asm-generic,linux,mtd,scsi,sound} ${CLFS}/usr/include
 cp -av include/asm-arm ${CLFS}/usr/include/asm

 
我的操作:
 make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig

 
menuconfig里面load一個別人的2410的配置然后退出并保存
 cp -av include/{asm-generic,linux} ${CLFS}/usr/include
 cp -av include/asm-arm ${CLFS}/usr/include/asm

8.
安裝glibc的頭文件.
 
先把3.4的依賴去掉
 cd glibc-2.5
 cp configure{,.orig}
 sed -e 's/3.4/3.[0-9]/g' configure.orig > configure

 
然后解壓glibc-ports
 tar -jxvf ../glibc-ports-2.5.tar.bz2
 mv -v glibc-ports-2.5 ports

 
注意是解壓到當前目錄(glibc-2.5),不然執行后面的configure時會報cpu不支持
 
然后開始準備編譯目錄, 同上, 我們也在其它目錄下進行編譯
 mkdir -v ../glibc-build
 cd ../glibc-build

 
為打開NPTL支持進行如下操作:
 echo "libc_cv_forced_unwind=yes" > config.cache
 echo "libc_cv_c_cleanup=yes" >> config.cache
 echo "libc_cv_arm_tls=yes" >> config.cache

 
然后把安裝路徑指定一下:
 echo "install_root=${CLFS}" > configparms

 
再執行下面的編譯:
 CC=gcc ../glibc-2.5/configure --prefix=/usr --host=${CLFS_TARGET} --build=${CLFS_HOST} --with-headers=${CLFS}/usr/include --cache-file=config.cache
 make install-headers

 
由于awk語法兼容原因,如果安裝mawk的話上面的步驟會出錯, 安裝gawk則不會
 
有一些文件還沒有被自動復制過去, 需要手工復制:
 install -dv ${CLFS}/usr/include/bits
 cp -v bits/stdio_lim.h ${CLFS}/usr/include/bits
 touch ${CLFS}/usr/include/gnu/stubs.h
 cp -v ../glibc-2.5/ports/sysdeps/unix/sysv/linux/arm/nptl/bits/pthreadtypes.h \
 ${CLFS}/usr/include/bits

9.
安裝gcc第一次,這次是為了編譯交叉版本的glibcgcc,先打補丁
 patch -Np1 -i ../patch/gcc-4.1.1-posix-1.patch
 patch -Np1 -i ../patch/gcc-4.1.1-cross_search_paths-1.patch

 
然后同樣創建編譯目錄并在里面進行編譯:
 mkdir -v ../gcc-build
 cd ../gcc-build
 ../gcc-4.1.1/configure --prefix=${CLFS} --host=${CLFS_HOST} --target=${CLFS_TARGET} --disable-multilib --with-sysroot=${CLFS} --disable-nls --disable-shared --enable-languages=c
 make all-gcc
 make install-gcc

10.
安裝glibc
 
在前面安裝glibc的頭時已經做了一些事情,如把port解壓. 現在做的先是給glibc打補丁:
 cd glibc-2.5
 patch -Np1 -i ../patch/glibc-2.5-libgcc_eh-2.patch
 patch -Np1 -i ../patch/glibc-2.5-localedef_segfault-1.patch
 patch -Np1 -i ../patch/glibc-2.5-cross_hacks-2.patch
 patch -Np1 -i ../patch/glibc-2.5-branch_update-1.patch
 
然后創建編譯目錄并開始編譯:
 cd ../glibc-build
 rm -rf *
 
為支持NPTL做如下操作:
 echo "libc_cv_forced_unwind=yes" > config.cache
 echo "libc_cv_c_cleanup=yes" >> config.cache
 
指明安裝目錄:
 echo "install_root=${CLFS}" > configparms
 
開始編譯:
 BUILD_CC="gcc" CC="${CLFS_TARGET}-gcc" AR="${CLFS_TARGET}-ar" RANLIB="${CLFS_TARGET}-ranlib" ../glibc-2.5/configure --prefix=/usr --libexecdir=/usr/lib/glibc --host=${CLFS_TARGET} --build=${CLFS_HOST} --disable-profile --enable-add-ons --with-tls --enable-kernel=2.6.0 --with-__thread --with-binutils=${CLFS}/bin --with-headers=${CLFS}/usr/include --cache-file=config.cache

 
由于使用的是2.6.19的內核, 內核中使用了新的netlink接口, 把一些宏去掉了
 
參考maillist可知這些定義已經不在內核中使用, 但是應該還在用戶空間使用
 CLFS
中對最新內核的支持現在只到2.6.18.2
 
所以用2.6.19的需要自己修改一下:
 
修改目錄和文件為:
 glibc-2.5/sysdeps/unix/sysv/linux# grep IFA * -l
  check_pf.c
  if_index.c
  ifaddrs.c
 
在上面的文件中增加如下內容:
 #include <linux/if_addr.h>

 #define IFLA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg))))
 #define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg))
 #define IFA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifaddrmsg))))
 #define IFA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifaddrmsg))
 
然后執行下面操作
 make
 make install

 
下面安裝locale, 如果想安裝全部locale的話可以執行下面的命令(時間比較長, 可能有半小時):
 make localedata/install-locales
 
而如果你不想全裝, 只想裝某些localeclfs推薦按下面命令執行:
 mkdir -pv ${CLFS}/usr/lib/locale
 export I18NPATH=${PWD}/localedata
 export GCONV_PATH=${PWD}/iconvdata
 export LOCALEDEF="${PWD}/locale/localedef-native --alias-file=../intl/locale.alias"
 cd ../glibc-2.5/localedata
 ${LOCALEDEF} -i locales/de_DE -f charmaps/ISO-8859-1 --prefix=${CLFS} de_DE
 ${LOCALEDEF} -i locales/de_DE@euro -f charmaps/ISO-8859-15 --prefix=${CLFS} de_DE@euro
 ${LOCALEDEF} -i locales/en_HK -f charmaps/ISO-8859-1 --prefix=${CLFS} en_HK
 ${LOCALEDEF} -i locales/en_PH -f charmaps/ISO-8859-1 --prefix=${CLFS} en_PH
 ${LOCALEDEF} -i locales/en_US -f charmaps/ISO-8859-1 --prefix=${CLFS} en_US
 ${LOCALEDEF} -i locales/es_MX -f charmaps/ISO-8859-1 --prefix=${CLFS} es_MX
 ${LOCALEDEF} -i locales/fa_IR -f charmaps/UTF-8 --prefix=${CLFS} fa_IR
 ${LOCALEDEF} -i locales/fr_FR -f charmaps/ISO-8859-1 --prefix=${CLFS} fr_FR
 ${LOCALEDEF} -i locales/fr_FR@euro -f charmaps/ISO-8859-15 --prefix=${CLFS} fr_FR@euro
 ${LOCALEDEF} -i locales/it_IT -f charmaps/ISO-8859-1 --prefix=${CLFS} it_IT
 ${LOCALEDEF} -i locales/ja_JP -f charmaps/EUC-JP --prefix=${CLFS} ja_JP
 unset I18NPATH GCONV_PATH LOCALEDEF
 
個人認為如果不想全裝, 直接修改一下localedata/Makefile,把不需要的locale去掉后再執行第一種方法可能更簡單. 這里我執行的是第一種方法.

11.
配置glibc運行信息
 
如果不配置的話glibc也會有默認配置, 但是在網絡環境下可能不正常. 所以需要配置一下.
 
用如下命令創建文件/etc/nsswitch.conf,當然直接編輯更快(直接編輯時把后面的EOF去掉):
 cat > ${CLFS}/etc/nsswitch.conf << "EOF"
 # Begin /etc/nsswitch.conf

 passwd: files
 group: files
 shadow: files

 hosts: files dns
 networks: files

 protocols: files
 services: files
 ethers: files
 rpc: files

 # End /etc/nsswitch.conf
 EOF
 
然后用下面命令配置一下時區:
 TZDIR="${CLFS}/usr/share/zoneinfo" ${CLFS}/usr/bin/tzselect
 
回答一些問題后, 使用下面命令保存timezone:
 cp -v --remove-destination ${clfs}/usr/share/zoneinfo/[xxx] \
  ${clfs}/etc/localtime
 [xxx]
就是上面的結果.
 
我的結果是:
 TZ='Asia/Shanghai'; export TZ
 
所以命令是:
 cp -v --remove-destination ${clfs}/usr/share/zoneinfo/'Asia/Shanghai' ${clfs}/etc/localtime


12.
配置動態裝載器(如果你有庫文件放在/lib/usr/lib外的其它目錄的話)
 
動態裝載器(/lib/ld-linux.so.2) /lib/usr/lib目錄下查找程序需要的動態庫.
 
如果動態庫所在目錄不上上面兩個目錄下, 那需要把它的目錄寫到/etc/ld.so.conf.
 
一般/usr/local/lib/opt/lib目錄也需要查找.
 
如果你有動態庫放在這兩個目錄下的話, 做如下操作(我沒有所以不做):
 cat > ${CLFS}/etc/ld.so.conf << "EOF"
 # Begin /etc/ld.so.conf

 /usr/local/lib
 /opt/lib

 # End /etc/ld.so.conf
 EOF

13.
編譯gcc. 前面已經編譯過一次. 前面的編譯是為了創建交叉版本的glibc, 現在則是創建交叉版本的gcc.
 
先打補丁
 cd gcc-4.1.1
 patch -Np1 -i ../patch/gcc-4.1.1-posix-1.patch
 patch -Np1 -i ../patch/gcc-4.1.1-PR20425-1.patch
 patch -Np1 -i ../patch/gcc-4.1.1-cross_search_paths-1.patch
 
第一個和每三個前面都已經打過了, 所以這里只需要再打第二個就可以了
 
然后創建編譯目錄:
 mkdir -v ../gcc-build
 cd ../gcc-build
 ../gcc-4.1.1/configure --prefix=${CLFS} \
  --host=${CLFS_HOST} --target=${CLFS_TARGET} --disable-multilib \
  --with-sysroot=${CLFS} --disable-nls --enable-shared \
  --enable-languages=c,c++ --enable-__cxa_atexit \
  --enable-c99 --enable-long-long --enable-threads=posix
 make
 make install

14.
交叉編譯工具鏈已經做好,現在就小試一下牛刀,馬上來個Hello World

posted on 2008-02-10 16:18 幽幽 閱讀(1994) 評論(0)  編輯 收藏 引用 所屬分類: Linux

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理



<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

常用鏈接

留言簿(6)

隨筆分類(35)

隨筆檔案(51)

文章分類(3)

文章檔案(3)

相冊

我的鏈接

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            免费在线观看一区二区| 国内精品久久久久久久影视麻豆| 亚洲欧洲一区二区三区| 久久久xxx| 欧美专区在线播放| 欧美夜福利tv在线| 久久久免费av| 欧美高清在线视频| 亚洲国产裸拍裸体视频在线观看乱了 | 亚洲视频狠狠| 亚洲深夜福利网站| 亚洲一区二区毛片| 午夜精品久久久久| 久久久久久久一区二区| 亚洲高清视频一区| 久久色在线播放| 久久精品国产亚洲aⅴ| 香蕉久久国产| 久久综合影视| 亚洲国产精品视频一区| 亚洲毛片在线观看| 性色av一区二区三区在线观看| 久久精品视频在线播放| 欧美精品二区| 国产午夜久久| a91a精品视频在线观看| 性欧美大战久久久久久久免费观看| 久久九九热re6这里有精品| 亚洲国产综合91精品麻豆| 亚洲欧美日产图| 欧美成人精品在线视频| 国产精品一区二区在线观看| 亚洲国产欧美一区| 午夜视频一区在线观看| 亚洲娇小video精品| 久久福利资源站| 国产精品久久久久一区| 亚洲精品欧美精品| 久久亚洲国产成人| 亚洲永久视频| 欧美日韩一区二区三区免费| 亚洲国产精品小视频| 久久不射中文字幕| 一本色道精品久久一区二区三区 | 欧美视频手机在线| 亚洲高清视频在线观看| 久久久精品免费视频| 在线亚洲一区| 欧美日韩国产限制| 亚洲激情网站免费观看| 久久人人精品| 久久激情中文| 国产精品久久久久久妇女6080| 亚洲国产日韩欧美一区二区三区| 久久理论片午夜琪琪电影网| 午夜欧美视频| 国产美女扒开尿口久久久| 一区二区三区国产| 99精品久久久| 国产精品多人| 欧美在线首页| 久久国产高清| 在线精品一区| 亚洲高清在线精品| 欧美粗暴jizz性欧美20| 最新日韩在线| 国产欧美日韩精品丝袜高跟鞋| 欧美日本国产精品| 一区二区三区免费在线观看| 亚洲精品国产精品乱码不99| 欧美日本一道本| 亚洲欧美国产不卡| 亚洲欧美清纯在线制服| 国产精品系列在线播放| 久久久久国产精品厨房| 久久久亚洲国产天美传媒修理工| 一区在线免费观看| 亚洲国产日韩欧美在线99 | 美国成人直播| 亚洲国产精品激情在线观看| 亚洲国产高清一区| 国产精品盗摄一区二区三区| 先锋影音一区二区三区| 久久国产精彩视频| 亚洲精品久久久久久下一站| 亚洲精品视频在线看| 国产精品福利影院| 久久久噜噜噜久久狠狠50岁| 你懂的视频一区二区| 亚洲中字在线| 久久国产一区二区| 99国产精品久久久久老师| 一区二区三区精品视频在线观看| 国产日韩欧美一区| 91久久精品一区二区三区| 欧美日韩亚洲综合| 久久精品卡一| 欧美日韩亚洲一区| 蜜臀va亚洲va欧美va天堂| 欧美精品一区二区视频| 欧美亚洲免费高清在线观看| 久久在线精品| 香蕉成人啪国产精品视频综合网| 巨胸喷奶水www久久久免费动漫| 亚洲中字黄色| 欧美大片免费久久精品三p| 午夜精品在线观看| 欧美华人在线视频| 久久人人爽人人爽爽久久| 欧美日韩少妇| 欧美国产日韩二区| 国产欧美一区二区三区沐欲| 亚洲精品系列| 亚洲黄色尤物视频| 久久爱www久久做| 亚洲视频在线观看网站| 狂野欧美性猛交xxxx巴西| 性欧美video另类hd性玩具| 欧美激情亚洲一区| 亚洲成色777777在线观看影院| 国产日韩在线不卡| 亚洲午夜免费福利视频| 亚洲精品影视| 久久人人爽爽爽人久久久| 欧美制服第一页| 国产精品国产成人国产三级| 亚洲激情成人在线| 亚洲第一视频| 美日韩免费视频| 精品69视频一区二区三区| 亚洲一区二区视频| 欧美成人一区二区三区| 免费人成精品欧美精品| 国产在线精品二区| 欧美一区二区三区四区在线| 久久久精品国产免大香伊| 欧美性猛交视频| 亚洲另类视频| 亚洲精品乱码久久久久久蜜桃91| 久久只有精品| 欧美激情区在线播放| 亚洲经典在线| 欧美日本中文字幕| 最新精品在线| 亚洲视频第一页| 欧美午夜不卡影院在线观看完整版免费 | 麻豆精品精华液| 亚洲电影免费| 欧美精品日本| 亚洲乱码日产精品bd| 亚洲一区二区三区久久| 国产精品美女主播| 欧美影院精品一区| 久久综合九色九九| 亚洲区国产区| 国产精品国产三级国产专播品爱网 | 亚洲美女性视频| 欧美午夜视频在线观看| 亚洲一区在线视频| 久久影视三级福利片| 亚洲国产激情| 欧美日韩在线第一页| 亚洲免费网站| 老司机免费视频久久| 亚洲人成网站精品片在线观看| 欧美精品久久一区二区| 亚洲一区视频在线观看视频| 久久免费国产精品1| 日韩视频―中文字幕| 国产麻豆视频精品| 欧美a级片网站| 亚洲性图久久| 欧美高清视频在线观看| 亚洲午夜影视影院在线观看| 国产午夜精品麻豆| 欧美高清你懂得| 亚洲欧美一区二区三区极速播放| 久久先锋资源| 亚洲欧美日韩国产精品 | 午夜免费日韩视频| 在线电影欧美日韩一区二区私密| 欧美日韩一区二区高清| 久久天堂精品| 亚洲永久精品国产| 91久久黄色| 老司机免费视频一区二区| 亚洲欧美视频一区| 亚洲卡通欧美制服中文| 黄色一区二区在线观看| 欧美三级欧美一级| 蜜臀久久久99精品久久久久久| 午夜一级在线看亚洲| 日韩小视频在线观看| 欧美日韩专区| 欧美日韩一区自拍| 亚洲免费在线| 亚洲免费观看高清完整版在线观看熊 | 一区二区三区四区国产| 亚洲黄色一区| 亚洲大片一区二区三区|