幽幽
C++博客
首頁
新文章
新隨筆
聚合
管理
posts - 51, comments - 28, trackbacks - 0
自己動(dòng)手創(chuàng)建交叉工具鏈
首先,制作交叉工具鏈的目的是為了給我的手機(jī)--MOTO ROKR E2編譯程序。
然后,順便學(xué)習(xí)一下嵌入式軟件的開發(fā)
先說一下,搞這個(gè)需要很大的耐心。
我用的硬件是Sempron3100+, 512MB內(nèi)存, 編譯環(huán)境是windowsXP + vmware5.5 + gentoo,
在CUI下,花了大概20個(gè)小時(shí)才編譯完(我從晚上八點(diǎn)一直弄到第二天下午四點(diǎn)
)。
1.
準(zhǔn)備源碼
:
binuitls-2.17
gcc-4.1.1
glibc-2.5
glibc-ports-2.5
以上都可以在
gnu.org
的
ftp
上下載
默認(rèn)
glibc
不支持其它處理器
, glibc-ports
是支持其它處理器架構(gòu)的補(bǔ)丁
另外還有
kernel,
我使用最新的
2.19.1(kernel
用于提供編譯頭文件
)
2.
準(zhǔn)備補(bǔ)丁
:
這個(gè)可以在
cross-lfs.org
上面根據(jù)它的指南下載
,
我使用了下面的補(bǔ)丁
:
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
準(zhǔn)備編譯環(huán)境
,
我直接使用的
debian(sid)
并且所有包都是最新狀態(tài)
,
另外需要安裝
texinfo, gawk(
注意
mawk
編譯
glibc header
時(shí)會(huì)有問題
), bison, flex
4.
準(zhǔn)備環(huán)境變量
.
我寫了一個(gè)
pre.sh,
所有相關(guān)內(nèi)容都放里面
set +h #
關(guān)閉
bash
的
hash
功能
,hash
功能用來記憶系統(tǒng)中所有可執(zhí)行文件來避免查找
path.
編譯時(shí)可能會(huì)增加新的同名可執(zhí)行程序在其它目錄下
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
為其它時(shí)
chroot
回來可能會(huì)有異常
export PATH=$CLFS/bin:$PATH
# CFLAGS
和
CXXFLAGS
對(duì)編譯時(shí)可能會(huì)有影響
unset CFLAGS
unset CXXFLAGS
5.
準(zhǔn)備環(huán)境
.
執(zhí)行
source pre.sh
后執(zhí)行下面的操作
:
install -dv ${CLFS} #
創(chuàng)建目標(biāo)目錄
install -dv ${CLFS}/include
install -dv ${CLFS}/usr/include
另外最好使用其它用戶身份去進(jìn)行編譯的操作
,
因?yàn)?/span>
root
可能會(huì)對(duì)系統(tǒng)造成破壞
.
建議創(chuàng)建一個(gè)
clfs
用戶和組專門操作
(
我是直接使用的
root):
groupadd clfs #
增加組
useradd -s /bin/bash -g clfs -m -k /dev/null clfs #
創(chuàng)建用戶
passwd clfs #
給用戶指定口令
chown -Rv clfs ${CLFS} #
修改輸出目錄的權(quán)限
CLFS
建議
clfs
帳號(hào)登錄時(shí)
,
最好不要被系統(tǒng)中其它環(huán)境變量影響
,
所以它在
clfs
帳號(hào)的
~/.bash_profile
里面寫入下面內(nèi)容
:
exec env -i HOME=${HOME} TERM=${TERM} PS1='\u:\w\$ ' /bin/bash
因?yàn)槲沂?/span>
root,
沒有修改
.
su - clfs #
切換到
clfs
用戶執(zhí)行操作
開始創(chuàng)建一些目錄
.
這里我沒有創(chuàng)建
,
因?yàn)槲抑恍枰?/span>
gcc, binutils
和
glibc
這三個(gè)
6.
編譯
binutils:
下載
binutils-2.17
并解壓
.
下載補(bǔ)丁
:
注意安裝
gcc bison flex texinfo
不然編譯過程會(huì)出錯(cuò)
我編譯時(shí)報(bào)的錯(cuò)是
missing makeinfo
然后安裝了
texinfo
還是不行
后面檢查
makefile
才發(fā)現(xiàn)
bison
等都沒有安裝
patch -Np1 -i ../patch/binutils-2.17-posix-1.patch
patch -Np1 -i ../patch/binutils-2.17-branch_update-1.patch
binutils
建議編譯時(shí)在其它目錄編譯
,
所以我們創(chuàng)建
binutils-build
并在里面執(zhí)行操作
mkdir -v ../binutils-build
cd ../binutils-build
如果你在
binutils-2.17
執(zhí)行操作的話
,
那后面的
make configure-host
時(shí)可能會(huì)報(bào)錯(cuò)
我因?yàn)閳?bào)錯(cuò)然后重做了一下干凈的解壓目錄重執(zhí)行
開始配置
../binutils-2.17/configure --prefix=${CLFS} \
--host=${CLFS_HOST} --target=${CLFS_TARGET} --with-sysroot=${CLFS} \
--disable-nls --enable-shared --disable-multilib
檢查看主機(jī)上的運(yùn)行條件是不是符合
make configure-host
編譯并安裝
:
make
make install
cp -v ../binutils-2.17/include/libiberty.h ${CLFS}/usr/include
7.
安裝內(nèi)核頭文件
:
clfs
中是直接復(fù)制目錄
,
我則是先
make menuconfig
然后修改一此事配置后才復(fù)制的
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
一個(gè)別人的
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
注意是解壓到當(dāng)前目錄
(glibc-2.5)
下
,
不然執(zhí)行后面的
configure
時(shí)會(huì)報(bào)
cpu
不支持
然后開始準(zhǔn)備編譯目錄
,
同上
,
我們也在其它目錄下進(jìn)行編譯
mkdir -v ../glibc-build
cd ../glibc-build
為打開
NPTL
支持進(jìn)行如下操作
:
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
再執(zhí)行下面的編譯
:
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
的話上面的步驟會(huì)出錯(cuò)
,
安裝
gawk
則不會(huì)
有一些文件還沒有被自動(dòng)復(fù)制過去
,
需要手工復(fù)制
:
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
第一次
,
這次是為了編譯交叉版本的
glibc
和
gcc,
先打補(bǔ)丁
patch -Np1 -i ../patch/gcc-4.1.1-posix-1.patch
patch -Np1 -i ../patch/gcc-4.1.1-cross_search_paths-1.patch
然后同樣創(chuàng)建編譯目錄并在里面進(jìn)行編譯
:
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
的頭時(shí)已經(jīng)做了一些事情,如把
port
解壓
.
現(xiàn)在做的先是給
glibc
打補(bǔ)丁
:
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
然后創(chuàng)建編譯目錄并開始編譯
:
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
的內(nèi)核
,
內(nèi)核中使用了新的
netlink
接口
,
把一些宏去掉了
參考
maillist
可知這些定義已經(jīng)不在內(nèi)核中使用
,
但是應(yīng)該還在用戶空間使用
CLFS
中對(duì)最新內(nèi)核的支持現(xiàn)在只到
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
在上面的文件中增加如下內(nèi)容
:
#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))
然后執(zhí)行下面操作
make
make install
下面安裝
locale,
如果想安裝全部
locale
的話可以執(zhí)行下面的命令
(
時(shí)間比較長
,
可能有半小時(shí)
):
make localedata/install-locales
而如果你不想全裝
,
只想裝某些
locale
那
clfs
推薦按下面命令執(zhí)行
:
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
個(gè)人認(rèn)為如果不想全裝
,
直接修改一下
localedata/Makefile,
把不需要的
locale
去掉后再執(zhí)行第一種方法可能更簡單
.
這里我執(zhí)行的是第一種方法
.
11.
配置
glibc
運(yùn)行信息
如果不配置的話
glibc
也會(huì)有默認(rèn)配置
,
但是在網(wǎng)絡(luò)環(huán)境下可能不正常
.
所以需要配置一下
.
用如下命令創(chuàng)建文件
/etc/nsswitch.conf,
當(dāng)然直接編輯更快
(
直接編輯時(shí)把后面的
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
然后用下面命令配置一下時(shí)區(qū)
:
TZDIR="${CLFS}/usr/share/zoneinfo" ${CLFS}/usr/bin/tzselect
回答一些問題后
,
使用下面命令保存
timezone:
cp -v --remove-destination ${clfs}/usr/share/zoneinfo/[xxx] \
${clfs}/etc/localtime
[xxx]
就是上面的結(jié)果
.
我的結(jié)果是
:
TZ='Asia/Shanghai'; export TZ
所以命令是
:
cp -v --remove-destination ${clfs}/usr/share/zoneinfo/'Asia/Shanghai' ${clfs}/etc/localtime
12.
配置動(dòng)態(tài)裝載器
(
如果你有庫文件放在
/lib
和
/usr/lib
外的其它目錄的話
)
動(dòng)態(tài)裝載器
(/lib/ld-linux.so.2)
在
/lib
和
/usr/lib
目錄下查找程序需要的動(dòng)態(tài)庫
.
如果動(dòng)態(tài)庫所在目錄不上上面兩個(gè)目錄下
,
那需要把它的目錄寫到
/etc/ld.so.conf
中
.
一般
/usr/local/lib
和
/opt/lib
目錄也需要查找
.
如果你有動(dòng)態(tài)庫放在這兩個(gè)目錄下的話
,
做如下操作
(
我沒有所以不做
):
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.
前面已經(jīng)編譯過一次
.
前面的編譯是為了創(chuàng)建交叉版本的
glibc,
現(xiàn)在則是創(chuàng)建交叉版本的
gcc.
先打補(bǔ)丁
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
第一個(gè)和每三個(gè)前面都已經(jīng)打過了
,
所以這里只需要再打第二個(gè)就可以了
然后創(chuàng)建編譯目錄
:
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.
交叉編譯工具鏈已經(jīng)做好,現(xiàn)在就小試一下牛刀,馬上來個(gè)Hello World
posted on 2008-02-10 16:18
幽幽
閱讀(1985)
評(píng)論(0)
編輯
收藏
引用
所屬分類:
Linux
只有注冊(cè)用戶
登錄
后才能發(fā)表評(píng)論。
【推薦】100%開源!大型工業(yè)跨平臺(tái)軟件C++源碼提供,建模,組態(tài)!
相關(guān)文章:
daemon 進(jìn)程為什么要fork兩次
自己動(dòng)手創(chuàng)建交叉工具鏈
網(wǎng)站導(dǎo)航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
<
2010年6月
>
日
一
二
三
四
五
六
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
常用鏈接
我的隨筆
我的評(píng)論
我參與的隨筆
留言簿
(6)
給我留言
查看公開留言
查看私人留言
隨筆分類
(35)
Java(2)
Linux(2)
web開發(fā)(1)
Windows(13)
匯編(1)
生活(2)
算法(3)
雜集(11)
隨筆檔案
(51)
2014年10月 (1)
2010年10月 (2)
2010年9月 (1)
2009年12月 (2)
2009年5月 (2)
2009年4月 (1)
2009年3月 (1)
2009年2月 (3)
2008年12月 (1)
2008年10月 (1)
2008年9月 (1)
2008年8月 (12)
2008年7月 (6)
2008年6月 (9)
2008年5月 (4)
2008年2月 (4)
文章分類
(3)
HDOJ日志(3)
文章檔案
(3)
2008年2月 (3)
相冊(cè)
4.22.轉(zhuǎn)
bbs
oa轉(zhuǎn)包
rilakkuma
Windows這20年
狗狗專帖
買家秀
綿羊系列店標(biāo)
寧波1
寧波2
寧波3
寧波4
情人節(jié)的禮物
旺鋪
相冊(cè)
我的鏈接
搜索
最新評(píng)論
1.?re: ActiveX組件與JavaScript交互
評(píng)論內(nèi)容較長,點(diǎn)擊標(biāo)題查看
--nobody
2.?re: 抨擊匈牙利命名法
Linus 本人說匈牙利命名法是brain damaged 很中肯!
--Linuxer
3.?re: 抨擊匈牙利命名法[未登錄]
慶幸樓主不是我同事
更慶幸樓主不是我老大
--Alex
4.?re: ActiveX組件與JavaScript交互
不錯(cuò)!
--joinman
5.?re: 一種給窗口添加陰影的方法
主窗口隱藏后,陰影窗口不能影藏,這個(gè)傷腦筋。
--吵吵
閱讀排行榜
1.?【轉(zhuǎn)】C++ int,char,string,CString類型轉(zhuǎn)換(整理總結(jié))(45783)
2.?swing中JFileChooser的用法(10135)
3.?CListCtrl使用詳解(6581)
4.?一種給窗口添加陰影的方法 (5436)
5.?GetItemPosition和GetItemRect(5383)
評(píng)論排行榜
1.?抨擊匈牙利命名法(10)
2.?【轉(zhuǎn)】C++ int,char,string,CString類型轉(zhuǎn)換(整理總結(jié))(4)
3.?一種給窗口添加陰影的方法 (3)
4.?滾動(dòng)控件(ScrollBar)(3)
5.?ActiveX組件與JavaScript交互(2)
Copyright ©2025 幽幽 Powered By
博客園
模板提供:
滬江博客
久久久久中文字幕
|
久久人做人爽一区二区三区
|
欧美激情精品久久久久久久九九九
|
99久久国产主播综合精品
|
久久强奷乱码老熟女
|
久久精品国产99国产精品亚洲
|
国产精品久久成人影院
|
一本一道久久a久久精品综合
|
国产精品久久成人影院
|
久久这里有精品视频
|
久久久久久亚洲Av无码精品专口
|
精品国产乱码久久久久久呢
|
国产亚洲欧美成人久久片
|
久久亚洲精品国产亚洲老地址
|
精品久久久久久国产三级
|
久久久久久九九99精品
|
蜜臀久久99精品久久久久久
|
久久人人爽人人爽人人AV
|
精品免费久久久久国产一区
|
久久精品国产网红主播
|
一个色综合久久
|
中文字幕无码久久精品青草
|
亚洲成色999久久网站
|
久久夜色精品国产网站
|
欧美亚洲国产精品久久
|
日本精品久久久久久久久免费
|
青草影院天堂男人久久
|
久久亚洲精品视频
|
九九99精品久久久久久
|
日韩AV无码久久一区二区
|
国产精品久久久久久
|
久久精品无码专区免费青青
|
国内高清久久久久久
|
国产精品久久久久a影院
|
性高湖久久久久久久久AAAAA
|
久久亚洲精品无码播放
|
久久强奷乱码老熟女网站
|
亚洲欧美另类日本久久国产真实乱对白
|
91精品国产91久久久久久
|
久久国产精品99久久久久久老狼
|
久久九九全国免费
|