ubuntu 20.04 aarch64 平台交叉编译 libffi 库

2024-01-24 01:28

本文主要是介绍ubuntu 20.04 aarch64 平台交叉编译 libffi 库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

  • 由于打算交叉编译 python,但是依赖 libffi 库,也就是 libffi 库也需要交叉编译

  • 环境: ubuntu 20.04

  • 交叉编译工具链:这里使用 musl libc 的 gcc 交叉编译工具链,aarch64-linux-musleabi-gcc,gcc 版本 gcc version 12.2.0

下载 libffi 库

  • 这里直接通过 github 下载当前最新的 libffi 库

  • git clone https://github.com/libffi/libffi.git

  • 下载后,进入 libffi,默认源码中没有 configure 脚本,可以直接运行 libffi 源码中的 autogen.sh 脚本,自动生成 configure 配置脚本

  • 另外创建一个 libffi 库的 build 目录,可以放在 libffi 源码目录的外部,这样编译不会影响到 libffi 源码目录

  • 这里在 libffi 目录外部创建一个新目录:build_libffi,然后进入 build_libffi,创建一个 编译 libffi 库的脚本 build_aarch64.sh

  • 注意设置的 交叉编译工具链路径,交叉编译工具链的各个工具

#!/bin/bashcross_tool_path=/home/zhangsz/smart/gnu_tools/aarch64-linux-musleabi_for_x86_64-pc-linux-gnu/bin../libffi/configure \CC=${cross_tool_path}/aarch64-linux-musleabi-gcc \CXX=${cross_tool_path}/aarch64-linux-musleabi-g++ \AR=${cross_tool_path}/aarch64-linux-musleabi-ar \LD=${cross_tool_path}/aarch64-linux-musleabi-ld \READELF=${cross_tool_path}/aarch64-linux-musleabi-readelf \--prefix=$PWD/_build\--build=aarch64-linux-musleabi \--host=aarch64-linux \--target=aarch64-linux \--enable-shared \make
make install
  • 设置执行 权限 chmod 777 build_aarch64.sh

  • 执行脚本,开始配置与编译

编译报错问题

  • 编译过程中,提示 linux/limits.h 找不到,由于我当前使用的是 非 Linux gcc 交叉编译工具链,也就是 musl libc 的 gcc 交叉编译工具链,因此找不到 Linux 的头文件,这里简单改一下,把 linux/limits.h 改为 limits.h 即可

../libffi/src/tramp.c:55:10: fatal error: linux/limits.h: No such file or directory

在这里插入图片描述

在这里插入图片描述

  • 编译成功,生成了 libffi.so.8.1.2 库, ARM aarch64 平台

在这里插入图片描述


zhangsz@zhangsz:~/python/tools/build_libffi/_build/lib64$ ls -la
total 216
drwxrwxr-x 2 zhangsz zhangsz   4096 123 22:56 .
drwxrwxr-x 6 zhangsz zhangsz   4096 123 22:56 ..
-rw-r--r-- 1 zhangsz zhangsz 104808 123 22:56 libffi.a
-rwxr-xr-x 1 zhangsz zhangsz    970 123 22:56 libffi.la
lrwxrwxrwx 1 zhangsz zhangsz     15 123 22:56 libffi.so -> libffi.so.8.1.2
lrwxrwxrwx 1 zhangsz zhangsz     15 123 22:56 libffi.so.8 -> libffi.so.8.1.2
-rwxr-xr-x 1 zhangsz zhangsz 145000 123 22:56 libffi.so.8.1.2zhangsz@zhangsz:~/python/tools/build_libffi/_build/lib64$ file libffi.so.8.1.2
libffi.so.8.1.2: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, with debug_info, not stripped
  • libffi 最新 github 上的版本交叉编译成功,生成了 相应的库

小结

  • 交叉编译 libffi 还是相对比较简单,如果 libffi 源码没有 configure 配置脚本,需要 autoconf 工具生成

  • 注意有的 gcc 交叉编译工具链没有 Linux 的头文件,这部分可以使用相应工具链中的头文件代替,比如 #include <linux/limits.h> 改为 #include <limits.h>

这篇关于ubuntu 20.04 aarch64 平台交叉编译 libffi 库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/638133

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

新特性抢先看! Ubuntu 25.04 Beta 发布:Linux 6.14 内核

《新特性抢先看!Ubuntu25.04Beta发布:Linux6.14内核》Canonical公司近日发布了Ubuntu25.04Beta版,这一版本被赋予了一个活泼的代号——“Plu... Canonical 昨日(3 月 27 日)放出了 Beta 版 Ubuntu 25.04 系统镜像,代号“Pluc

Ubuntu中Nginx虚拟主机设置的项目实践

《Ubuntu中Nginx虚拟主机设置的项目实践》通过配置虚拟主机,可以在同一台服务器上运行多个独立的网站,本文主要介绍了Ubuntu中Nginx虚拟主机设置的项目实践,具有一定的参考价值,感兴趣的可... 目录简介安装 Nginx创建虚拟主机1. 创建网站目录2. 创建默认索引文件3. 配置 Nginx4

Ubuntu 22.04 服务器安装部署(nginx+postgresql)

《Ubuntu22.04服务器安装部署(nginx+postgresql)》Ubuntu22.04LTS是迄今为止最好的Ubuntu版本之一,很多linux的应用服务器都是选择的这个版本... 目录是什么让 Ubuntu 22.04 LTS 变得安全?更新了安全包linux 内核改进一、部署环境二、安装系统

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Ubuntu固定虚拟机ip地址的方法教程

《Ubuntu固定虚拟机ip地址的方法教程》本文详细介绍了如何在Ubuntu虚拟机中固定IP地址,包括检查和编辑`/etc/apt/sources.list`文件、更新网络配置文件以及使用Networ... 1、由于虚拟机网络是桥接,所以ip地址会不停地变化,接下来我们就讲述ip如何固定 2、如果apt安

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

怎么关闭Ubuntu无人值守升级? Ubuntu禁止自动更新的技巧

《怎么关闭Ubuntu无人值守升级?Ubuntu禁止自动更新的技巧》UbuntuLinux系统禁止自动更新的时候,提示“无人值守升级在关机期间,请不要关闭计算机进程”,该怎么解决这个问题?详细请看... 本教程教你如何处理无人值守的升级,即 Ubuntu linux 的自动系统更新。来源:https://

Ubuntu系统怎么安装Warp? 新一代AI 终端神器安装使用方法

《Ubuntu系统怎么安装Warp?新一代AI终端神器安装使用方法》Warp是一款使用Rust开发的现代化AI终端工具,该怎么再Ubuntu系统中安装使用呢?下面我们就来看看详细教程... Warp Terminal 是一款使用 Rust 开发的现代化「AI 终端」工具。最初它只支持 MACOS,但在 20

在Ubuntu上部署SpringBoot应用的操作步骤

《在Ubuntu上部署SpringBoot应用的操作步骤》随着云计算和容器化技术的普及,Linux服务器已成为部署Web应用程序的主流平台之一,Java作为一种跨平台的编程语言,具有广泛的应用场景,本... 目录一、部署准备二、安装 Java 环境1. 安装 JDK2. 验证 Java 安装三、安装 mys