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

2023-11-05

   正在移植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 $@ || 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(&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 ,我的启动脚本里做了这样工作,我直接不要了,注掉。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

boa-0.94.13移植到uclinux arm s3c4510b的过程 的相关文章

  • STM32+ESP8266+MQTT连接阿里云(1)

    ESP8266连接阿里云的流程 发送 目的是让ESP8266退出透传 AT RESTORE 让模块恢复出厂设置 AT 判断模块的好坏及工作状态 正常就会回复OK ATE0 关闭回显 这个没什么好说的 AT CWMODE CUR 1 设置为s
  • STM32与Python上位机通过USB虚拟串口通信

    文章目录 前言 1 查看原理图 2 新建工程 3 添加代码与烧录 4 python代码编写 总结 问题解决思路 前言 在详细阅读广大网友的教程之后 我对STM32和Python通过USB通信的流程烂熟于心 尝试用ST公司的NUCLEO L4
  • 基于DS18B20和HS1101的仓库自动报警系统

    基于DS18B20和HS1101的仓库自动报警系统 背景介绍 效果展示 完整版的项目代码 仿真文件 下面是项目原理图 具体管脚定义如下图 18B20温度原理 HS1101湿度传感器 红外测距报警模块我用到的是GP2D12 通过数模转化器AD
  • FPGA硬件工程师Verilog面试题(基础篇二)

    作者简介 大家好我是 嵌入式基地 是一名嵌入式工程师 希望一起努力 一起进步 个人主页 嵌入式基地 系列专栏 FPGA Verilog 习题专栏 微信公众号 嵌入式基地 FPGA硬件工程师Verilog面试题 二 习题一 多功能数据处理器
  • 【AD20】快速且只选中部分自己想要的同类型的元件

    在project属性框里面 可以选择所有如下图所示内容 这个是一个过滤器 里面有多种小选项 比如 Components 元件 Pads 焊盘 Texts 文本 选择哪个就只能选择对应的部分 比如 只选择文本 在画图区域 框选 发现只有文本才
  • AD采样出来的数值与实际值之间的关系

    当刚接触AD采样时 一直对于AD采集出来的数值与实际的值之间的关系有些模糊 现在闲暇下来打算记录一下 这里以采集量为电压量来记录 当采集温度 电流等模拟量时 都是通过一个电路把模拟量转化为一个电压量输入进AD采样引脚 就不一一叙述 AD采样
  • 树莓派体验3 - SSH登录树莓派

    如果没有HDMI转接线 显示器 USB转TTL串口线 那么可以通过网络SSH远程登录的方式访问树莓派 无显示器使用SSH访问 开启SSH服务 首先 通过镜像版本号确认一下SSH是否默认开启 树莓派官网的release note中说明 201
  • 嵌入式杂谈之中断向量表

    虽说接触了好久的单片机或者说嵌入式开发 不过对于有些概念还是比较模糊 因此此系列将会从一些零碎的小知识点出发 慢慢的遍历整张嵌入式开发的地图 这次先来看一下中断向量表 至于为什么会提到中断向量表 主要是因为我自己在学习嵌入式Linux开发的
  • STM32笔记:使用SysTick测量程序的运行时间

    本实验用来测量延时函数 如下 的运行时间 void Delay IO u32 nCount for nCount 0 nCount SysTick c include SysTick h IO u32 TimingDelay 0 void
  • verilog奇数分频器的问题讲解(7分频为例)

    先不多哔哔 直接上代码 verilogHDL 代码的后面讲原理 module fenpin3 clk clk7 rst input clk rst 设置rst的目的是当rst 1的时候给cnt0和cnt1赋初值 output clk7 re
  • MSP430嵌入式接口编程(惯性测量单元温湿度双音多频磁力计LCD显示等)

    Energia IDE编程MSP430 GPIO 串口通讯 定时中断 添加库 嵌入式器件接口编程 加速度计 include
  • 下载 arm-linux-gcc

    https releases linaro org components toolchain binaries latest 4 arm linux gnueabihf 如果你使用的是ubuntu系统 你可以使用apt方式来安装arm li
  • HMI智能串口屏——在STM32开发板上的实战应用及其详解

    HMI智能串口屏 在STM32开发板上的实战应用及其详解 一 HMI智能串口屏使用步骤 二 附录 一 HMI智能串口屏使用步骤 安装USART HMI软件 一般买的串口屏里面 商家送的资料里面都有改该软件 打开软件 并点击左上角的 新建 选
  • [Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL s...

    Err 1064 You have an error in your SQL syntax check the manual that corresponds to your MySQL server version for the rig
  • 毕业设计 STM32人体红外测温枪温度采集系统 - 单片机

    文章目录 1 前言 2 主要器件 3 实现效果 4 设计原理 MLX90614 红外温度传感器 5 部分实现代码 6 最后 1 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求
  • 物联锁项目失败原因分析

    一 背景 2022年3月份接手IM024物联锁项目救火 此项目主要用于医院共享轮椅 共享病床 此项目是从2021年初开始立项开发 投入了大量的人力物力 但是在2022年3月份时产品工作仍然不稳定 此项目基本上可以判定为一个失败的典型 为了吸
  • Oracle块损坏处理(MOS)

    处理 Oracle 块损坏 文档 ID 1526911 1 适用于 Oracle Database Enterprise Edition 版本 7 0 16 0 到 11 2 0 2 0 发行版 7 0 到 11 2 本文档所含信息适用于所
  • 32位的Ubuntu16.04安装QT5.8,并编译实现window环境下的代码

    开始 这是本人的第一篇博客 自己经常在网上找问题的解决方法 发现有些问题很难找到合适的解决方法 所以自己也写写 希望能帮助到大家 有错的地方大家指出 安装环境 linux环境 Ubuntu16 04 32位系统 使用apt get命令进行安
  • Java的引用类型有几种?区别是什么?

    nbsp Java的引用类型有几种 区别是什么 在开始前我有一些资料 是我根据自己从业十年经验 熬夜搞了几个通宵 精心整理了一份 Java的资料从专业入门到高级教程 工具包 点个关注 全部无偿共享给大家 在评论区回复 888 之后私信回复
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n

随机推荐

  • Pyhton考单词程序_考单词工具

    说明 首先我们需要一个单词表的文本文档像这样 只要单词中没有空格就行 然后运行程序 选择单词表文件 开始考单词 正确会提示Right 错误提示Wrong 一秒钟后清屏 代码 main py from module opfile import
  • [1049]since it exceeds Excel‘s limit of 65,530 URLS per worksheet

    文章目录 since it exceeds Excel s limit of 65 530 URLS per worksheet pandas 写入excel 转换Url链接的两种方法 since it exceeds Excel s li
  • el-table 动态表格 + 动态合并多列单元格方法

    动态合并单元格 之前有篇文章写了 el table 通过 span method 方法实现合并单元格的方法 但是当时只写了合并第一列的 就有小伙伴询问 如果多列合并怎么办 刚好最近有个项目遇到了动态表格并且要合并多列单元格 在详细的记录一下
  • Ubuntu17.04禁用访客模式/忽略终端大小写

    在ubuntu17 04中禁用访客模式 只需一条命令就可以了 sudo sh c printf SeatDefaults nallow guest false n gt etc lightdm lightdm conf d 50 no gu
  • python matplotlib 画图参数简要说明

    文章目录 import matplotlib pyplot as plt 用来正常显示中文 否则中文是一堆方框 plt rcParams font sans serif SimHei 用来正常显示负号 plt rcParams axes u
  • 设计循环队列

    前言 队列中有一种特殊的存在 环形队列 其有一定的价值与意义 这篇文章主要由一道与其相关的例题来引出相关的知识内容 注 下述解题过程是用C语言实现 目录 一 题目简述 二 环形队列的简单介绍 三 环形队列的实现 1 数组实现 1 过程分析
  • java动态扩展_java栈内存动态扩展要怎么理解?要如何实现?

    小伙伴们知道如何在java栈中内存动态扩展吗 这是虚拟机中的一个概念 下面让我们一起来看看该如何实现吧 一 内存概念 在java中 我们一般会简单把java内存区域划为两种 堆内存与栈内存 其实这种划分是比较粗粒度的 其中栈内存就是指的是虚
  • 浅析C语言结构体及位段

    数据经常以组的形式存在 例如 学校需要了解每位学生的姓名 学号和成绩等 如果这些值储存在一起 访问起来会更加简单 但如果类型不同 就无法存储于同一个数组中 所以在C语言中可以使用结构把不同类型的值存储在一起 先来看看百度百科对结构体的定义
  • 数组小和问题

    描述 在一个数组中 每一个数左边比当前数小的数累加起来 叫做这个数组的小和 求一个数组的小和 例子 1 3 4 2 5 1左边比1小的数 没有 3左边比3小的数 1 4左边比4小的数 1 3 2左边比2小的数 1 5左边比5小的数 1 3
  • 【云原生之Docker实战】使用Docker部署Ferry开源工单系统

    云原生之Docker实战 使用Docker部署Ferry开源工单系统 一 Ferry介绍 1 Ferry简介 2 Ferry特点 3 Ferry系统功能 二 检查本地系统环境 1 检查docker版本 2 检查docker状态 3 检查do
  • thymeleaf 常量_thymeleaf全局常量定义

    微服务现在最流行的莫过于springboot 官方推荐两种模板语言 freemarker和thymeleaf 本文只介绍thymeleaf中如何定义全局常量 百度一搜thymeleaf的全局常量定义 都是让把常量写在 message 文件中
  • std::ifstream vShaderfile & vShaderfile.ifstream.exceptions(std::ifstream::badbit)

    一 利用 fstream ifstream类打开文件 string stringstream类读入流 写入string类 二 try catch 检测异常 1 Retrieve the vertex fragment source code
  • 与Power PMAC通讯

    与PMAC通讯 Power PMAC通讯 通用Internet协议套件概述 Power PMAC 网络协议套件的使用 启动Power PMAC SSH Telnet通讯 IDE通信与Power PMAC FTP访问Power PMAC 修改
  • 代码加密和反编译

    代码加密和反编译 概述 通过 NET编译的项目得到的dll文件 由于要翻译为虚拟机可以执行的中间语言IL 这种语言规则性比较强 很容易通过各种反编译软件翻译成源码 所以当部署到实际项目中就需要进行一些加密 公司的项目是 NET CORE框架
  • 谈谈自己对链表的理解

    先说一个大概念 物理结构区分数据结构 分为顺序存储 链式存储 逻辑上区分就是集合 线性 树形 图形 1 什么是链表 它是有数据域和和指针域组成 那么什么是数据域 就是存储数据的区域 那么什么是指针域 指针域其实就是指针 用来标记此数据的相邻
  • SaaSBase:最受欢迎的协同办公软件有哪些(上篇)

    在海量的协同办公软件中 企业该如何选择呢 不用担心 SaaSBase saasbase cn 来帮您 根据 SaaSBase saasbase cn 的数据统计 有较多的协同办公软件受到企业的欢迎 故小编将它们拆分为两篇为您揭晓 先看今天第
  • HTTPS 客户端与服务端的交互过程

    一 客户端向服务端发起 HTTPS 请求 请求中包含了请求头 请求主体等信息 1 这一步就是 tcp 的三次握手 二 服务端接收到请求后 发送数字证书给客户端 以便客户端验证服务端身份 1 这一步是 SSL TLS 协议的握手过程 其目的是
  • 关于mysql的mycat中间件安装配置与python使用mycat例子

    关于mysql的mycat中间件安装配置与python使用mycat例子 MyCAT是mysql中间件 Mycat数据库分库分表中间件国内最活跃的 性能最好的开源数据库中间件 它是一款开源的Mysql企业级集群应用 前身是阿里大名鼎鼎的Co
  • thrust STL 及 cub 官方测试用例的编译 build

    cub项目github网址 GitHub NVIDIA cub Cooperative primitives for CUDA C 1 构建 thrust Clone Thrust and CUB from Github CUB is lo
  • boa-0.94.13移植到uclinux arm s3c4510b的过程

    正在移植boa 0 94 13到uclinux上 几点笔记 大家分享 编译一个linux下的c系统 包含词法和语法分析模块 Linux上用bison和flex yacc是一个文法分析器的生成器 bison即是yacc的GNU版本 Lex和Y