編譯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.pswp.cn/news/383444.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383444.shtml
英文地址,請注明出處:http://en.pswp.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;當…