作者:reille
本博客网址:http://blog.csdn.net/reille/,转载请注明出处。
本文内容概要:详细描述了移植goAhead 2.5到S3C2440的linux系统的过程、步骤、遇到的问题及其解决方法。
开发环境:
宿 主 机:window XP;
虚 拟 机:ubuntu9.10;
交叉编译器:arm-uclibc-gcc(arm-linux-gcc-4.3.2可以顺利编译通过)
注:移植好的源代码下载地址:移植好的goAhead源码包下载地址
———————————————————————————————————————————————————————————————————
goAhead Web服务器,小巧、精致,提供了值得称道的性能,特别适合于嵌入式系统,因此,在很多嵌入式产品如路由器中都用到了goAhead作为嵌入式web服务器。
goAhead Web服务器,具有如下特点:
当前最新版本为:WebServer 2.5,本次移植即是这个版本。
地址为:goAhead源码包,当前最新版本为:WebServer 2.5
下载后,解压压缩包:
#tar -xzvf webs-2-5.tar.gz
#cd webs-2-5/
进入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程序文件)
从上面可以看到,goAhead支持window系统的,有兴趣的可以在PC机上移植试试。
得到源码后,建议用source insight等工具建一个goAhead工程,便于代码的阅读或者查询API函数等。
进入goAhead的wwwdemo目录,找到Webs25GettingStarted.pdf文件,这就是goAhead带的帮助文档,移植前,建议先看下。
在获取源码包并解压后,现在把goAhead移植到arm-linux中,arm指S3C2440,linux-2.6.30.4。
移植步骤很简单,基本上在编译阶段不会出现什么问题,而且这几个步骤在网上诸多博客中都有说明。但在测试服务器的时候,遇到了问题,在浏览器死活都打不开网页,不过,最终还是解决了,请看下面说明。
进入goAhead源码下的LINUX目录,用UE打开Makefile文件。
Makefile文件默认是虚拟机的本身的GCC编译器,因此,指定其交叉编译器,注意,交叉编译器的版本应与你的文件系统用的交叉编译器一致。
在Makefile文件开头添加如下信息:
CROSS_COMPILE =/usr/local/arm-uclibc/bin/arm-uclibc-
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)。
由于LINUX/main.c文件:initWebs()函数中原程序无法正确获得服务器IP;因此置服务器一个静态IP地址。
修改如下:
/*
* Define the local Ip address, host name, default home page and the
* root web directory.
*/
/* del by gyr 2011.09.17
if (gethostname(host, sizeof(host)) < 0) {
error(E_L, E_LOG, T("Can't get hostname"));
printf("initWebs::Can't get hostname.\n"); // added by gyr 2011.09.17
return -1;
}
if ((hp = gethostbyname(host)) == NULL) {
error(E_L, E_LOG, T("Can't get host address"));
printf("initWebs::Can't get hostname...\n"); // added by gyr 2011.09.17
return -1;
}
memcpy((char *) &intaddr, (char *) hp->h_addr_list[0],
(size_t) hp->h_length);
*/
intaddr.s_addr = inet_addr(T("192.168.1.168")); // added by gyr 2011.09.17
在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目录中。
用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://192.168.1.168:8080/
192.168.1.168是目标板的IP地址即goAhead服务器的地址,8080是goAhead用的端口号,这是默认的端口号,定义在webs.h文件。
用浏览器死活不管怎样,都打不开home.htm网页的,提示是404错误,意思是:
Access Error: Site or Page Not Found
Cannot open URL
折腾许久,决定从源代码着手。最后定位在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的移植等等。