Goahead在ucLinux下的移植

    技术2022-05-11  21

    Goahead是一款适合嵌入式的web Server, 支持asp,cgi,embedded JavaScrip等脚本语言 基本上在windows下或者在redhat9下面只要make一下就能运行了. 在uclinux下面要稍微改动一下代码. 源码改动的地方基本上是 1.把fork改为vfork, 2.把gethostbyname函数替换掉.   改动Goahead自带的makefile使其采用arm-elf-gcc编译并转换应用程序elf格式为flt 就差不多了.   下面是我的移植过程中记录的详细步骤:   首先到  http://www.Goahead.com/webserver/webserver.htm 下Goahead源码包, 看一下web目录下的usr/doc等说明文件。   修改Goahead/LINUX/makefile文件 ================================================================== 1. makefile 中 加了一个 宏:     CFLAGS  = -DWEBS -DUEMF -DOS= "LINUX " -DLINUX $(UMSW) $(DASW) $(SSLSW) $(IFMODSW) -D__NO_PACK     -D__NO_PACK 是我自己加的。     __NO_PACK 屏蔽Goahead编译是产生的#program 警告,不加这个宏也没关系。   2. 修改Goahead/LINUX/Makefile    LDFLAGS  += $(SSLLIB) $(IFMODLIB) -Wl,-elf2flt     -Wl,-elf2flt 与“+” 是自己加的。      CFLAGS 添加 -Wall -O2选项。(优化代码size与速度)    如下:    CFLAGS += -Wall -O2 -DWEBS -DUEMF -DOS= "LINUX " -DLINUX $(UMSW) $(DASW) $(SSLSW) $(IFMODSW) -D__NO_PACK     3. 修改ucLinux下makefile文件,使其支持 add costume vender/user application.    可以略过这一步,直接在Goahead,LINUX目录下make clean;make 然后把webs.exe文件 copy到 romfs目录下。    (在romfs下建立home/web/ 目录)      详见 12.编译过程。      在uclinux下make clean操作会清空romfs目录,所以最好在Goahead的makefile里    加入如下几段(在make romfs时会自动拷贝到/home/web/目录下。)    romfs:     $(ROMFSINST) /home/web/$(NAME)      同时在uclinux/venders/samsung/44b0/makefile里    ROMFS_DIRS = bin dev etc home lib mnt proc usr var home/httpd home/web    home/httpd home/web 是自己添加的。   4. 在 Goahead/LINUX/makefile 开头添加 ##################################################################### CROSS_COMPILE   = arm-elf- 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 ####################################################################   同时把 DEBUG = -g -Wall 改为 DEBUG = -Wall 很明显,这里是修改为gcc为arm-elf-gcc编译,同时去掉debug信息。 或者你可以直接把几个 $(cc) 直接修改为 arm-elf-gcc .     修改Goahead源码部分: ================================================================== 5. uclinux 采用 uClib-c (我得lib是用uClib-c的,用uClibc没有试过)   6. 修改所有arm-elf-gcc 不认识的宏。把这些宏改写成一行就可以了。一般就是因为 "/ " 等.   7. fork 改为 vfork (main.c (LINUX) )   8. webs.c Line 1434 fmtAlloc(&msgbuf, WEBS_MAX_URL + 80,         T( "<html><head></head><body>/r /         T( "This  document has moved to a new <a href=/ "%s/ ">location</a>./r /         T( "Please update your  documents to reflect the new location./r /         T( "</body></html>/r "), url);   arm-elf-gcc似乎不认识 “/”这个符合,只能把fmtAlloc语句写成一行。   9.  uemf.h 文件  LINE 242 去除 timeval的定义,在uclinux下重复定义了。 #if (defined (LINUX) && !defined (_STRUCT_TIMEVAL)) struct timeval {     time_t  tv_sec;     /* Seconds.  */     time_t  tv_usec;    /* Microseconds.  */ }; #define _STRUCT_TIMEVAL 1 #endif   10.  main.c (LINUX) 中 websGetCgiCommName(..)函数中 把pname1 = tempnam(NULL, T( "cgi ")); 改为 pname1 = (char_t*)mkstemp( T( "cgi ")); (估计不改tempnam 也无什么大碍)     11.     main.c(linux) 文件     initwebs(...) 函数中:     /*     if ((hp = gethostbyname(host)) == NULL) {         error(E_L, E_LOG, T( "Can 't get 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.0.128 ");    // 44B0的网卡IP       gethostbyname函数在此处无效,我屏蔽了这段,不得已只能直接写入IP地址给 intaddr了。       在不能调试的情况下,gethostbyname这一段实在是花了我大半的时间。     最要命的是,我的44b0板子里的tftp 死活不工作,没办法只好一边一边的编译内核, 下载到板子上运行查看串口的数据。     不然可以用tftp把webs 通过网络下载到板子运行,就不用编译内核了。   12. 编译过程:       >cd uclinux目录下     >make config;make clean;     >make lib_only;make user_only     >make romfs     >cd 进入Goahead/LINUX目录     >make clean     >make     >cp -i webs.exe /romfs/home/web/webs.exe    ( webs.exe程序编译后大概 80k左 右吧。)     >cd 到uclinux目录下     >make image     >make       13. 要关闭IE的代理。     先ping一下 目标板,看网络通不通,或者在目标板子上ping一下pc机。     IP地址就是 第11步中 指定的IP 。     然后     > cd /home/web/     > ./webs     启动 Goahead。 网页可以放在与webs.exe 同一级的web目录下。 web目录是Goahead源     在Goahead运行中,有网页请求的时候,我的超级终端中会出现如下东东:     “> skput:over: 0c071aa4:272 put:272 dev:eth0<2>kernel BUG at skbuff.c:92!”     不知道什么意思。   14. Goahead/web 下有详细的文档说明。关于 configure 跟install的一定要看。   --badegg 学习笔记  

    最新回复(0)