编译boa过程记录

boa是比较老的HTTP的本地Server,本文是针对0.94.13版本的编译过程做出记录


1.下载boa的程序包,本文的编译是针对misp平台的交叉编译


2.在编译之前,需要针对产品的文件系统和修改编译时可能遇到的错误,修改相关的文件。

(1)src/boa.c  注释掉可引起编译错误的语句

line209开始注释如下语句

#if 0
        passwdbuf = getpwuid(server_uid);
        if (passwdbuf == NULL) {
            DIE("getpwuid");
        }
        if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {
            DIE("initgroups");
        }
#endif


line 227开始,注释如下语句

#if 0
        if (setuid(0) != -1) {
            DIE("icky Linux kernel bug!");
        }
#endif


(2)src/compat.h   line120

修改前  #define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff

修改后  #define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff


(3)src/log.c   line 72开始注释如下语句

        /*if (dup2(error_log, STDERR_FILENO) == -1) {
            DIE("unable to dup2 the error log");
        }*/


(4)src/config.c   line255

该处打开的是boa的配置文件,可以根据自己的文件系统修改该配置文件位置,如:

yyin = fopen("/system/boa.conf", "r");

line 289 该目录需要与上述的boa.conf配置文件的目录一致

        tempdir = "/system";


(5)src/defines.h  line30

该目录信息,是boa的应用所处于的位置

#define SERVER_ROOT "/usr/boa"


3.编译注意事项:

(1)直接按照交叉编译,传递参数给configure,会出现如下错误:

configure: error: can not run test program while cross compiling

解决方案如下:

在当前PC下,只执行./configure而不传递任何的参数

注:此时生成的Makefile中,CC环境变量还是gcc,需要制定为你使用的交叉编译链中的gcc。如:

CC = /home/xuxuequan/Ingenicwork/toolchain/mips-gcc472-glibc216-32bit/bin/mips-linux-gnu-gcc 

CPP环境变量修改为交叉编译链中的cpp,如:

CPP = /home/xuxuequan/Ingenicwork/toolchain/mips-gcc472-glibc216-32bit/bin/mips-linux-gnu-cpp


然后运行make进行编译,得到的可执行程序为boa,将调试信息剥去,得到的最后程序只有约73KB大小。

/home/xuxuequan/Ingenicwork/toolchain/mips-gcc472-glibc216-32bit/bin/mips-linux-gnu-strip boa


(2)配置boa.conf

在boa的源码包中提供了一个boa.conf的初始样例,可以基于这个文件进行修改。其中几个关键的参数如下:

Port 80   ---------boa服务器所在端口信息

DocumentRoot /system/www  -----HTML文档的主目录

ScriptAlias /cgi-bin/ /system/www/cgi-bin/  -----指明CGI脚本的虚拟路径对应的实际路径


4.编译hello.cgi

红色部分是共享资源对应的目录

int main(void)
{
char *data;
char name[30] = {0};
char tr_name[50] = {0};
        printf("Content-type: text/html\n\n");
        printf("<html>\n");
        printf("<head><title>CGI Output</title></head>\n");
        printf("<body>\n");
data=getenv("QUERY_STRING");
if(data != NULL){
sscanf(data,"name=%s",name);
        sscanf(name,"%[^&]",name);//正则表达式,遇到&就结束
memset(tr_name,'\0',50);
sprintf(tr_name,"/system/www/SDPath/%s",name);
read_dir(tr_name);
}else{
memset(tr_name,'\0',50);
sprintf(tr_name,"/system/www/SDPath");
read_dir(tr_name);
}
        printf("<body>\n");
        printf("</html>\n");
        exit(0);
}


5.拷贝文件

(1)拷贝boa、boa.conf、mime.types到/usr/boa目录中

(2)拷贝hello.cgi到 /usr/www/cgi-bin目录中


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383444.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

/dev/null 21 的作用

shell中可能经常能看到&#xff1a;>/dev/null 2>&1命令的结果可以通过%>的形式来定义输出/dev/null 代表空设备文件> 代表重定向到哪里&#xff0c;例如&#xff1a;echo "123" > /home/123.txt1 表示stdout标准输出&#xff0c;系统默认值是1&a…

移植wpa_supplicant 2.2问题

1.编译libnl1.1问题 In file included from addr.c:28:0: ../include/netlink-local.h: In function __str2type: ../include/netlink-local.h:218:11: error: ULONG_MAX undeclared (first use in this function) ../include/netlink-local.h:218:11: note: each undeclared …

wpa_supplicant与wpa_cli之间通信过程

wpa_supplicant编译&#xff1a; 1. wpa_supplicant/Android.mk : -- wpa_cli -- wpa_supplicant -- libwpa_client.so 2. hostapd/Android.mk : -- hostapd_cli -- hostapd 从通信层次上划分&#xff0c;wpa_supplicant提供向上的控制接口 control interface&#xff0c;用于与…

Linux内核驱动之GPIO子系统(一)GPIO的使用

一 概述 Linux内核中gpio是最简单&#xff0c;最常用的资源(和 interrupt ,dma,timer一样)驱动程序&#xff0c;应用程序都能够通过相应的接口使用gpio&#xff0c;gpio使用0&#xff5e;MAX_INT之间的整数标识&#xff0c;不能使用负数,gpio与硬件体系密切相关的,不过linux有一…

gpio_direction_output 与 gpio_set_value

gpio_set_value&#xff08;port_num,0/1&#xff09; 一般只是在这个GPIO口的寄存器上写上某个值&#xff0c;至于这个端口是否设置为输出&#xff0c;它就管不了&#xff01; 而gpio_direction_output &#xff08;port_num,0/1)&#xff0c;在某个GPIO口写上某个值之后&…

内核ko模块strip使用

编译一个内核时&#xff0c;习惯性的在install目标下加了命令&#xff1a; $(STRIP) --strip-all --remove-section.note --remove-section.comment test.ko 结果在insmod test.ko时出现错误&#xff1a; test: module has no symbols (stripped?) .................. 上…

ubuntu下修复U盘只读问题

1.通过mount指令查看u盘挂载的实际设备 /dev/sdb1 on /media/xuxuequan/0BEB-331A type vfat (rw,nosuid,nodev,uid1000,gid1000,shortnamemixed,dmask0077,utf81,showexec,flush,uhelperudisks2) 2.umount挂载点 umount /media/xuxuequan/0BEB-331A 3.fsck修复u盘设备 s…

mkfs.jffs2参数详解

实例&#xff1a;mkfs.jffs2 -r rootfs -o rootfs.jffs2 -e 0x4000 --pad0x1000000 -s 0x200 -n mkfs.jffs2: Usage: mkfs.jffs2 [OPTIONS] Make a JFFS2 file system image from an existing directory tree Options: -p, --pad[SIZE] 用16進制來表示所要輸出檔案的大小&…

关于c语言字符串函数和一些内存函数的的简介

关于c语言字符串函数和一些内存函数的的简介 求字符串长度的函数 strlen函数介绍![在这里插入图片描述](https://img-blog.csdnimg.cn/20190301142458376.jpg)注模拟实现 . [1 ]计数器方式 因为strlen 是求字符串长度的函数&#xff0c;所以不能改变字符串本身&#xff0c;所…

君正T20平台生成jffs2格式rootfs

基于系统升级的考虑&#xff0c;这两天在君正T20平台上折腾如何生成jffs2 格式的rootfs。详细的过程如下&#xff1a; 1.修改uboot中的分区参数&#xff1a; 修改为rootfs格式为jffs2的&#xff0c;且适当扩大rootfs分区大小。&#xff08;因jffs2的压缩比不如只读的squashfs…

用结构体写一个简单的通讯录

一个简单的通讯录 通讯录应该具备简单的一些功能 1 增添联系人 2 删除联系人 3 查找联系人 4 修改联系人 5 按名字给联系人排序 6 查看通讯录 除此之外&#xff0c;应该在实现上还应该具备一些其他的功能函数 比如 初始化通讯录 这些都是功能函数&#xff0c;而整个函数入口应…

jffs2 启动的常见的问题

Q&#xff1a;在启动过程中出现at91sam user.warn kernel: Empty flash at 0x00f0fffc ends at 0x00f10000问题 A&#xff1a;在mkfs.jffs2的时候&#xff0c;加上-e 0x20000指定擦除块的大小。-e是指定擦除块的大小&#xff0c;我们使用的nandflash的块大小为128K字节&#xf…

c动态内存管理

动态内存管理 我们之前要开辟内存用的方法都是定义变量&#xff0c;比如 但是上述开辟内存的方法有两个特点 1空间开辟大小是固定的 2数组在申明的时候&#xff0c;必须指定数组的长度&#xff0c;它所需要的内存在编译时分配 malloc和free c中提供一个动态内存开辟函数 这…

JFFS2文件系统挂载过程优化的分析报告

一 问题描述 在上电启动优化中发现Linux系统下挂载JFFS2文件系统耗时较长&#xff0c;以128M的NOR FLASH为例&#xff0c;用时接近20秒。后续单板的FLASH容量为256M&#xff0c;时间会更长。如此长的挂载时间&#xff0c;会大增加系统的上电启动时间。希望能对mount功能或JFFS…

右移函数(字符串,数组)

右移函数 以上是数组右移&#xff0c;将int换成char 把数组内容改成字符串就行。

关于jffs2文件系统如何掉电保护

JFFS2 是将节点信息保存在内存中 Flash上日志型文件系统的资料&#xff0c;了解到传统的基于闪存转换层&#xff08;FLT&#xff09;的文件系统存在的主要问题&#xff1a; 1. 效率低。因为每次都要把要修改的数据所在擦写块放入内存&#xff0c;产生了许多不必要的读操作&…

c中指针简介

c中指针简介 首先我们来看一下指针的一些基本概念 ![在这里插入图片描述](https://img 而对于指针的应用&#xff0c;平常有一些形式&#xff0c;总结了一下大概有这几种用法 对于以上的几种用法&#xff0c;我依次给出详尽的解释 //这是一个普通的整型变量 1 //首先从P 处开…

判断一个字符串是否另一个字符串的右移后的

首先我们把需要判断的字符串传进来&#xff0c;开辟一块大小为两个字符串的长度总和加1的动态的空间&#xff0c;然后后字符串拷贝函数将一个字符串拷贝到开辟空降中&#xff0c;再将这个字符串再次连接到这块动态的空间中&#xff0c;等于就是将一个字符串拷贝了两遍。然后比较…

登陆后保持环境变量导出

在嵌入式开发中&#xff0c;要保证在系统登录后&#xff0c;导出的环境变量依然有效&#xff0c;需要修改如下文件&#xff1a; /etc/profile export PATH/bin:/sbin:/usr/bin:/usr/sbin export PATH/system/bin:$PATH export LD_LIBRARY_PATH/system/lib export LD_LIBRARY_P…

fasync驱动异步通知机制

fasync简介 编辑异步通知fasync应用于系统调用signal和sigaction函数&#xff0c;简单的说&#xff0c;signal函数就是让一个信号与与一个函数对应&#xff0c;每当接收到这个信号就会调用相应的函数。[1]那么什么是异步通知&#xff1f;异步通知类似于中断的机制&#xff0c;当…