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 小时前
linux命令总结
linux·运维·服务器
草明2 小时前
Nginx 做反向代理,一个服务优先被使用,当无法提供服务时才使用其他的备用服务
运维·nginx·github
C++忠实粉丝3 小时前
Linux系统基础-多线程超详细讲解(5)_单例模式与线程池
linux·运维·服务器·c++·算法·单例模式·职场和发展
华纳云IDC服务商3 小时前
CentOS系统中查看内网端口映射的多种方法
linux·运维·centos
中云DDoS CC防护蔡蔡4 小时前
棋牌游戏防ddos攻击,高防IP好用吗?
运维·服务器·游戏·网络安全·ddos
光芒再现dev4 小时前
CentOS—OpenEulerOS系统联网指南
linux·运维·centos
蓝莓星冰乐4 小时前
Linux入门(2)
linux·运维·服务器
吉吉614 小时前
Nginx:我自己的网站
运维·nginx
wanhengwangluo5 小时前
弹性裸金属服务器和传统裸金属服务器有什么区别?
运维·服务器
Syclus6 小时前
成功解决WSL2上的Ubuntu22.04执行sudo apt-get update指令报错问题
linux·运维·服务器