本週進行 root filesystem 相關的教育訓練,今天給的課堂練習是 thttpd 的交叉編譯(cross compile)。thttpd 採用標準的 GNU autoconf 來產生 Makefile,因此,交叉編譯 thttpd 的方式是蠻簡單的。配合課堂提供的 cross toolchain(gcc 3.4.1),我們先定義以下有關 cross toolchain 路徑檔檔名的 Makefile 變數:
TOOL_TOP = /opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-9tdmi-linux-gnu CC = $(TOOL_TOP)/bin/arm-9tdmi-linux-gnu-gcc AR = $(TOOL_TOP)/bin/arm-9tdmi-linux-gnu-ar LD = $(TOOL_TOP)/bin/arm-9tdmi-linux-gnu-ld AS = $(TOOL_TOP)/bin/arm-9tdmi-linux-gnu-as STRIP = $(TOOL_TOP)/bin/arm-9tdmi-linux-gnu-strip RANLIB = $(TOOL_TOP)/bin/arm-9tdmi-linux-gnu-ranlib TARGET_ARCH = arm-linux
接著再定義與 thttpd 的 'CFLAGS' 參數:
THTTPD_CFLAGS = -Os -Wall -mtune=arm9tdmi -march=armv4 \ -fomit-frame-pointer -fsigned-char -fPIC
我們希望能有一個比較彈性以及系統化的做法,因此採用 Makefile 的系統來實作,不考慮編寫 script 的方式。接著,再定義一個 target,用來設定 thttpd 的 autoconf:
configured-thttpd: (export CC=$(CC); \ export AR="$(AR)"; \ export AS=$(AS); \ export LD=$(LD); \ export STRIP=$(STRIP); \ export RANLIB=$(RANLIB); \ export CFLAGS="$(THTTPD_CFLAGS)"; \ ./configure \ --prefix=/ \ --host=$(TARGET_ARCH) );
我們想要用 'install' 指令來安裝 thttpd 執行檔到 root filesystem,因此 '--prefix' 參數的定義對我們講並不重要。Makefile 有良好的 dependencies 系統,所以我再撰寫一段 rule 如下:
thttpd: configured-thttpd make
接著,將以上的 Makefile 內容存檔,例如存成 thttpd.cross,再將這個檔案放到 thttpd 原始碼根目錄下,執行 make 並引用 thttpd.cross 的 'thttpd' target:
$ make -f thttpd.cross thttpd
一轉眼,我們得到 thttpd 的執行檔了。再將此 thttpd 執行檔加到 root filesystem 裡即可,別忘了,thttpd 需要幾個 shared library,把他們也加到 root filesystem 裡!還有,thttpd 會去讀取 user database(/etc/passwd 等),所以也要把 NSS 的 files 程式庫(libnss_files.so)加到 root filesystem 裡!
利用 Makefile 系統取代直接敲命令(或編寫 script)的麻煩做法,讓整個過程看起來簡單又清楚!
Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue
您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw