1. 程式人生 > >boa-0.94.13移植到uclinux arm s3c4510b的過程

boa-0.94.13移植到uclinux arm s3c4510b的過程

   正在移植boa-0.94.13到uclinux上,幾點筆記,大家分享。

   編譯一個linux下的c系統,包含詞法和語法分析模組,Linux上用bison和flex。
yacc是一個文法分析器的生成器,bison即是yacc的GNU版本.Lex和YACC是用於構造詞法分析機和語法直譯器的工具,利用Lex和YACC你可以輕鬆的構造一個語法直譯器。


1. 解壓boa-0.94.13.tar.gz,進入boa-0.94.13/src目錄
2. ./configure,回車,生成Makefile
一開始make
錯誤1:
debian:/home/a/boa-0.94.13/src# make
yacc -d boa_grammar.y
make: yacc: Command not found
make: *** [y.tab.c] Error 127
 
解決方法:
debian:/home/a/boa-0.94.13/src# apt-get install bison

錯誤2:
debian:/home/a/boa-0.94.13/src# make
lex boa_lexer.l
make: lex: Command not found
make: *** [lex.yy.c] Error 127

解決方法:
debian:/home/a/boa-0.94.13/src# apt-get install flex
 
錯誤3:
debian:/home/a/sss/boa-0.94.13/src# make
gcc -g -O2 -pipe -Wall -I. -c -o util.o util.c
util.c:100:1: error: pasting “t” and “->” does not give a valid preprocessing token
make: *** [util.o] Error 1
解決方法:
修改 src/compat.h
找到
#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
修改成
#define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff

然後
debian:/home/a/sss/boa-0.94.13/src# make clean
debian:/home/a/sss/boa-0.94.13/src# make


不過還有一個警告:

request.c: In funtion ‘get_request’:

request.c:84:warning: pointer targets in passing argument 3 of ‘accept’ differ in signedness

看著不爽,沒關係

到request.c中的84行看看。

int accept(int socket, struct sockaddr *address, size_t *address_len) 原型。這裡的引數型別不對。把int改為size_t 就可以了。

debian:/home/a/sss/boa-0.94.13/src# make
基本就沒有問題了。
不過在執行boa的時候,能執行,ps沒有這個程序

解決:

登出掉

if (setuid(0) != -1) {

  DIE(”icky Linux kernel bug!”);

  }

就可了,重新編譯。這樣生成的boa在pc機上測試沒有問題

———————————————————————-

這是網友在論壇上分享的,我剛開始測試還沒有遇到過…. 希望對大家有用

(2)修改 src/log.c

  註釋掉

  if (dup2(error_log, STDERR_FILENO) == -1) {

  DIE(“unable to dup2 the error log”);

  }

  為:

  否則會出現錯誤:

  log.c:73 unable to dup2 the error log:bad file descriptor

  (3)修改src/boa.c

  註釋掉下面兩句話:

  if (passwdbuf == NULL) {

  DIE(”getpwuid”);

  }

  if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {

  DIE(”initgroups”);

  }

  為

  #if 0

  if (passwdbuf == NULL) {

  DIE(”getpwuid”);

  }

  if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {

  DIE(”initgroups”);

  }

  #endif

  否則會出現錯誤:boa.c:211 – getpwuid: No such file or directory

—————————————————————————–

交叉編譯器,uclinux需要使用arm-elf-gcc編譯工具,(核心2.4)

二、用arm-elf-gcc交叉編譯了

1. vim Makefile,修改編譯器,如下:
  當然需要確認已經安裝了arm-elf工具(sh arm-elf-tools-20030314.sh)
  CC = arm-elf-gcc -elf2flt
  CPP =arm-elf-gcc -E
  儲存退出
2. make
  出現如下錯誤
  util.c: In function `get_commonlog_time’:
  util.c:100: structure has no member named `tm_gmtoff’
  首先會想到的是檢視util.c:100附近的程式碼,
  if (use_localtime) {
        t = localtime(&current_time);
        time_offset = TIMEZONE_OFFSET(t);
    } else {
        t = gmtime(&current_time);
        time_offset = 0;
    }
  並看不出有什麼問題。
  使用Source Insight工具查詢TIMEZONE_OFFSET,找到compat.h
  #ifdef HAVE_TM_GMTOFF
  #define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff 
  #else
  #define TIMEZONE_OFFSET(foo) timezone
  #endif

  還是這個地方,依照去掉##
3. 儲存退出,make
  錯誤和上面一樣
4. 嘗試別的辦法,將util.c:100處的程式碼遮蔽,儲存退出
  make
  編譯成功
  但是這樣很可能照成boa使用過程中的錯誤

 (這裡我只是猜測,但是編譯都沒有使用tm_gmtoff,錯誤很可能發生)
5. 最終解決辦法
  可以思考一下,當使用arm-linux-gcc編譯boa時,基本都能正常編譯成功,
  而使用arm-elf-gcc編譯boa則會出現錯誤,那最可能有問題的地方,必然是
  交叉編譯工具的問題,本人使用的是arm-elf-tools-20030314.sh
  找到arm-elf安裝目錄:  /usr/local/arm-elf/
  利用source Insight工具可以搜尋“tm_gmtoff”,找到/usr/local/arm-elf/include/time.h
  vim time.h
  將time.h:130的條件編譯程式碼修改為“#if 1”
  儲存退出。
  進入boa-0.94.13/src目錄,建議make clean一下
  make
  編譯成功(掌聲)

  (注:這只是編譯成功了。沒有測試)

三、移植到uclinux中,替換的原來的boa資料夾,最主要的就是修改makefile檔案,boa主目錄裡放一個Makefile, src裡面那個Makefile.in 不要動,src裡面那個Makefile刪掉,自己寫個Makefile放裡面,下面是我的Makefile(千萬不要再用configure生產Makefile檔案了,這樣通不過uclinux的編譯)

—————————————————

Makefile(boa主目錄裡的)

.EXPORT_ALL_VARIABLES:

DIRS = src

all romfs:
 for i in $(DIRS) ; do make -C $$i [email protected] || exit $?; done

clean:
 for i in $(DIRS) ; do make -C $$i clean ; done

—————————————————–

Makefile(src裡的)

EXEC = boa
OBJS = alias.o boa.o buffer.o cgi.o cgi_header.o config.o escape.o get.o \
    hash.o ip.o log.o mmap_cache.o pipe.o queue.o read.o request.o \
    response.o select.o signals.o timestamp.o util.o sublog.o y.tab.o\
    lex.yy.o

FLTFLAGS += -s 8192

EXTRALIBS = $(LIBCRYPT)

ifdef CONFIG_USER_BOA_WITH_SSL
CFLAGS += $(INCSSL) -DSERVER_SSL=1
EXTRALIBS += $(LIBSSL) $(LIBCRYPTO)
endif

N style=”COLOR: #000000″>ifdef CONFIG_USER_TINYLOGIN_SHADOWPASSWDS
CFLAGS += -DSHADOW_AUTH
endif
ifdef CONFIG_USER_OLD_PASSWORDS
CFLAGS += -DOLD_CONFIG_PASSWORDS
endif

all: $(EXEC)

$(EXEC): $(OBJS)
 $(CC) $(LDFLAGS) -o [email protected] $(OBJS) $(EXTRALIBS) $(LDLIBS) -lcrypt_old

romfs:
 $(ROMFSINST) /bin/$(EXEC)

clean:
 -rm -f $(EXEC) *.gdb *.elf *.o

———————————————————-

完畢之後,編譯,就會出現沒有移植時的那個錯誤,

出現如下錯誤
  util.c: In function `get_commonlog_time’:
  util.c:100: structure has no member named `tm_gmtoff’
該改的都改了,這個問題真難了我了,

 1、再次嘗試,將util.c:100處的程式碼遮蔽,儲存退出
  make user_only
  編譯通過(掌聲)(這樣可能會出項想不到問題)

  為了徹底解決這個問題,不讓有什麼後遺症,我把原始碼看了一遍,發現util.c: 100

     if (use_localtime) {
        t = localtime(&current_time);
        time_offset = TIMEZONE_OFFSET(t);
    } else {
        t = gmtime(&current_time);
        time_offset = 0;
    }

 這個變數use_localtime沒什麼用處,就這一個地方使用,boa.conf裡這麼介紹

 #是否使用本地時間。如果沒有註釋掉,則使用本地時間。註釋掉則使用UTC 時間
 #UseLocaltime

 一般是把它注掉的,所以, time_offset = TIMEZONE_OFFSET(t);我就直接注掉了,理論上是沒有問題。

 2、編譯是通過了,可是問題又來了,編譯好的uimage.rom 燒到板子上,發現boa死了,沒有執行起來,看了下啟動資訊,啟動了了呀,怎麼就死了呢?

  在板子上手動啟動boa

  # boa &

  出現錯誤

  Fork:pars………(不好意思,這裡的錯誤沒有記住)

 (我把fork改成vfork了啊,怎麼還會出這樣的錯誤),找半天,終於找到出錯的地方boa.c: 138,

   
    if (do_fork) {
        switch(fork()) {
        case -1:
           
            perror(“fork”);   //就只這裡了
            exit(1);
            break;
        case 0:
           
            break;
        default:
           
            exit(0);
            break;
        }
    }

我發現這個段落無非是background ourself ,我的啟動腳本里做了這樣工作,我直接不要了,注掉。

  編譯以後,再燒到板子上,測試,正常(掌聲)。(不正常的還沒測出來,哈哈)

相關推薦

boa-0.94.13 移植ARM

<!-- /* Font Definitions */ @font-face {font-family:宋體; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134;

boa-0.94.13移植uclinux arm s3c4510b過程

   正在移植boa-0.94.13到uclinux上,幾點筆記,大家分享。    編譯一個linux下的c系統,包含詞法和語法分析模組,Linux上用bison和flex。 yacc是一個文法分析器的生成器,bison即是yacc的GNU版本.Lex和YACC是用於構

opencv2.0移植ARM

opencv2.0移植到arm 背景 最近做實驗需要將opencv移植到arm平臺。剛開始也是一頭霧水啊。之前學的opencv都是opencv2.4.7以後的。再寫測試程式的時候也遇到了一些問題。後面會寫到。但是最後終究是移植成功了的。

protues 8.0下安裝gcc for arm編譯器

cor 8.0 安裝gcc cnblogs com arm 編譯器 blog 程序 點擊如下菜單: 下載完後,直接安裝,安裝完成後,如下: 這樣,就可以直接編譯cortex-m3的程序了 protues 8.0下安裝gcc for arm編譯器

luvcview-0.2.4移植

微軟雅黑 -shared local ble fix efi soft win proto 1.luvcview運行依賴SDL多媒體庫,下載SDL源碼包,交叉編譯SDLtar –xzvf SDL-1.2.14.tar.gzcd SDL-1.2.14vi build

《net-snmp5.7.3移植arm-linux平臺》

b2c bash oca 創建 tran ros base embed mic net-snmp5.7.3移植到arm-linux平臺 本次交叉編譯在ubuntu 15.04 64位系統下進行。 準備工作 在編譯移植前有幾項準備工作需要完成。 1下載net-snmp 5.

Hbase-0.94.27 install on Ubuntu

1 Basic Prerequisites 1.1 jdk 安裝配置看Hadoop配置 1.2 Hadoop 1.0.1/Hadoop 1.2.1 一個不相容就換另外一個版本 在啟動./start-hbase.sh前先啟動Hadoop服務 2  安裝 2.1 H

qt5.2交叉編譯移植arm(s5pv210)

1、下載qt-everywhere-opensource-src-5.2.0.tar.xz原始碼,連結:http://download.qt.io/archive/qt/5.2/5.2.0/single/ 2、解壓tar xJf tar xJf qt-everywhere-openso

python移植arm的單板

python移植到arm的單板 2017年09月22日 09:05:55 mania_yan 閱讀數:3068 注:下文的CSU是我們一個嵌入式單板的名稱。 1 前言 作者的話: 本人非常喜歡python,一直夢想可以移植到CSU中。但是python誕生之初並沒有想到要

法甲-卡瓦尼戴帽內馬爾傳射 巴黎4-0摩納哥13連勝

11月29日訊息,@北京商報從度小滿金融人士處獲悉,百度正式拿到准許經營證券期貨的許可證。據許可證顯示,機構名稱為北京百度百盈科技有限公司(下稱“百度百盈”),證券期貨業務經營範圍為基金銷售。而今年8月22日,根據北京證監局官網顯示,證監局已核准百度百盈證券投資基金銷售業務資格。 企查查資訊顯示,百度百盈成

springboot 2.0 教程-13-mybatis增強mybatis-plus

閱讀原文:https://blog.bywind.cn/articles/2018/11/28/1543373589258.html 視訊教程:https://www.bilibili.com/video/av35595465 課程原始碼:https://github.com/ibywind/s

The required dependency 'apt (>= 1.0.1ubuntu2.13)' is not installed

使用Ubuntu系統的時候,系統提示升級,從14.04升級到16.04時,提示“The required dependency ‘apt (>= 1.0.1ubuntu2.13)’ is not installed”,該提示指的是沒有安裝所需的依賴。 apt版本太低了,應該滿足>

Mysql 8.013章 SQL語句的語法 (第2節)

文章目錄 13.2 資料操作語句(DML) 13.2.1 CALL語法 13.2.2 DELETE語法 13.2.2.1 單表語法 13.2.2.2 多表語法 13.2.2.3 相關介紹

Taro 1.2.0 beta 13 釋出,多端統一開發框架

   Taro 1.2.0 beta 13 釋出了,Taro 是一套遵循 React 語法規範的多端統一開發框架,支援用 React 的方式編寫一次程式碼,生成能執行在微信小程式/百度智慧小程式/支付寶小程式、H5 與 React Native 等端的應用。 更新內容如下: B

轉發:Iperf3移植ARM Linux及使用教程(已在ZedBoard上實現)

iperf是一個基於Client/Server的網路效能測試工具,可以測試TCP、UDP和SCTP頻寬質量,能夠提供網路吞吐率資訊,以及震動、丟包率,最大段和最大傳輸單元大小等統計資訊,幫助我們測試網路效能,定位網路瓶頸。其中抖動和丟包率適應於UDP測試,二頻寬測試適應於

libnl移植ARM Linux

libnl簡介   libnl是為了方便應用程式使用netlink介面而開發的一個庫。這個庫為原始netlink訊息傳遞以及不同的netlink family專用介面提供了一個統一的介面。libnl2.0的API與libnl1.0的API並不相容。如果您的應用

HBase 0.94.3的HRegion名字

2013-01-10 周海漢 2013.1.10 HBase 可以通過Region server的60030埠看到各區域的資訊。 Region Name Start Key End Key Metrics -RO

Busybox移植ARM Linux教程

BusyBox 是一個集成了一百多個常用Linux命令和工具的應用程式。它不僅包含了一些簡單的命令,如 cat 、echo和ls等,而且還包含了一些更大、更復雜的工具,例如 grep、find、mount 以及 telnet等。簡單地說,BusyBox就好像是個大工具箱,集成了許多Linux常用的工

將lrzsz工具移植ARM開發板 ---只通過串列埠實現window和ARM板之間檔案互傳

事情背景:由於需要在windows和ARM板之間只通過串列埠傳輸檔案(windows的檔案只通過串列埠傳輸到ARM板上) 這時超級終端SecureCRT+lrzsz工具可以完成這項使命!(其他終端軟體

lrzsz串列埠工具移植ARM開發板

lrzsz是一個Unix通訊包,提供XMODEM、YMODEM和ZMODEM檔案傳輸協議。lrzsz以前是Omen科技的主打軟體,現在已經免費,並且遵循GNU開源協議。 lrzsz適合這樣一種開發環境,一塊板子,除了串列埠,沒有任何外部出入輸出裝置,沒有sd卡,沒有網線,這個時候如