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: yIllegal 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.4M0 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 |% A3.這時候運行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 i1)在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 gtar xvfz bash-3.1.tar.gz7 ], R( ^2 ?: m/ J1 N- J) A6 N
cd bash-3.13 m+ `( h" S/ A0 h9 {0 }
./configure --host=arm-linux (configure要簡單處理一下:刪除行9983到行10042間的內容)
9 n- \, h* U& p# ymake
" |) t( D7 X5 G5 L0 ]$ _
1 R) [( v6 U, p$ Z9 d3 N% x, d3)編譯完成後會生成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- n4)運行arm-linux-strip bash, 去除不必要的符號信息,可以使編譯好的bash文件大小從3M多減少到600多k.
# P# z/ x. S6 }" _1 ^) {$ e8 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/)來代替小I0 {( \# 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 -h2 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! Zftp://ftp.gnu.org/pub/gnu 下載如下包
3 H+ x% a+ k2 b% Y+ Mbinutils-2.15.tar.bz2 glibc-2.3.2.tar.bz22 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 otar xvfj ezx-crosstool-0.5.tar.bz29 @% 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 [% SRESULT_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