|
根據網上的資源介紹, 成功的telnet登錄到了小I內部, 但是發現shell只有一個ash, 用起來非常的不爽,於是想自己弄個bash用,先是參考了OopsWare大蝦的文章:http://club.ccmove.com/nclub/top ... &TopicID=397292, 整個編譯的過程很順利, 編譯好以後用生成的arm-softfloat-linux-gnu-gcc編譯了一個簡單的hello,world程序,傳到小I上運行, 一切正常!於是開始編譯bash 3.1, 編譯成功後把生成的bash傳到小I, 可是運行的時候問題出來了,運行的時候顯示:8 R3 w7 c+ s) P- D8 o: i
# ./bash8 N& y- I4 i0 [5 n5 h% p8 m
Illegal instruction
/ @4 Z3 {' W: k+ F& N, `搞了一下午始終沒有找到原因.0 c: ~+ h/ L4 Q2 k( h
& d: i. J" B; U5 c' k2 u後來在電驢上發現了一個編譯好的包:arm-linux-toolchain-cygwin-3.4.3.tar.gz,有86.4M
/ n$ I9 {6 g% q# G9 w2 c(該文件可以在eMule裡面搜索/下載)
+ X R- E, ?% v+ N$ q經測試可以正常交叉編譯arm-linux程序,編譯好的程序在小I上也可以正常運行.
- J8 a4 |( ?: _! D# Y$ G& E! v! ], F6 p6 O' B) e2 P
安裝的步驟如下假設cygwin安裝在c:/cygwin,下載的包放在c:/tmp)
$ I3 Q- l) s% T6 T+ P1. 在 c:/tmp 下運行:9 \ p4 K# k+ h
tar xvfz arm-linux-toolchain-cygwin-3.4.3.tar.gz
8 ?. H; `( R k, b) R: G# l# \然後在tmp下會生成一個目錄usr,下面有如下子目錄:7 E7 l, [# O8 x( l" T! ~# @ }+ a5 r% H
arm-linux/ bin/ include/ info/ lib/ libexec/ man/ share/; }' v+ Y! Q4 w: v# J, J: B/ }
! i8 j0 O. z- p6 j) `; F2.把c:/tmp/usr/bin下的所有文件拷貝(或移動)到c:/cygwin/bin;
+ L9 z0 ?, y+ _把c:/tmp/usr/lib下的所有文件拷貝(或移動)到c:/cygwin/lib;
$ W1 Y8 ?! j- ]5 ?把arm-linux/ include/ info/ libexec/ man/ share/
, P& v* D) W9 y; v' T幾個目錄拷貝(或移動)到c:/cygwin/usr目錄下,拷貝過程中如果詢問是否覆蓋選擇全是.) m. e9 ?. X' B5 d
5 U! n# \# q3 |/ f4 {1 M! ~
3.這時候運行arm-linux-gcc就可以編譯arm-linux的執行文件了,該包還帶了一個arm的模擬器$ n9 T' i# C( F) J+ W* O4 n6 ]
armv5l-linux-run,但是我沒有運行成功.7 o: w& J, Q5 G2 f6 a. R k) z
E/ U S: X, X$ j! E8 s. @; s0 q
4.以bash 3.1為例介紹一下arm-linux軟件的編譯過程:
' k4 ^) m# w2 s1)在ftp://ftp.gnu.org/pub/gnu/bash下載bash-3.1.tar.gz.
' n5 M5 `( _' R& d# @6 s6 ^2)執行下列命令: P+ j `* ]! ?" J/ ~% R4 X1 T
tar xvfz bash-3.1.tar.gz8 V, q- D+ Z" h; {) {5 E- T
cd bash-3.1
( k& p5 [8 {$ S8 H/ M1 {9 z/ p./configure --host=arm-linux (configure要簡單處理一下:刪除行9983到行10042間的內容)
9 @/ o2 R4 F3 m3 t6 jmake4 J" d% f: S/ C% u$ w, x: |2 f
1 a- C9 o% I: p* f9 C
3)編譯完成後會生成arm-linux的執行文件bash,運行命令:
/ E" q0 L. h8 c, @5 afile bash+ ]2 e1 k6 H4 O# s; N' X2 I
顯示
- g2 e; J& _$ f9 |; L* ^bash: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped! e' k1 y' V% F _2 r- I) B
證明編譯成功
+ N6 Y, _2 o6 _4 u6 H: c
3 v5 U3 T0 ?/ Z$ ^6 _6 z4)運行arm-linux-strip bash, 去除不必要的符號信息,可以使編譯好的bash文件大小從3M多減少到600多k.
6 r) A1 F! U* M: U+ b0 N& |1 S% {0 {! o& `, `5 f6 u E" X( x
5)把編譯好的bash上傳到小I上就可以運行了.: f% y2 b, q( Q
6 `. ?& a" O$ b1 S. d/ O, p% C4 I3 ~; Q' x+ u, u! B) O! R
進一步的想法:能否用busybox(http://www.busybox.net/)來代替小I# G3 O3 R+ l' ?0 l
/bin /usr/bin /sbin /usr/sbin目錄中的命令文件,這樣可以節省出幾M的空間?6 V, X& }; E& q
. n* I: g+ Z" A; ?, W' r- K
! C+ f) S8 s( e/ l/ f1 Q
--------------------------------------------------------------------------------
; S" n# i: D: A$ o( _# h; x9 P從電驢上下那個arm-linux-toolchain-cygwin-3.4.3.tar.gz用了幾天以後發現還是有問題,
/ v; L2 b& R' Y z$ F$ R雖然能夠正常編譯,編譯出來也能正常運行,但是只要一涉及浮點數有關的處理, 出來的結果
( t( s3 Q+ U4 ^; `) |# h- y完全是錯誤的,比如我用busybox替換了系統的df,運行的時候結果如下:
6 m$ _/ u N- A~#df -h! W" |* B8 X/ ~+ z* L% F$ q9 k
Filesystem Size Used Available Use% Mounted on9 n: p5 [3 a- l8 X- n0 J# n
/dev/tffsa 64424509455.4M 64424509455.4M 0 100% /usr/language
: o- f, i' v) O2 i" ^/dev/roflash2 1786706395552.0k 1786706395552.0k 0 100% /usr/setup9 ~/ N }7 ]$ e& T6 ]
/dev/mtdblock2 21474836485.2M 4294967297.8M 12884901891.4M 34% /ezxlocal5 A' ~! q5 z9 Y/ l8 q, q m- t7 h
/dev/mmca1 4088808866744.7M 996432412904.4M 3092376453840.3M 24% /mmc/mmca14 u3 @/ I7 t. q
/dev/tffsb1 201863462959.9M 12884901891.8M 188978561068.1M 8% /diska
( c4 x6 [7 u, ?0 X# g/dev/loop0 223338299444.3M 223338299444.3M 0 100% /ezxlocal/opie! E; m3 {& Y8 Z4 T& `* s3 i; v
估計是這個包在編譯的時候沒有加進軟件模擬浮點處理器支持, 而小I本身沒有硬件的浮點處理器.. U/ I* P+ r/ {( a: Z" c
沒辦法, 還是只得自己動手編譯了, 後來又查了些資料,做了些實驗, 發現自己動手編譯建立toolchain最簡單的方法如下:
- Z# j! x- G" C* n/ U: R. w
l) |$ Y. _; |' Q! Z0 h( B第1步.準備工作,下載如下軟件包:
2 z3 C/ L6 k% `1 S! Y/ B2 p7 Z6 ]http://lsb.blogdns.net/ezx-crosstool下載ezx-crosstool-0.5.tar.bz2
/ ]. ]$ ?3 g5 s& ?. ?8 k
" @ l, {3 e( |1 qftp://ftp.gnu.org/pub/gnu 下載如下包
- V/ A- n0 K7 P1 K' w8 pbinutils-2.15.tar.bz2 glibc-2.3.2.tar.bz2
/ k0 i# @1 r" ggcc-3.3.6.tar.bz2 glibc-linuxthreads-2.3.2.tar.bz2
2 P: Q" F+ @- X6 ?
4 V! N$ c+ R. u! Lhttp://www.kernel.org/pub/linux/kernel/v2.4/ 下載
* W' Z8 ]- U# ^* g" `linux-2.4.26.tar.bz2 v3 H6 e, r6 L! i/ |: C
. s! M' K. r. a3 ?3 L& C0 l- K/ r
以上幾個包只有第一個是必須的, 後面幾個編譯的時候如果沒有會自動下載,如果你網速夠快的話3 `& }+ H+ j) R3 C* b
就可以先不用下載
% A) U4 g; ]3 N! k& j1 H' R. b. f6 D0 R7 @
第2步.把下載來的ezx-crosstool-0.5.tar.bz2解包:
3 R! ?! i5 q+ P$ U; B; x- x9 ltar xvfj ezx-crosstool-0.5.tar.bz26 y4 s" O! ?6 x X& ^- u( V* h
會生成一個ezx-crosstool-0.5目錄, 然後把預先下載的:( U$ g' q" k7 P0 v& _3 @: n6 @
binutils-2.15.tar.bz2 glibc-2.3.2.tar.bz2 linux-2.4.26.tar.bz24 Z' E* S3 y. i8 c2 D" [( h ^/ ^
gcc-3.3.6.tar.bz2 glibc-linuxthreads-2.3.2.tar.bz28 e: W! u5 ~8 I7 D8 s
拷貝到ezx-crosstool-0.5目錄的子目錄下(沒有預先下載則跳過此步).' f, o; ^; ?) W s* r
0 n: b! s+ N6 r- ^
第3步.編輯ezx-crosstool-0.5目錄下的build.sh文件,把第5行:
1 y& }' b9 V0 S: TRESULT_TOP=$CROSSTOOL_DIR/gcc-arm-iwmmxt. ~9 o j9 q, K, A$ L3 a% Z
改成你想要的安裝位置,比如要安裝在/usr/arm就改成:3 T$ E7 n& m7 p1 `
RESULT_TOP=/usr/arm' a- N. H6 ?: @* B
" P( j! U2 \1 z4 I/ f$ p6 R2 c% T
第4步.最後一步,也是最費時間的一步:
+ n1 G- k$ ~, Z2 E在ezx-crosstool-0.5目錄下運行:
. B1 ]9 T% v& f. a./build.sh
' F6 B: ]3 d# o. e# r' I5 n9 W* f# C, I- `! b
然後就慢慢等吧..., J& }- z- H$ W6 z. l
整個過程在我的機器上大概用了兩個來小時.我的機配是XP2600+ , 1G ram |
評分
-
查看全部評分
|