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程序。


(这里是文档结束)

相关推荐
阿明61 小时前
Linux进程【Linux】
linux·运维·服务器
Android系统攻城狮1 小时前
Linux Gstreamer深度解析之gst_audio_resampler_update调用流程与实战(三十)
linux·运维·服务器·gstreamer音视频·音视频进阶
微信ipad协议开发1 小时前
微信视频号自动化:内容发布与互动的 API 实现
运维·微信
Lsetea4 小时前
部署证书后提示“证书名称与输入不匹配”:Safari 报错的三层排查
nginx·https·safari·ssl证书·openssl
蓝速科技4 小时前
会议室门牌签到功能选型与落地指南丨蓝速科技
大数据·运维·数据库·人工智能·科技
逐流人4 小时前
Containerd容器管理实战:从架构原理到nerdctlcrictl工具链
linux·运维·云原生·容器·云计算·containerd
酣大智7 小时前
网络协议计时器 & 发包间隔汇总
运维·网络·tcp/ip
云运维笔记14 小时前
IP地址从入门到精通:网络通信的核心基石
运维·网络·计算机网络
码农学院15 小时前
企业官网改版后 AI 引用归零的复盘:301 重定向断层让爬虫索引掉线,修复方案与恢复数据
运维·geo优化·ai优化aio
kuroomi15 小时前
Ingress-Nginx与kubernetes 网络
linux·运维·网络·kubernetes