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, 可是運行的時候問題出來了,運行的時候顯示:
9 x8 i! p7 [- S' j4 A
# ./bash
5 }" R$ p. E8 ~% f: y
Illegal instruction
% n |9 h) T6 g7 [) o; M- \
搞了一下午始終沒有找到原因.
! U- V7 ^7 {# D$ q
( v: l4 e& e! G/ {* Y8 k5 \5 p& \
後來在電驢上發現了一個編譯好的包:arm-linux-toolchain-cygwin-3.4.3.tar.gz,有86.4M
0 x: k" N( W5 l V
(該文件可以在eMule裡面搜索/下載)
2 `" a5 l, |. b& O5 }' N
經測試可以正常交叉編譯arm-linux程序,編譯好的程序在小I上也可以正常運行.
6 p) e7 D- T7 ?
2 D. f2 }/ S4 l4 q5 o: G
安裝的步驟如下
假設cygwin安裝在c:/cygwin,下載的包放在c:/tmp)
, a5 q' a" W5 C+ x3 p M2 u# L5 n
1. 在 c:/tmp 下運行:
, M2 J5 \. Z, R
tar xvfz arm-linux-toolchain-cygwin-3.4.3.tar.gz
: V1 l4 X) r) l7 N2 q9 z5 x
然後在tmp下會生成一個目錄usr,下面有如下子目錄:
- I1 n; o8 s- O/ L: \
arm-linux/ bin/ include/ info/ lib/ libexec/ man/ share/
! L1 p- G( Q2 |- ?
& Q" m& N) |1 l- T% I
2.把c:/tmp/usr/bin下的所有文件拷貝(或移動)到c:/cygwin/bin;
2 b9 j2 b& m+ p m; E
把c:/tmp/usr/lib下的所有文件拷貝(或移動)到c:/cygwin/lib;
g$ C$ |! m( B! S* E7 ^
把arm-linux/ include/ info/ libexec/ man/ share/
6 s! A; i. E. P0 U% Q7 A. p. v
幾個目錄拷貝(或移動)到c:/cygwin/usr目錄下,拷貝過程中如果詢問是否覆蓋選擇全是.
" W2 ?7 T6 p C% y4 t
6 `7 p. V8 B7 R1 T/ R! {' N5 |% A
3.這時候運行arm-linux-gcc就可以編譯arm-linux的執行文件了,該包還帶了一個arm的模擬器
& m3 W! v7 _8 ^# O& B) @# Q
armv5l-linux-run,但是我沒有運行成功.
/ C8 G, p7 |5 }% O2 V
. c9 e8 Z) T* T* R, j
4.以bash 3.1為例介紹一下arm-linux軟件的編譯過程:
7 F, Y' U) S2 s! T5 r4 i
1)在
ftp://ftp.gnu.org/pub/gnu/bash
下載bash-3.1.tar.gz.
2 ^/ F+ G- h$ g3 y$ Y" i
2)執行下列命令:
% r2 w4 I3 \1 [+ V: r3 g
tar xvfz bash-3.1.tar.gz
7 ], R( ^2 ?: m/ J1 N- J) A6 N
cd bash-3.1
3 m+ `( h" S/ A0 h9 {0 }
./configure --host=arm-linux (configure要簡單處理一下:刪除行9983到行10042間的內容)
9 n- \, h* U& p# y
make
" |) t( D7 X5 G5 L0 ]$ _
1 R) [( v6 U, p$ Z9 d3 N% x, d
3)編譯完成後會生成arm-linux的執行文件bash,運行命令:
u0 W/ r* O# h6 S. q- n
file bash
2 g- @0 G. C, P1 b2 h1 y6 j
顯示
% Z6 A% R9 q( M) 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
- X+ z0 ]9 z- z4 z5 m6 e
證明編譯成功
# [) }+ q1 c+ h/ r, e+ S
# d- G4 U- j- n
4)運行arm-linux-strip bash, 去除不必要的符號信息,可以使編譯好的bash文件大小從3M多減少到600多k.
# P# z/ x. S6 }" _1 ^) {$ e
8 F3 W- w& j* Y3 z
5)把編譯好的bash上傳到小I上就可以運行了.
0 ]5 Q$ E+ I7 o. ^4 u" z
8 j1 ^3 O2 K# ~
! J- k% I9 T( O" D: Q; l. `
進一步的想法:能否用busybox(
http://www.busybox.net/
)來代替小I
0 {( \# Y- y! m
/bin /usr/bin /sbin /usr/sbin目錄中的命令文件,這樣可以節省出幾M的空間?
) x" o( B7 Y$ s1 r
7 H5 z) e# v, y2 ~$ j7 G2 z) V
2 Z# S- `! t3 C
--------------------------------------------------------------------------------
: ?! U" {# g R$ R
從電驢上下那個arm-linux-toolchain-cygwin-3.4.3.tar.gz用了幾天以後發現還是有問題,
9 X( ]/ T- k" }. x6 @
雖然能夠正常編譯,編譯出來也能正常運行,但是只要一涉及浮點數有關的處理, 出來的結果
2 V* D% C3 J+ n: @& h, T
完全是錯誤的,比如我用busybox替換了系統的df,運行的時候結果如下:
9 y& n {9 r) Z! R! @% s+ [
~#df -h
2 F! Z) G) S3 g! S4 M, x
Filesystem Size Used Available Use% Mounted on
! C- Q0 c# d4 w9 y- }
/dev/tffsa 64424509455.4M 64424509455.4M 0 100% /usr/language
- [" E) q! T& g
/dev/roflash2 1786706395552.0k 1786706395552.0k 0 100% /usr/setup
& }+ \0 x ^/ A8 G- e- C3 Z
/dev/mtdblock2 21474836485.2M 4294967297.8M 12884901891.4M 34% /ezxlocal
4 |. r9 a( }$ f% \8 t# Z
/dev/mmca1 4088808866744.7M 996432412904.4M 3092376453840.3M 24% /mmc/mmca1
. V! M4 \0 b# S0 P3 h- M
/dev/tffsb1 201863462959.9M 12884901891.8M 188978561068.1M 8% /diska
! v! e- W# {0 S! l, K. U
/dev/loop0 223338299444.3M 223338299444.3M 0 100% /ezxlocal/opie
, d* w) a% J2 e q: L8 W
估計是這個包在編譯的時候沒有加進軟件模擬浮點處理器支持, 而小I本身沒有硬件的浮點處理器.
' t8 r: v% l) N( X4 C
沒辦法, 還是只得自己動手編譯了, 後來又查了些資料,做了些實驗, 發現自己動手編譯建立toolchain最簡單的方法如下:
* m$ u5 q. @/ i/ k
2 t" J" Z0 y3 y0 ^6 A* M, i
第1步.準備工作,下載如下軟件包:
+ g' y, s2 O9 z& N& j5 f
http://lsb.blogdns.net/ezx-crosstool
下載ezx-crosstool-0.5.tar.bz2
/ x2 h+ I: M9 G
( e# N+ s( O" A# @: o- O+ ]9 c! Z
ftp://ftp.gnu.org/pub/gnu
下載如下包
3 H+ x% a+ k2 b% Y+ M
binutils-2.15.tar.bz2 glibc-2.3.2.tar.bz2
2 r. i% h P7 w& C% ~3 l2 B
gcc-3.3.6.tar.bz2 glibc-linuxthreads-2.3.2.tar.bz2
# a0 e/ D; h; I- k# f4 }
/ J, y/ Z" ]! Y I: R8 i7 j
http://www.kernel.org/pub/linux/kernel/v2.4/
下載
' E0 B1 `0 P. L; \
linux-2.4.26.tar.bz2
* J+ {+ x0 {) t' n, l' g2 Y
6 s* Z2 k6 D# E; I0 @! H
以上幾個包只有第一個是必須的, 後面幾個編譯的時候如果沒有會自動下載,如果你網速夠快的話
5 V2 d# U9 a& E
就可以先不用下載
f- a* {; t$ Q# }% e) j) Q
. E2 V% T* `8 y1 E4 U
第2步.把下載來的ezx-crosstool-0.5.tar.bz2解包:
2 Q# h6 [; r0 @2 e9 N" u5 o
tar xvfj ezx-crosstool-0.5.tar.bz2
9 @% y; ?; b* S F: D) u
會生成一個ezx-crosstool-0.5目錄, 然後把預先下載的:
3 P" s# X! z* n0 V
binutils-2.15.tar.bz2 glibc-2.3.2.tar.bz2 linux-2.4.26.tar.bz2
2 x3 W7 l( V( N1 D; k* I* Y& \
gcc-3.3.6.tar.bz2 glibc-linuxthreads-2.3.2.tar.bz2
`/ n4 f/ _$ ] ~4 O6 T
拷貝到ezx-crosstool-0.5目錄的子目錄下(沒有預先下載則跳過此步).
2 X& j1 ^5 u' u
* y# _% k, _: C7 z3 E. H
第3步.編輯ezx-crosstool-0.5目錄下的build.sh文件,把第5行:
7 g2 e( B4 Q5 n4 B r7 J* h- {$ y+ d
RESULT_TOP=$CROSSTOOL_DIR/gcc-arm-iwmmxt
; z# z0 i, S, g& T, j
改成你想要的安裝位置,比如要安裝在/usr/arm就改成:
+ K5 w6 D v, y1 [% S
RESULT_TOP=/usr/arm
+ Y4 G8 ]0 R% o; ~5 q' g
: A8 m& ~1 z4 k$ Z0 }% ~. G. d% f
第4步.最後一步,也是最費時間的一步:
9 y! A- ? Z/ H
在ezx-crosstool-0.5目錄下運行:
" _2 [+ K! |& r3 z0 ^ I
./build.sh
% l# |3 z) i. Z
% L! K w8 f0 K+ _1 j( Y
然後就慢慢等吧...
: c; P; h' W `
整個過程在我的機器上大概用了兩個來小時.我的機配是XP2600+ , 1G ram
歡迎光臨 Chip123 科技應用創新平台 (http://www.chip123.com/)
Powered by Discuz! X3.2