之前在系统中用的是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保持一致。两个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即可。