2008年11月25日 星期二

製作 sha1c.so on arm

本來是想 build vfs1.3 與 Mk4tcl 在 arm 上,讓 arm 可以直接 source critcl2.kit ,但無奈功力不足 ...

先是成功 build vfs1.3,但 tclsh critcl2.kit 時依舊有錯誤訊息,查了一下才發現它在 package require Mk4tcl 時出錯了。後來嘗試 build Mk4tcl ,還真是困難重重,編譯成功了,但卻無法 package require Mk4tcl 進來 ...

再來我就換個方向,換編譯 vqtcl ,原先 tclsh critcl2.kit 時,可以在 source code 裡面看到若是 Mk4tcl 有錯,就換 package require vfs::mkcl ,而 vqtcl 這個套件就內涵 vfs::mkcl,而這次比較順利,直接就編譯過去了,本想說終於可以在 arm 上玩 kit 檔案,卻還是出現這樣的錯誤訊息 ...

couldn't read file "/home/root/critcl2.kit/main.tcl": Success
while executing
"source /home/root/critcl2.kit/main.tcl"
("uplevel" body line 1)
invoked from within
"uplevel [list source [file join $self main.tcl]]"


看起來應該是 vqtcl 處理的不夠完整,無法直接 source .kit 內的檔案 ...

看來要在 arm 上玩 .kit 檔案要擇日再研究了!




回到正題,雖然無法在 arm 上把玩 kit 檔案,但依舊是可以用一些偷吃步的方法 ...!

必須要先有相關環境

在這邊下載 - sdx.bat、sdx.kit 兩個檔案
http://www.equi4.com/pub/sk/

在這邊下載 - Tclkitsh (for windows) (有些防毒軟體會認為它是病毒,但其實只是雙重副檔名造成誤判,因此只要記得下載時把副檔名 exe 拿掉即可)
http://www.equi4.com/pub/tk/downloads.html
此執行檔下載回來之後,記得更名為 tclkitsh.exe (配合 sdx.bat)


環境都有之後
先在 windows 底下,下達這樣的指令
sdx unwrap critcl2.kit


這時候就會出現 critcl2.vfs 的資料夾

裡面我們會用到的有

critcl2.vfs/lib/critcl/ -> 將其複製到 arm 上的 /usr/lib/tcl8.4 底下
critcl2.vfs/lib/platform/ -> 將其複製到 arm 上的 /usr/lib/tcl8.4 底下
critcl2.vfs/lib/app-critcl/critcl.tcl -> 複製到 arm 上任意資料夾,此為主要執行檔案
critcl2.vfs/lib/app-critcl/runtime.tcl -> 與上述檔案放在同一個資料夾內
(以上兩隻程式我是放在 /home/root/critcl4arm/ 底下)

到了這個階段,可以試試看執行 tclsh /home/root/critcl4arm/critcl.tcl ,應該會跳出 help 資訊。

有了以上環境,有了 gcc ,就可以開始編譯 .so 檔了!

sha1c 的 source code 在 tcllib 裡面有。
http://sourceforge.net/projects/tcllib/

抓下 tcllib-1.11.tar.gz 之後,tcllib-1.11\modules\sha1\ 裡面存放著許多檔案,但我們需要用到的只有 sha1c.tcl、sha1.c、sha1.h 這三個檔案,將這三個檔案放置在同一個資料夾,並進入此資料夾內下達這樣的指令

tclsh /home/root/critcl4arm/critcl.tcl -pkg sha1c.tcl


等待數秒,就可以看到此資料夾底下出現一個 lib/ ,而裡面所放的 sha1c/ 資料夾就是 sha1c 的 .so 套件了!將其移動到 /usr/lib/tcl8.4/ 裡,接下來就可以享受在 arm 上用 c 來演算 sha1 的神速了!

Tcl - sha1::sha1 -bin [string repeat a 500000]
約 20 秒

C - sha1::sha1 -bin [string repeat a 500000]
約 0.17 秒

沒有留言: