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


(这里是文档结束)

相关推荐
老黄编程1 分钟前
ubuntu如何查看一个内核模块被什么模块依赖(内核模块信息常用命令)?
linux·运维·ubuntu
Freed&40 分钟前
Ansible 生产级自动化指南:Playbook、Handlers、Jinja2 全解析
运维·自动化·ansible
b***251142 分钟前
储能电池包的自动化产线探秘|深圳比斯特自动化
运维·自动化
ZeroNews内网穿透43 分钟前
新版发布!“零讯”微信小程序版本更新
运维·服务器·网络·python·安全·微信小程序·小程序
工控小楠44 分钟前
涡街流量计温度数据的协议桥梁:Modbus RTU 转 Profinet 网关的自动化应用
运维·自动化
<但凡.1 小时前
Linux 修炼:进程控制(一)
linux·运维·服务器·bash
m0_464608262 小时前
Ansible实现自动化运维
运维·自动化·ansible
m0_464608262 小时前
Ansible Playbook:自动化配置管理的利器
运维·自动化·ansible
DDC楼宇自控与IBMS集成系统解读2 小时前
DDC 楼宇自控系统 + 3D 可视化运维管理平台融合解决方案
运维·3d
乌萨奇也要立志学C++3 小时前
【Linux】进程概念(六):进程地址空间深度解析:虚拟地址与内存管理的奥秘
linux·运维