热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

boa0.94.13移植到uclinuxarms3c4510b的过程

正在移植boa-0.94.13到uclinux上,几点笔记,大家分享。编译一个linux下的c系统,包含词法和语法分析模块,

   正在移植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(¤t_time);
        time_offset = TIMEZONE_OFFSET(t);
    } else {
        t = gmtime(¤t_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 $@ || 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 $@ $(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(¤t_time);
        time_offset = TIMEZONE_OFFSET(t);
    } else {
        t = gmtime(¤t_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 ,我的启动脚本里做了这样工作,我直接不要了,注掉。

  编译以后,再烧到板子上,测试,正常(掌声)。(不正常的还没测出来,哈哈)


推荐阅读
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 数字图书馆近期展出了一批精选的Linux经典著作,这些书籍虽然部分较为陈旧,但依然具有重要的参考价值。如需转载相关内容,请务必注明来源:小文论坛(http://www.xiaowenbbs.com)。 ... [详细]
  • SSL 错误:目标主机名与备用证书主题名称不匹配
    在使用 `git clone` 命令时,常见的 SSL 错误表现为:无法访问指定的 HTTPS 地址(如 `https://ip_or_domain/xxxx.git`),原因是目标主机名与备用证书主题名称不匹配。这通常是因为服务器的 SSL 证书配置不正确或客户端的证书验证设置有问题。建议检查服务器的 SSL 证书配置,确保其包含正确的主机名,并确认客户端的证书信任库已更新。此外,可以通过临时禁用 SSL 验证来排查问题,但请注意这会降低安全性。 ... [详细]
  • Squaretest:自动生成功能测试代码的高效插件
    本文将介绍一款名为Squaretest的高效插件,该工具能够自动生成功能测试代码。使用这款插件的主要原因是公司近期加强了代码质量的管控,对各项目进行了严格的单元测试评估。Squaretest不仅提高了测试代码的生成效率,还显著提升了代码的质量和可靠性。 ... [详细]
  • 求助:在CentOS 5.8系统上安装PECL扩展遇到问题
    在 CentOS 5.8 系统上尝试安装 APC 扩展时遇到了问题,具体表现为 PECL 工具无法正常工作。为了确保顺利安装,需要解决 PECL 的相关依赖和配置问题。建议检查 PHP 和 PECL 的版本兼容性,并确保所有必要的库和开发工具已正确安装。此外,可以尝试手动下载 APC 扩展的源代码并进行编译安装,以绕过 PECL 工具的限制。 ... [详细]
  • 在 Kubernetes 中,Pod 的调度通常由集群的自动调度策略决定,这些策略主要关注资源充足性和负载均衡。然而,在某些场景下,用户可能需要更精细地控制 Pod 的调度行为,例如将特定的服务(如 GitLab)部署到特定节点上,以提高性能或满足特定需求。本文深入解析了 Kubernetes 的亲和性调度机制,并探讨了多种优化策略,帮助用户实现更高效、更灵活的资源管理。 ... [详细]
  • 本文深入解析了 FCEUX 源码,并详细介绍了两种制作 DEB 包的方法及其技术细节。首先,DEB 包通常由两部分组成:控制信息(位于 DEBIAN 目录)和安装内容(模拟目录)。通过解压现有的 DEB 包,可以查看其内部结构,进而理解其工作原理。具体操作包括将安装内容释放到指定目录中,以便进行进一步的修改和定制。此外,文章还探讨了如何修改现有的 DEB 包,以满足特定需求,提供了实用的步骤和技巧。 ... [详细]
  • 深入解析 Vue 中的 Axios 请求库
    本文深入探讨了 Vue 中的 Axios 请求库,详细解析了其核心功能与使用方法。Axios 是一个基于 Promise 的 HTTP 客户端,支持浏览器和 Node.js 环境。文章首先介绍了 Axios 的基本概念,随后通过具体示例展示了如何在 Vue 项目中集成和使用 Axios 进行数据请求。无论你是初学者还是有经验的开发者,本文都能为你解决 Vue.js 相关问题提供有价值的参考。 ... [详细]
  • 在 Windows 10 环境中,通过配置 Visual Studio Code (VSCode) 实现基于 Windows Subsystem for Linux (WSL) 的 C++ 开发,并启用智能代码提示功能。具体步骤包括安装 VSCode 及其相关插件,如 CCIntelliSense、TabNine 和 BracketPairColorizer,确保在 WSL 中顺利进行开发工作。此外,还详细介绍了如何在 Windows 10 中启用和配置 WSL,以实现无缝的跨平台开发体验。 ... [详细]
  • C#微信开发入门教程第二篇:新手快速上手指南,含详细视频讲解
    在距离上次课程一个多星期后,我们终于带来了第二讲的内容。虽然原计划是一周一次更新,但由于工作繁忙有所延迟。近期在交流群中发现,一些初学者已经能够熟练调用微信接口,但对微信公众平台的消息接收处理机制还不够了解。因此,本次课程将详细介绍如何高效处理微信公众平台的消息接收,并提供详细的视频讲解,帮助大家快速上手。 ... [详细]
  • 在CentOS上部署和配置FreeSWITCH
    在CentOS系统上部署和配置FreeSWITCH的过程涉及多个步骤。本文详细介绍了从源代码安装FreeSWITCH的方法,包括必要的依赖项安装、编译和配置过程。此外,还提供了常见的配置选项和故障排除技巧,帮助用户顺利完成部署并确保系统的稳定运行。 ... [详细]
  • 如何将PHP文件上传至服务器及正确配置服务器地址 ... [详细]
author-avatar
夏至_krisyeol_582
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有