NGINX 交叉编译 arm32

news2024/11/7 15:32:44

初级代码游戏的专栏介绍与文章目录-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官网提供的工具链,这个工具链解压缩之后是个目录,为了使用工具链需要设置环境变量:

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替换掉:

export CC=arm-none-linux-gnueabihf-gcc

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

        然后执行configure:

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

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

 

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

NGX_PLATFORM=linux;./configure --prefix=$HOME/nginx-install-arm32 --without-http_rewrite_module --without-http_gzip_module

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

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

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。

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


(这里是文档结束)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2229588.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在Linux下安装和配置Docker

文章目录 安装前的准备在Debian/Ubuntu上安装Docker添加Docker仓库安装Docker验证安装 在CentOS/RHEL上安装Docker安装必要的软件包设置Docker仓库安装Docker启动Docker服务 Docker的基本使用拉取一个镜像运行一个容器 配置Docker创建Docker目录使用非root用户运行Docker 结语 …

什么是感知器?

神经网络是松散地基于人脑结构的信号处理工具。它们通常与人工智能 (AI) 相关。我不喜欢“人工智能”这个词,因为它不且简单化。如果将“智能”定义为快速进行数值计算的能力,那么神经网络是人工智能。但在我看来,智能远不止于此——它是设计…

【js逆向学习】某多多anti_content逆向(补环境)

文章目录 声明逆向目标逆向分析逆向过程总结 声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的…

Centos系统新增网卡后获取不到网卡的IP地址解决方法

一、问题描述 当我们给Centos系统添加了新的网卡后,使用查看IP地址命令【ip addr】时,发现新网卡没有获取到对应的IP地址信息,如下图所示: 二、解决方法 有两种解决方法:一种是自动获取IP地址;另外一种是手动配置IP地址; 2.1、自动获取IP地址 #自动获取网卡的IP地址命…

ARB链挖矿DApp系统开发模式定制

在区块链生态中,挖矿作为一种获取加密资产的方式,越来越受到关注。ARB链凭借其高效的性能和灵活的智能合约系统,成为了开发挖矿DApp的理想平台。本文将探讨ARB链挖矿DApp的开发模式定制,包括架构设计、功能实现以及最佳实践。 ARB…

Redis-06 Redis高可用集群架构原理与搭建

前面章节搭建了Redis【主-从】架构和【主-从】 哨兵架构,已可满足部分企业场景应用,但都有其对应的弊端,本章节将讲解更优生产架构:Redis集群架构。不仅包含哨兵架构的自动选举功能,还能降低主从架构下主节点的单节点压…

【Linux】一些Shell脚本编程基础题

目录 一、比较两个数的大小 二、求1-100的素数和 三、编写shell脚本,输入一个数字n并计算1~n的和,同时要求如果输入的数字小于1,则重新输入,直到输入正确的数字为止。 四、编写一个shell脚本用来进行成绩等级评定,…

Java代码实现PKCS5填充

1. 前言 如果你也在做加解密相关的需求,比如调用国密标准0018接口的对称加密/解密接口。就会遇到需要自己填充数据原文为16字节的整数倍(因为SM4分组算法的加密数据长度必须是其密钥大小的整数倍,SM4密钥大小是128bit,即&#xff…

mv_zhao直线

# 线段检测例程 # # 这个例子展示了如何在图像中查找线段。对于在图像中找到的每个线对象, # 都会返回一个包含线条旋转的线对象。# find_line_segments()找到有限长度的线(但是很慢)。 # Use find_line_segments()找到非无限的线&#xff08…

动态规划 —— 路径问题-最小路径和

1. 最小路径和 题目链接: 64. 最小路径和 - 力扣(LeetCode)https://leetcode.cn/problems/minimum-path-sum/description/ 2. 算法原理 状态表示:以莫一个位置位置为结尾 dp[i,j]表示:到达[i,j…

利用GPU加速在Orange Pi 5上跑LLMs:人工智能爱好者High翻了!

本期视频将会给人工智能爱好者们带来超级震撼! 视频中,我们将深入了解利用GPU加速在Orange Pi 5上跑LLMs的精彩世界。最近知乎上的一篇文章《利用GPU加速,在Orange Pi上跑LLMs》引起了我们的注意,这篇文章主要展示了GPU加速的LLM…

界面控件Kendo UI for Angular 2024 Q3亮点 - 全新的页面模板

随着最新的2024 Q3版本,Progress使用户能够使用现成的页面模板和构建块更快地构建令人惊叹的应用程序,使您的Telerik和Kendo UI开发体验更好。 Telerik和Kendo UI 2024 Q3版本将焦点放在新推出的页面模板和构建块上,每个页面模板和构建块都预…

鸿道Intewell操作系统架构介绍之Intewell-Hyper I 虚拟化构型

鸿道Intewell-Hyper I 虚拟化构型是鸿道Intewell-V虚拟化架构下的构型体系!鸿道Intewell-V是科东软件自主研发的实时虚拟化操作系统,包括鸿道Intewell-Hyper I 和鸿道Intewell-Hyper II。鸿道Intewell-V可以实现多个操作系统在同一物理硬件上并行运行&am…

聊一聊Qt中的Slider和ProgressBar

目录 QAbstractSilder 主要属性 设置值 信号 其他功能 API QSlider 主要功能 控制刻度 信号 用户交互 键盘操作 API QProgressBar API QScrollBar 详细描述 QDial API 一个示例 Slider和ProgressBar从某种程度上都是反应了自己对目标控件的进度状态。在Qt中…

蓝牙BLE开发——红米手机无法搜索蓝牙设备?

解决 红米手机,无法搜索附近蓝牙设备 具体型号当时忘记查看了,如果你遇到有以下选项,记得打开~ 设置权限

讲一讲 kafka 的 ack 的三种机制?

大家好,我是锋哥。今天分享关于【K讲一讲 kafka 的 ack 的三种机制?】面试题?希望对大家有帮助; 讲一讲 kafka 的 ack 的三种机制? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Kafka的消息确认机制&…

SpringFactoriesLoader

1.什么是SPI (面试题) SPI全名Service Provider interface,翻译过来就是“服务提供接口”,再说简单就是提供某一个服务的接口, 提供给服务开发者或者服务生产商来进行实现。 Java SPI 是JDK内置的一种动态加载扩展点的实现。 这个机制在一…

直接内存、死锁、方法句柄

直接内存 1. 不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域 2. 直接内存是在Java堆外、直接向系统申请的内存区间 3. 来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存 4. 通常,访问直接内存的速度会优于Java堆&am…

(七)JavaWeb后端开发1——Maven

目录 1.Maven概述 2.Maven依赖管理 2.1依赖配置 2.2依赖传递 2.3依赖范围 2.4生命周期 1.Maven概述 maven是一款管理和构建java项目的工具 Maven的作用: 依赖管理:方便快捷的管理项目依赖的资源(jar包),避免版本冲突问题统一项目结构…

设计一个灵活的RPC架构

RPC架构 RPC本质上就是一个远程调用,需要通过网络来传输数据。传输协议可以有多种选择,但考虑到可靠性,一般默认采用TCP协议。为了屏蔽网络传输的复杂性,需要封装一个单独的数据传输模块用来收发二进制数据,这个单独模…