Goahead在ucLinux下的移植

來源:互聯網
上載者:User
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 學習筆記

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.