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, 可是運行的時候問題出來了,運行的時候顯示:
: x: A8 e& y9 u" d& {
# ./bash
' a/ K( a$ E+ ~" @
Illegal instruction
( W8 d) R3 ?6 P* Z+ C
搞了一下午始終沒有找到原因.
0 p2 ^1 U" R$ P+ L0 @3 L# o/ q& C
b, Z5 L6 T% O# S; ]1 x0 r
後來在電驢上發現了一個編譯好的包:arm-linux-toolchain-cygwin-3.4.3.tar.gz,有86.4M
$ `$ u4 h/ u1 c" ?
(該文件可以在eMule裡面搜索/下載)
% @) R6 h( ^% R2 M2 F7 Y' u* f8 N7 Q- C
經測試可以正常交叉編譯arm-linux程序,編譯好的程序在小I上也可以正常運行.
3 y# M/ j3 c3 a8 H9 [
! x$ E% z N+ w) P2 F! E* q
安裝的步驟如下
假設cygwin安裝在c:/cygwin,下載的包放在c:/tmp)
6 w$ h1 \( `. \/ e
1. 在 c:/tmp 下運行:
% X# D. Z9 f9 D3 ?# M) w8 \
tar xvfz arm-linux-toolchain-cygwin-3.4.3.tar.gz
6 ~+ Y# q" M) c4 d. R. V
然後在tmp下會生成一個目錄usr,下面有如下子目錄:
1 J1 H& Z9 ^0 p6 h
arm-linux/ bin/ include/ info/ lib/ libexec/ man/ share/
6 z% A% S) Z6 @; u% C
& ]. j$ P( v+ |# S: a
2.把c:/tmp/usr/bin下的所有文件拷貝(或移動)到c:/cygwin/bin;
u) P+ U7 L" \" a( z8 A8 Q( R
把c:/tmp/usr/lib下的所有文件拷貝(或移動)到c:/cygwin/lib;
/ P! P3 l8 g5 ~5 S& |& c' s3 O
把arm-linux/ include/ info/ libexec/ man/ share/
7 t4 K% o! F' r' L
幾個目錄拷貝(或移動)到c:/cygwin/usr目錄下,拷貝過程中如果詢問是否覆蓋選擇全是.
\$ ?' O3 ~; s# h7 r, i
4 `0 ]) o; g& X i
3.這時候運行arm-linux-gcc就可以編譯arm-linux的執行文件了,該包還帶了一個arm的模擬器
1 H) e' d4 h# v3 d) s
armv5l-linux-run,但是我沒有運行成功.
* f1 b' ?3 l$ K. Z+ m
! M$ ~! U0 b$ | F. V
4.以bash 3.1為例介紹一下arm-linux軟件的編譯過程:
! Z) }' M e# a2 h
1)在
ftp://ftp.gnu.org/pub/gnu/bash
下載bash-3.1.tar.gz.
+ ~& O) g: I8 ]8 P4 z0 B$ ]
2)執行下列命令:
* s6 V8 s% f; }4 L+ a. R. Z0 N
tar xvfz bash-3.1.tar.gz
! a# {& R2 @) Z) L
cd bash-3.1
* D, ?/ V4 m( Q# j6 c
./configure --host=arm-linux (configure要簡單處理一下:刪除行9983到行10042間的內容)
. P: J( E2 z4 r
make
, i! i- g: g* i' O3 a' Y
. z( g2 L# {$ W+ G' ]$ }
3)編譯完成後會生成arm-linux的執行文件bash,運行命令:
# r; w7 d2 n/ F% V
file bash
7 R, {- a( ^6 X& _& b, L+ v
顯示
7 P6 y$ ?- y2 Z! b& B2 i4 w( ~: ~: B
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
. K5 e, g9 j9 c- C
證明編譯成功
- v. V0 Q h4 d2 e: E! Z% Z* |# l
% Z$ k5 w) d1 y* y
4)運行arm-linux-strip bash, 去除不必要的符號信息,可以使編譯好的bash文件大小從3M多減少到600多k.
5 K! }, ]# ]- C: k' @& L7 T: `
' w/ H( g1 P9 `
5)把編譯好的bash上傳到小I上就可以運行了.
' [1 l5 P( G! c
) X, E8 ]& ^& R( F, U9 ]" O
4 i: G- v _- p2 q1 c: B: x' q
進一步的想法:能否用busybox(
http://www.busybox.net/
)來代替小I
) ^9 f& O" ^* o: O
/bin /usr/bin /sbin /usr/sbin目錄中的命令文件,這樣可以節省出幾M的空間?
+ E# v/ M1 _/ q% V6 I- ]: D
: J f! c# i3 T* j+ D2 g: m
; q0 k1 g6 V- P2 T* u! M ^3 r
--------------------------------------------------------------------------------
& c: z0 S. w0 t) d2 M
從電驢上下那個arm-linux-toolchain-cygwin-3.4.3.tar.gz用了幾天以後發現還是有問題,
+ S7 F* g. }# W/ p
雖然能夠正常編譯,編譯出來也能正常運行,但是只要一涉及浮點數有關的處理, 出來的結果
0 M2 |2 u7 o0 z6 m" p6 y
完全是錯誤的,比如我用busybox替換了系統的df,運行的時候結果如下:
0 M! b, z# |: M2 n: W; f" V Q
~#df -h
6 F E# M4 x! F/ M' P1 _: ?
Filesystem Size Used Available Use% Mounted on
1 `& N B4 w- c( D; V% B% z7 a
/dev/tffsa 64424509455.4M 64424509455.4M 0 100% /usr/language
4 n" Z7 I: D8 U3 E: m2 B1 F) t8 x
/dev/roflash2 1786706395552.0k 1786706395552.0k 0 100% /usr/setup
7 d+ d" e' N5 p! z3 k* L
/dev/mtdblock2 21474836485.2M 4294967297.8M 12884901891.4M 34% /ezxlocal
' r( S1 n9 S( T* T/ K
/dev/mmca1 4088808866744.7M 996432412904.4M 3092376453840.3M 24% /mmc/mmca1
9 P7 E, P, m/ V- {
/dev/tffsb1 201863462959.9M 12884901891.8M 188978561068.1M 8% /diska
$ q+ o$ A/ _4 c* U
/dev/loop0 223338299444.3M 223338299444.3M 0 100% /ezxlocal/opie
+ Z- e' G' M7 i4 n8 P8 N, {* q5 h
估計是這個包在編譯的時候沒有加進軟件模擬浮點處理器支持, 而小I本身沒有硬件的浮點處理器.
( ~8 \4 h4 }0 G
沒辦法, 還是只得自己動手編譯了, 後來又查了些資料,做了些實驗, 發現自己動手編譯建立toolchain最簡單的方法如下:
6 |+ ~- D+ d3 a$ F
- v5 W/ O4 p6 L: }! f5 O
第1步.準備工作,下載如下軟件包:
- v, \; [! J4 P) j& m
http://lsb.blogdns.net/ezx-crosstool
下載ezx-crosstool-0.5.tar.bz2
0 ~( M; l* O) n, o) V
# u8 F4 }$ ]. }# |
ftp://ftp.gnu.org/pub/gnu
下載如下包
0 L* o/ s& N/ `, A% z! |/ O
binutils-2.15.tar.bz2 glibc-2.3.2.tar.bz2
. A3 \/ h/ w4 n9 U1 m# m& ~, v
gcc-3.3.6.tar.bz2 glibc-linuxthreads-2.3.2.tar.bz2
3 `7 w( U/ O* g3 U& U$ Q
( O) F0 V: G( I/ D
http://www.kernel.org/pub/linux/kernel/v2.4/
下載
; `" ?8 z* J0 T x N6 C1 h6 V
linux-2.4.26.tar.bz2
& a9 l: p, j/ j$ m; K9 ~& h
1 U/ Z4 @% Z Y/ B, T d
以上幾個包只有第一個是必須的, 後面幾個編譯的時候如果沒有會自動下載,如果你網速夠快的話
" l( U# L! a+ n7 T
就可以先不用下載
. K' j- o3 z4 n; N8 I# H; k
: {# _. z" |' s2 s
第2步.把下載來的ezx-crosstool-0.5.tar.bz2解包:
, G# ?) R* U* X8 O l: q# ~
tar xvfj ezx-crosstool-0.5.tar.bz2
1 E" [4 E0 A+ Q6 V
會生成一個ezx-crosstool-0.5目錄, 然後把預先下載的:
2 F2 E$ d+ [1 K5 u! F, o9 c. m
binutils-2.15.tar.bz2 glibc-2.3.2.tar.bz2 linux-2.4.26.tar.bz2
5 G, p; h% m% Q- x4 {
gcc-3.3.6.tar.bz2 glibc-linuxthreads-2.3.2.tar.bz2
) K3 j1 n; y) _3 h- d" {. a
拷貝到ezx-crosstool-0.5目錄的子目錄下(沒有預先下載則跳過此步).
) F6 w$ C0 K$ a7 m6 u
! H9 E; m6 B5 C% W- C! o+ y
第3步.編輯ezx-crosstool-0.5目錄下的build.sh文件,把第5行:
' N3 [& Y; A, p
RESULT_TOP=$CROSSTOOL_DIR/gcc-arm-iwmmxt
- B2 Y. `+ m8 }" |. B
改成你想要的安裝位置,比如要安裝在/usr/arm就改成:
1 B6 _! ^% [5 Y3 x# u
RESULT_TOP=/usr/arm
, Z. I0 s8 ?$ ?! J5 Z
% u& p' q5 ], P8 Y2 v
第4步.最後一步,也是最費時間的一步:
/ s; F3 D/ W/ U# R# ?
在ezx-crosstool-0.5目錄下運行:
( i5 E, U+ R8 n, e9 T4 W; g( p& N
./build.sh
7 C6 y7 {) s' f/ \0 U2 T( a( d# }& V) s
# I2 O& S3 j9 x6 |$ P
然後就慢慢等吧...
" g4 c* a9 `. w8 ]2 r* z- |4 S8 Q
整個過程在我的機器上大概用了兩個來小時.我的機配是XP2600+ , 1G ram
歡迎光臨 Chip123 科技應用創新平台 (http://chip123.com/)
Powered by Discuz! X3.2