本文内容概要:详细描述了移植goAhead 2.5到S3C2440的linux系统的过程、步骤、遇到的问题及其解决方法。
开发环境:
宿 主 机:window XP;
虚 拟 机:ubuntu9.10;
交叉编译器:arm-uclibc-gcc(arm-linux-gcc-4.3.2可以顺利编译通过)
———————————————————————————————————————————————————————————————————
1. GoAhead Web服务器介绍
goAhead Web服务器,小巧、精致,提供了值得称道的性能,特别适合于嵌入式系统,因此,在很多嵌入式产品如路由器中都用到了goAhead作为嵌入式web服务器。
goAhead Web服务器,具有如下特点:
- 支持ASP;
- 嵌入式的JavaScript,即Ejscript;
- 支持内存中的CGI处理;
- 快速响应,每秒中可处理超过65个请求;
- 符合HTTP1.0/HTTP1.1标准;
- 拥有众多扩展API,方便用户开发;
- 支持SSL3.0(Secure Sockets Layer),如MatrixSSL(最新版本为:MatrixSSL 3-2);
- 支持用户群组管理;
- 支持DAA访问认证;
- 占用很小内存,如果不包含SSL,仅要求60K内存;包含SSL,要求500K内存;
- Web页面可存在于ROM或文件系统中;
- 支持多种操作系统,如linux、wince、vxworks等等;
当前最新版本为:WebServer 2.5,本次移植即是这个版本。
2. 获取Goahead源码包
地址为:http://www.goahead.com/products/webserver/Download.aspx,当前最新版本为:WebServer 2.5
注:当前下载源码包,需要填写一些个人资料才能下载。
下载后,解压压缩包:
#tar -xzvf webs-2-5.tar.gz
#cd webs-2-5/
3. goAhead源码结构
进入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函数等。
4. goAhead自带帮助文档
进入goAhead的wwwdemo目录,找到Webs25GettingStarted.pdf文件,这就是goAhead带的帮助文档,移植前,建议先看下。
5. GoAhead Web服务器移植到arm-linux步骤
在获取源码包并解压后,现在把goAhead移植到arm-linux中,arm指S3C2440,linux-2.6.30.4。
移植步骤很简单,基本上在编译阶段不会出现什么问题,而且这几个步骤在网上诸多博客中都有说明。但在测试服务器的时候,遇到了问题,在浏览器死活都打不开网页,不过,最终还是解决了,请看下面说明。
5.1 修改Makefile文件
进入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)。
5.2 修改LINUX/main.c文件:initWebs()函数中指定IP地址
由于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
5.3 编译:make clean;make
在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目录中。
5.4 测试webs服务器
用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文件。
5.4.1 测试问题
用浏览器死活不管怎样,都打不开home.htm网页的,提示是404错误,意思是:
Access Error: Site or Page Not Found
Cannot open URL
5.4.2 不能打开网页的原因和解决方法
折腾许久,决定从源代码着手。最后定位在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的移植等等。
6. 参考资料
- http://www.docin.com/p-67202641.html
- http://www.cnitblog.com/zouzheng/archive/2008/01/04/38464.html
- http://www.dzjs.net/html/qianrushixitong/2009/0812/3890.html
- http://blog.csdn.net/zyboy2000/article/details/6191266
- http://www.bianceng.cn/webkf/aspx/201103/25071.htm
- http://blog.chinaunix.net/space.php?uid=22982394&do=blog&id=116136