NGINX 交叉编译 arm32

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。

源码指引:github源码指引_初级代码游戏的博客-CSDN博客


nginx其实并未考虑在小型设备上运行,官网所提供的安装包并不包含任何32位系统的,configure也并未设计用来使用交叉编译工具链,不过经过一些修改还是可以的。

目录

一、下载源码

二、交叉编译工具链

三、configure

修改auto/feature

修改auto/cc/name

修改auto/types/size

四、make

修改源代码


一、下载源码

官网下载,我下的是当前的最新版nginx-1.27.2.tar.gz。

源码直接在ubuntu上解压缩或者windows上解压缩再ftp上传。

二、交叉编译工具链

我用的是arm官网提供的工具链,这个工具链解压缩之后是个目录,为了使用工具链需要设置环境变量:

bash 复制代码
export PATH=~/arm-gnu-toolchain-13.3.rel1-x86_64-arm-none-linux-gnueabihf/bin:$PATH

工具链的所有工具都带有"arm-none-linux-gnueabihf-"前缀。

会用这个工具链的话看一眼就明白了。

用别的交叉编译工具链应该差不多,整个用到的就是C编译器一个而已(ld用的是哪个?)。

三、configure

configure并非配置为交叉编译的,首先要把CC替换掉:

bash 复制代码
export CC=arm-none-linux-gnueabihf-gcc

也就是替换成交叉编译的编译器。如果是先解压后上传,需要修改configure的属性。

然后执行configure:

bash 复制代码
NGX_PLATFORM=linux;./configure

前面指定了一下平台,没有的话会识别当前平台,当前平台是linux x64,其实我估计差不多,看configure里面主要是区分win和unix/linux。

执行会报很多错,很多检查不能通过,一个原因是脚本不是面向交叉编译的,根据系统类型使用原来的编译器的名字,而不是刚才定义的CC,另一个原因是用编译一个小程序的方法来检查int是4字节还是8字节(也就区分是32位还是64位),而交叉编译出来的程序是无法运行的,所以就报错。

解决方案比较粗暴:直接修改。该用CC的地方改成CC,判断int长度的地方跳过检查直接返回结果。

修改auto/feature

直接跳过了检查。

修改auto/cc/name

注意前面增加的echo是没什么意义的,只有最后两行改$CC有意义。

修改auto/types/size

几乎删光了,就留下返回结果的两句就行了。

这两个问题解决了之后还会提示两个依赖的东西没有,可以通过参数跳过,所以最终的命令是这样的:

bash 复制代码
NGX_PLATFORM=linux;./configure --prefix=$HOME/nginx-install-arm32 --without-http_rewrite_module --without-http_gzip_module

也用参数指定了安装路径,方便最后打包交付。

最后看到这样的就是通过了:

bash 复制代码
Configuration summary
  + PCRE library is not used
  + OpenSSL library is not used
  + zlib library is not used

  nginx path prefix: "/home/user/nginx-install-arm32"
  nginx binary file: "/home/user/nginx-install-arm32/sbin/nginx"
  nginx modules path: "/home/user/nginx-install-arm32/modules"
  nginx configuration prefix: "/home/user/nginx-install-arm32/conf"
  nginx configuration file: "/home/user/nginx-install-arm32/conf/nginx.conf"
  nginx pid file: "/home/user/nginx-install-arm32/logs/nginx.pid"
  nginx error log file: "/home/user/nginx-install-arm32/logs/error.log"
  nginx http access log file: "/home/user/nginx-install-arm32/logs/access.log"
  nginx http client request body temporary files: "client_body_temp"
  nginx http proxy temporary files: "proxy_temp"
  nginx http fastcgi temporary files: "fastcgi_temp"
  nginx http uwsgi temporary files: "uwsgi_temp"
  nginx http scgi temporary files: "scgi_temp"

四、make

make也没那么顺利,遇到几个宏不存在,幸好都是判断32位还是64位的,直接改代码删掉判断保留针对32位的代码即可。

修改源代码

几处修改都很相似,下面是第一个修改:

所有修改的文件是这些:

最后make install把结果输出即可。

输出目录下的sbin目录里面有可执行程序,用file检查文件格式是否是arm32。

bash 复制代码
user@vm-ubuntu:~$ cd nginx-install-arm32
user@vm-ubuntu:~/nginx-install-arm32$ ls -l
total 16
drwxrwxr-x 2 user user 4096 Oct 31 12:04 conf
drwxrwxr-x 2 user user 4096 Oct 31 12:04 html
drwxrwxr-x 2 user user 4096 Oct 31 12:04 logs
drwxrwxr-x 2 user user 4096 Oct 31 12:04 sbin
user@vm-ubuntu:~/nginx-install-arm32$ cd sbin
user@vm-ubuntu:~/nginx-install-arm32/sbin$ ls
nginx
user@vm-ubuntu:~/nginx-install-arm32/sbin$ file *
nginx: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, with debug_info, not stripped
user@vm-ubuntu:~/nginx-install-arm32/sbin$

"ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV)",确实是arm32程序。


(这里是文档结束)

相关推荐
文牧之10 分钟前
PostgreSQL 的扩展pageinspect
运维·数据库·postgresql
小兔子酱#35 分钟前
【Docker 01】Docker 简介
运维·docker·容器
jugt2 小时前
CentOS 7.9安装Nginx1.24.0时报 checking for LuaJIT 2.x ... not found
linux·运维·centos
hunter1273 小时前
Nginx 事件驱动理解
nginx
21号 14 小时前
9.进程间通信
linux·运维·服务器
搬码临时工9 小时前
电脑同时连接内网和外网的方法,附外网连接局域网的操作设置
运维·服务器·网络
藥瓿亭9 小时前
K8S认证|CKS题库+答案| 3. 默认网络策略
运维·ubuntu·docker·云原生·容器·kubernetes·cks
Gaoithe9 小时前
ubuntu 端口复用
linux·运维·ubuntu
gsls20080811 小时前
ocrapi服务docker镜像使用
运维·docker·容器
文牧之11 小时前
PostgreSQL 的扩展pg_freespacemap
运维·数据库·postgresql