Chip123 科技應用創新平台

標題: 在大陸網站找的資料~~2 [打印本頁]

作者: chiohsin    時間: 2008-4-29 12:24 PM
標題: 在大陸網站找的資料~~2
根據網上的資源介紹, 成功的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, 可是運行的時候問題出來了,運行的時候顯示:
( n/ v1 s  ~0 |+ k# ./bash( g! ?, h# x$ N. t5 ?
Illegal instruction
% W4 \3 [' Y+ A& X2 J( e搞了一下午始終沒有找到原因.# v9 A8 n" c' X% ?3 T

& s# T. j$ J  {! i後來在電驢上發現了一個編譯好的包:arm-linux-toolchain-cygwin-3.4.3.tar.gz,有86.4M$ s3 k. l( }. g
(該文件可以在eMule裡面搜索/下載)
2 t1 B) W" v. v  Q: [" P" N! m) B$ Z經測試可以正常交叉編譯arm-linux程序,編譯好的程序在小I上也可以正常運行.  L4 D8 _2 h0 m3 w
. S# Y* K  T$ G) @
安裝的步驟如下假設cygwin安裝在c:/cygwin,下載的包放在c:/tmp)
' p0 S7 P) C8 e5 d. R- U) t  }0 o6 m1. 在 c:/tmp 下運行:
$ g! R# p7 G& }* V! a6 B4 ^tar xvfz arm-linux-toolchain-cygwin-3.4.3.tar.gz! {* V" Z4 N8 b  b
然後在tmp下會生成一個目錄usr,下面有如下子目錄:1 f* I" y( Q6 C; L! n+ u# h
arm-linux/  bin/  include/  info/  lib/  libexec/  man/  share/; _, v3 S* s. |  n2 z' h2 b$ m
- t6 V# Z9 s6 l9 m; u5 V% ~* q/ J
2.把c:/tmp/usr/bin下的所有文件拷貝(或移動)到c:/cygwin/bin;
- q6 f& T9 K! T% f0 ~把c:/tmp/usr/lib下的所有文件拷貝(或移動)到c:/cygwin/lib;* R2 q1 u- O# P: J  Z' H& X+ o3 V
把arm-linux/ include/ info/ libexec/  man/  share/
6 q" U7 y2 W  I' I7 s幾個目錄拷貝(或移動)到c:/cygwin/usr目錄下,拷貝過程中如果詢問是否覆蓋選擇全是.
: B5 {; |; j" y/ l
9 v2 |, w5 n( D. R& v3.這時候運行arm-linux-gcc就可以編譯arm-linux的執行文件了,該包還帶了一個arm的模擬器3 _- A8 e. p' F, ?2 o
armv5l-linux-run,但是我沒有運行成功.
7 E- q: l4 Q: N* x" B- {/ [7 ]' H( }1 K# W& A+ r5 f! h
4.以bash 3.1為例介紹一下arm-linux軟件的編譯過程:
& O$ i( |/ g7 C8 }' L6 ?3 Y1)在ftp://ftp.gnu.org/pub/gnu/bash下載bash-3.1.tar.gz.& k( m2 ]# Z  n7 w  j0 H
2)執行下列命令:$ X  {8 s! B; m
tar xvfz bash-3.1.tar.gz* i& z  L9 Y# V, E) ?$ D, I; o
cd bash-3.1
/ R& O# C& [, g# C./configure --host=arm-linux (configure要簡單處理一下:刪除行9983到行10042間的內容)
+ }7 d- ^; X% H  @2 F. Rmake
& M! ^, U0 K/ R, ?  {% ]3 W0 {7 d$ X# g$ X- I2 v  V; i; Z4 w) x
3)編譯完成後會生成arm-linux的執行文件bash,運行命令:
$ _2 G1 c4 j9 I, D  cfile bash, p& X0 l4 c+ |% }! P2 c3 N- B9 G% C
顯示0 e3 H, o" C$ u9 h6 u' F: Z2 I
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
$ |9 c2 d( t3 ?: W證明編譯成功
- _5 L7 l8 ?) c8 c& M0 h0 T& Z) h3 p$ B. Y& Z' Z
4)運行arm-linux-strip bash, 去除不必要的符號信息,可以使編譯好的bash文件大小從3M多減少到600多k.
( S8 A  [: V, A; V9 B
( n$ g* A, g: V- [% s" `" ]: `5)把編譯好的bash上傳到小I上就可以運行了.0 m( c  C# |6 i5 f" y

+ |" K; Y! ~/ h  D/ [) F: C# V% G5 B& e
8 F! q6 K0 G2 D5 [3 F" T進一步的想法:能否用busybox(http://www.busybox.net/)來代替小I( J- T6 ], |4 ~0 D  ]% H
/bin /usr/bin /sbin /usr/sbin目錄中的命令文件,這樣可以節省出幾M的空間?
! y& q. q, `/ ]: ?2 e- ]- z$ @  [" O1 {/ ]1 t1 |  x& D$ J! Y7 I

& g% Z. ~1 n' ], l2 V: `--------------------------------------------------------------------------------3 h* A2 T9 r4 D9 m, p. t! ^  b. E4 k
從電驢上下那個arm-linux-toolchain-cygwin-3.4.3.tar.gz用了幾天以後發現還是有問題,! B) w4 V" o, i, K# u8 i, n
雖然能夠正常編譯,編譯出來也能正常運行,但是只要一涉及浮點數有關的處理, 出來的結果5 {% b/ O1 w5 ~
完全是錯誤的,比如我用busybox替換了系統的df,運行的時候結果如下:
3 n1 I; c8 A8 Q' w7 ~~#df -h
- i/ K. h# j/ JFilesystem                Size      Used Available Use% Mounted on
6 B/ ~. P% [% f+ f" x+ w/dev/tffsa           64424509455.4M 64424509455.4M         0 100% /usr/language  S1 L  f5 h! R- j2 V% W
/dev/roflash2        1786706395552.0k 1786706395552.0k         0 100% /usr/setup
9 R; o/ l) O9 O' H' h5 _- e/dev/mtdblock2       21474836485.2M 4294967297.8M 12884901891.4M  34% /ezxlocal. C8 b4 J3 `0 G) u
/dev/mmca1           4088808866744.7M 996432412904.4M 3092376453840.3M  24% /mmc/mmca1# ?1 E% d$ d% N& t! ?$ N( d
/dev/tffsb1          201863462959.9M 12884901891.8M 188978561068.1M   8% /diska7 q" [/ X) f+ `5 X. h6 |6 X6 V
/dev/loop0           223338299444.3M 223338299444.3M         0 100% /ezxlocal/opie
' |+ [* t8 ^) N( ^/ n; k9 F+ N% |估計是這個包在編譯的時候沒有加進軟件模擬浮點處理器支持, 而小I本身沒有硬件的浮點處理器.
! @" ^5 Y0 B6 q. y沒辦法, 還是只得自己動手編譯了, 後來又查了些資料,做了些實驗, 發現自己動手編譯建立toolchain最簡單的方法如下:! Z# i1 c2 M0 J5 v; m
9 e3 _+ h) R: q- t2 w
第1步.準備工作,下載如下軟件包:- @; n* D' ?& E
http://lsb.blogdns.net/ezx-crosstool下載ezx-crosstool-0.5.tar.bz2 ; [0 B: k) @4 M% \. Q$ [) s( V; W

# E% l; q4 \" _+ H# o/ ~, Wftp://ftp.gnu.org/pub/gnu 下載如下包- y0 S) q$ H, V- {9 R
binutils-2.15.tar.bz2 glibc-2.3.2.tar.bz2
( ]6 S+ |4 n% L9 N) Hgcc-3.3.6.tar.bz2 glibc-linuxthreads-2.3.2.tar.bz2
8 g! ^' T) J: c9 U( R3 {+ s: c8 l7 M& n# K3 D  k
http://www.kernel.org/pub/linux/kernel/v2.4/ 下載4 @2 D% `& k- L+ C/ U! K
linux-2.4.26.tar.bz2* f4 B* ~1 D, a7 {
, G, l/ u  c0 b; k2 t
以上幾個包只有第一個是必須的, 後面幾個編譯的時候如果沒有會自動下載,如果你網速夠快的話' x: Q# q  K' j7 t( L* Y/ ]) E
就可以先不用下載2 q; W+ {7 i$ m( z; z5 j

  \' m& q9 \* z7 Y' o第2步.把下載來的ezx-crosstool-0.5.tar.bz2解包:+ }; A9 D- h! G
tar xvfj ezx-crosstool-0.5.tar.bz28 a4 u3 v0 I% k! v
會生成一個ezx-crosstool-0.5目錄, 然後把預先下載的:5 k. V' |# A; w& L1 u+ E
binutils-2.15.tar.bz2  glibc-2.3.2.tar.bz2                linux-2.4.26.tar.bz2
( Y' E  N2 n  A- a( rgcc-3.3.6.tar.bz2       glibc-linuxthreads-2.3.2.tar.bz2$ ]9 V& K* }3 v9 a4 V
拷貝到ezx-crosstool-0.5目錄的子目錄下(沒有預先下載則跳過此步).
7 T8 Y( P3 ]+ W9 W  J" [# \& r5 a  U  H& g1 O. i# m7 C) a
第3步.編輯ezx-crosstool-0.5目錄下的build.sh文件,把第5行:6 n+ k/ c* O' t
RESULT_TOP=$CROSSTOOL_DIR/gcc-arm-iwmmxt
9 G  l% F8 Q" p改成你想要的安裝位置,比如要安裝在/usr/arm就改成:, X. f4 i- }, y, R( S1 u3 U* ?# m2 @7 j
RESULT_TOP=/usr/arm, c" U: b( M2 S9 j: E

6 D1 a0 N0 f1 R  b/ {4 Z* h第4步.最後一步,也是最費時間的一步:; G% u, A$ a2 f; J; Y) J
在ezx-crosstool-0.5目錄下運行:
; S/ J+ W) v0 `; L6 r' j./build.sh
0 w0 w/ h/ S9 Z; n+ |7 b0 r# x/ `0 G+ e8 P
然後就慢慢等吧...
' d# V# f; V  T/ [. e5 j% l整個過程在我的機器上大概用了兩個來小時.我的機配是XP2600+ , 1G ram




歡迎光臨 Chip123 科技應用創新平台 (http://free.vireal.world/chip123_website/innoingbbs/) Powered by Discuz! X3.2