歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Goahead移植到uClinux平台上

Goahead移植到uClinux平台上

日期:2017/2/28 16:25:11   编辑:Linux教程

之前在系統中用的是boa webserver ,但是在頻繁提交多次後,boa會出現request.c 99錯誤並刷屏,造成系統無法正常工作,於是采用了goahead webserver,這個也是適用於嵌入式的服務器,同樣支持CGI,下面是移植過程,以及出錯糾正。

我的平台是:主機Windows XP,帶有虛擬機上的Ubuntu,

首先從goahead官網上下載到goahead webs218,這個版本相對穩定。解壓縮。

我是直接把goahead的可執行文件編譯到zImage中,所以首先在uclinux-dist/user下創建goahead文件夾,把剛才解壓出來的文件夾WS031202復制到goahead下,然後修改uclinux-dist/user下kconfig和Makefile文件,在kconfig下添加:

config USER_GOAHEAD
bool "go_ahead"
default y
help
just go_ahead

上面USER_GOAHEAD要和Makefile中的CONFIG_USER_GOAHEAD保持一致。www.linuxidc.com兩個go_ahead可以自由編寫,default y意思是在編譯內核時用make就可以直接編譯進去zImage,這樣就省去了make menuconfig時選取的過程。

在Makefile中添加:

dir_$(CONFIG_USER_GOAHEAD) += goahead/LINUX

因為goahead適用於多平台,所以包含有用於多個平台的編譯文件和makefile、main.c,因此我們要用的是Linux文件夾下的Makefile,而不是上層的,同時在user/Makefile指定編譯路徑可以包含多層文件,所以添加的是上面的內容。

然後再uclinux-dist/user/goahead下修改部分文件:

【1】Linux下的main.c

(1)修改

initwebs(...) 函數中:
/*
if ((hp = gethostbyname(host)) == NULL) {
error(E_L, E_LOG, T("Can'tget host address"));
fprintf(stderr,"initWebs: host name %s\r
",host);
return -1;
}
memcpy((char *) &intaddr, (char *) hp->h_addr_list[0],
(size_t) hp->h_length);
*/
intaddr.s_addr = inet_addr("192.168.1.100"); // 板子IP

gethostbyname函數在此處無效,如果不修改則會出現的問題是:板子啟動完成後,可執行文件webs剛打開,ps下就沒有webs的pid,這是因為IP不生效,webs出錯所以打不開。

(2)fork改成vfork

因為uclinux不支持fork,只支持vfork,所以必須改掉。

(3)修改跟目錄

把static char_t *rootWeb = T("web");改成static char_t *rootWeb = T("/home/httpd");

如果有需要可以改變首文件home.asp成需要的網頁文件。

(4)不能修改tempnam

如下。好多地方說要修改這個,但是這個僅適用Linux而不是uclinux

不要把pname1 = tempnam(NULL, T("cgi"));//原來的

改成pname1 = (char_t*)mkstemp( T("cgi"));

這個改了後打開CGI就特別遲緩,而且webs占用CPU達到百分之九十多。

【2】misc.c中

屏蔽以下:

//static int strnlen(char_t *s, unsigned int n);


//static int strnlen(char_t *s, unsigned int n)
//{
// unsigned int len;

// len = gstrlen(s);
// return min(len, n);
//}

如果不屏蔽。。。。


【3】Makefile中

加上:
CC=nios2-linux-uclibc-gcc -elf2flt
AR = nios2-linux-uclibc-ar
LD = nios2-linux-uclibc-ld
OBJCOPY = nios2-linux-uclibc-objcopy


加上:
romfs:
$(ROMFSINST) /bin/$(NAME)

修改最後一行:

$(CC) -c -o $@ $(DEBUG) $(CFLAGS) $(IFLAGS) $<

下面的

CFLAGS = -DWEBS -DUEMF -DOS="LINUX" -DLINUX -Dfork=vfork -D__uClinux__ $(UMSW) $(DASW) $(SSLSW) $(IFMODSW)
LDFLAGS = $(SSLLI $(IFMODLI -elf2flt="-s 16000" -Wl,-v -Wl,-d
$(CFLAGS) $(IFLAGS) \中去掉$(IFLAGS)
修改不修改並沒有影響。

【4】

如果自己在../romf/home下創建文件夾web,而不是配置指定,就會出現問題:

jffs2 compression type not available

因為這個文件根本不識別。

【5】如果在沒有修改前就在Linux文件夾下make過,然後接著修改,改完後再次make時,則會出現以下問題:

main.o: Relocations in generic ELF (EM: 3)
main.o: could not read symbols: File in wrong format

這是因為編譯器不一致造成的,這樣問題只要make clean後,再次make即可。

Copyright © Linux教程網 All Rights Reserved