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保持一致。两个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即可。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/25514.html