http://blog.sina.com.cn/s/blog_605b4e400100mn51.html
boa-0.94.13移植到uclinux arm s3c4510b的过程
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,修改编译器,如下:
2. make
3. 保存退出,make
4. 尝试别的办法,将util.c:100处的代码屏蔽,保存退出
5. 最终解决办法
三、移植到uclinux中,替换的原来的boa文件夹,最主要的就是修改makefile文件,boa主目录里放一个Makefile, src里面那个Makefile.in 不要动,src里面那个Makefile删掉,自己写个Makefile放里面,下面是我的Makefile(千万不要再用configure生产Makefile文件了,这样通不过uclinux的编译)
---------------------------------------------------
Makefile(boa主目录里的)
.EXPORT_ALL_VARIABLES:
DIRS = src
all romfs:
clean:
-----------------------------------------------------
Makefile(src里的)
EXEC = boa
OBJS = alias.o boa.o buffer.o cgi.o cgi_header.o config.o escape.o get.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)
romfs:
clean:
----------------------------------------------------------
完毕之后,编译,就会出现没有移植时的那个错误,
出现如下错误
该改的都改了,这个问题真难了我了,
我发现这个段落无非是background ourself ,我的启动脚本里做了这样工作,我直接不要了,注掉。