本文內容概要:詳細描述了移植goAhead 2.5到S5PV210的linux系統的過程、步驟、遇到的問題及其解決方法。
開發環境:
宿 主 機:window 8;
虛 擬 機:ubuntu12.04;
交叉編譯器:arm-Linux-gcc
———————————————————————————————————————————————————————————————————
1. GoAhead Web服務器介紹
goAhead Web服務器,小巧、精緻,提供了值得稱道的性能,特別適合於嵌入式系統,因此,在很多嵌入式產品如路由器中都用到了goAhead作爲嵌入式web服務器。
goAhead Web服務器,具有如下特點:
- 支持ASP;
- 嵌入式的JavaScript,即Ejscript;
- 支持內存中的CGI處理;
- 快速響應,每秒中可處理超過65個請求;
- 符合HTTP1.0/HTTP1.1標準;
- 擁有衆多擴展API,方便用戶開發;
- 支持SSL3.0(Secure Sockets Layer),如MatrixSSL(最新版本爲:MatrixSSL 3-2);
- 支持用戶羣組管理;
- 支持DAA訪問認證;
- 佔用很小內存,如果不包含SSL,僅要求60K內存;包含SSL,要求500K內存;
- Web頁面可存在於ROM或文件系統中;
- 支持多種操作系統,如linux、wince、vxworks等等;
當前最新版本爲:WebServer 2.5,本次移植即是這個版本。
2. 獲取Goahead源碼包
地址爲:goAhead源碼包,當前最新版本爲:WebServer 2.5
下載後,解壓壓縮包:
#tar -xzvf webs-2-5.tar.gz
#cd webs-2-5/
3. goAhead源碼結構
進入goAhead的源碼目錄webs-2-5/,很容易瞭解其源碼結構。
webs-2-5/
| 各種OS移植子目錄,分別有:CE、ECOS、LINUX、LYNX、MACOSX、NW、QNX4、VXWORKS、WIN
| utils:當前只有webcomp.c,即網頁編譯器
| www:存放web網頁
| wwwdemo:goAhead帶的demo網頁,裏面包含了goAhead的一些文檔
| goAhead服務器源程序文件(C程序文件)
得到源碼後,建議用source insight等工具建一個goAhead工程,便於代碼的閱讀或者查詢API函數等。
4. goAhead自帶幫助文檔
進入goAhead的wwwdemo目錄,找到Webs25GettingStarted.pdf文件,這就是goAhead帶的幫助文檔,移植前,建議先看下。
5. GoAhead Web服務器移植到arm-linux步驟
在獲取源碼包並解壓後,現在把goAhead移植到arm-linux中,arm指S5PV210,linux-2.6.30.4。
移植步驟很簡單,基本上在編譯階段不會出現什麼問題,而且這幾個步驟在網上諸多博客中都有說明。但在測試服務器的時候,遇到了問題,在瀏覽器死活都打不開網頁,不過,最終還是解決了,請看下面說明。
5.1 修改Makefile文件
進入goAhead源碼下的LINUX目錄,用 VI 打開Makefile文件。
Makefile文件默認是虛擬機的本身的GCC編譯器,因此,指定其交叉編譯器,注意,交叉編譯器的版本應與你的文件系統用的交叉編譯器一致。
在Makefile文件開頭添加如下信息:
- CROSS_COMPILE =/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-
- AS = $(CROSS_COMPILE)as
- LD = $(CROSS_COMPILE)ld
- CC = $(CROSS_COMPILE)gcc
- CPP = $(CC) -E
- AR = $(CROSS_COMPILE)ar
- NM = $(CROSS_COMPILE)nm
- STRIP = $(CROSS_COMPILE)strip
- OBJCOPY = $(CROSS_COMPILE)objcopy
- OBJDUMP = $(CROSS_COMPILE)objdump
同時把Makefile中的語句:
- matrixsslDir:=$(shell ls -d ../matrixssl-3-1*/)
屏蔽掉。這一句是用來啓動SSL matrixssl的,具體參考Webs25GettingStarted.pdf文檔中的說明(Page8)。
5.2 編譯:make clean;make
在shell中進入LINUX目錄下,執行命令make clean;make即可編譯通過。
編譯通過後,在LINUX目錄下,得到兩文件,分別爲:libwebs.a和webs可執行文件。用如下命令查看webs執行文件依賴的庫文件:
- /usr/local/arm-uclibc/bin/arm-uclibc-readelf -d webs
其中,arm-uclibc-依你用的交叉編譯器而定。
得到如下信息:
- Dynamic segment at offset 0xf638 contains 18 entries:
- Tag Type Name/Value
- 0x00000001 (NEEDED) Shared library: [libfloat.so.1]
- 0x00000001 (NEEDED) Shared library: [libc.so.0]
- 0x0000000c (INIT) 0x8e2c
- 0x0000000d (FINI) 0x15aa0
- 0x00000004 (HASH) 0x8130
- 0x00000005 (STRTAB) 0x8924
- 0x00000006 (SYMTAB) 0x83a4
- 0x0000000a (STRSZ) 712 (bytes)
- 0x0000000b (SYMENT) 16 (bytes)
- 0x00000015 (DEBUG) 0x0
- 0x00000003 (PLTGOT) 0x1f704
- 0x00000002 (PLTRELSZ) 552 (bytes)
- 0x00000014 (PLTREL) REL
- 0x00000017 (JMPREL) 0x8c04
- 0x00000011 (REL) 0x8bec
- 0x00000012 (RELSZ) 24 (bytes)
- 0x00000013 (RELENT) 8 (bytes)
- 0x00000000 (NULL) 0x0
從上面可看到,webs依賴libc.so.0和libfloat.so.1兩動態文件,查看文件系統中lib目錄下是否包含了這兩動態文件,如果沒有,則需從交叉編譯器安裝路徑中獲取這兩個動態庫文件到文件系統lib目錄中。
5.3 測試webs服務器
用FTP把webs執行文件傳到目標板中,本人把其放到了/mnt/webs/目錄中。
需要注意的是,在goAhead2.5版本中,web網頁的根目錄是在webs程序的../www或../wwwdemo(webs執行時帶-demo參數)中,這一點可查看LINUX/main.c文件中190行處代碼和註釋。因此,把goAhead源碼目錄下的www和wwwdemo兩文件夾傳用FTP傳到/mnt/目錄下。
在PC機用IE瀏覽器瀏覽goAhead服務器的網頁,輸入http://localhost:8080/
localhost是目標板的IP地址即goAhead服務器的地址,8080是goAhead用的端口號,這是默認的端口號,定義在webs.h文件。
5.4.1 測試問題
用瀏覽器死活不管怎樣,都打不開home.htm網頁的,提示是404錯誤,意思是:
Access Error: Site or Page Not Found
Cannot open URL
5.4.2 不能打開網頁的原因和解決方法
折騰許久,決定從源代碼着手。最後定位在default.c文件中websDefaultHandler()函數中,這個函數是處理默認網頁的。
具體代碼段如下:
- /*
- * We do whitelist validation in addition to standard URL validation.
- * The whitelist should really catch anything invalid first.
- * If the whitelist check fails, rebuild the list and try again.
- * Also validate if we are not on a secure connection, but the whitelist
- * entry has the SSL flag set, do not serve the page.
- */
- #ifdef WEBS_WHITELIST_SUPPORT
- if ((rc = websWhitelistCheck(wp->url)) < 0) {
- websBuildWhitelist();
- if ((rc = websWhitelistCheck(wp->url)) < 0) {
- websError(wp, 404, T("Cannot open URL"));
- return 1;
- }
- }
- if (!(flags & WEBS_SECURE) && (rc & WHITELIST_SSL)) {
- websError(wp, 500, T("HTTPS access required"));
- return 1;
- }
- #endif /* WEBS_WHITELIST_SUPPORT */
問題就出現在上面這個代碼中,我的理解是goAhead關於網頁安全方面功能,即網頁白名單(WHITELIST)功能支持。
把宏WEBS_WHITELIST_SUPPORT關閉,重新編譯,再測試,OK了,可以打開網頁了。
上述只是簡單的移植測試,然我們最終的目的是要把goAhead移植到我們的應用程序中的,在大多數的應用中,它也只是應用程序中的一個模塊,因此,後面的工作量還是蠻多的,包括SSL的移植等等。