感谢支持
我们一直在努力

Goahead移植到uClinux平台上

之前在系统中用的是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即可。

赞(0) 打赏
转载请注明出处:服务器评测 » Goahead移植到uClinux平台上
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏