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/bash

cross_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.2

zhangsz@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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

字符串冲刺题(算法村第十二关黄金挑战)

最长公共前缀 14. 最长公共前缀 - 力扣&#xff08;LeetCode&#xff09; 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 1&#xff1a; 输入&#xff1a;strs ["flower","flow"…

安泰ATA-2082高压放大器如何驱动超声探头进行无损检测

无损检测技术是一种在不破坏或影响被检测物体性能的前提下&#xff0c;通过物理或化学方法对其内部或表面的缺陷进行检测的技术。在无损检测领域&#xff0c;超声检测是一种广泛应用的方法&#xff0c;而ATA-2082高压放大器则是实现高效、精确超声检测的关键设备之一。本期内容…

钉钉互动卡片对接-普通互动卡片接入流程

这里写目录标题 一、创建内部应用二、搭建普通卡片模板三、调用互动卡片服务端接口接口报文一、发送卡片二、更新卡片三、获取token 一、创建内部应用 登录开发者后台&#xff0c;创建内部应用。 例如 百度-内部测试获取AppKey和AppSecret&#xff0c; 获取应用访问凭证获取企…

计组与原理:系统总线

大家好啊&#xff0c;这里来到计组第二部分内容&#xff1a;系统总线 跳转上一篇&#xff1a;计组原理&#xff1a;系统概论与基本组成 系统总线 1.总线的基本概念单总线结构框图面向 CPU 的双总线结构框图以存储器为中心的双总线结构框图 2.总线的分类片内总线系统总线通信总线…

API接口安全总结

接口分类 HTTP接口 RPC接口&#xff08;客户端和服务器端的连接 例如游戏登陆&#xff09;非web协议&#xff0c;PRC 远程过程调用 Remote Procedure Call&#xff0c;其就是一个节点请求另外一个节点提供的服务。当两个物理分离的子系统需要建立逻辑上的关联时&#xff0c;R…

Pandas--简介(1)

Pandas 简介 Pandas 是一个开源的数据分析和数据处理库&#xff0c;它是基于 Python 编程语言的。Pandas 提供了易于使用的数据结构和数据分析工具&#xff0c;特别适用于处理结构化数据&#xff0c;如表格型数据&#xff08;类似于Excel表格&#xff09;。Pandas 是数据科学和…

前端基于XLSX实现数据导出到Excel表格,以及提示“文件已经被损坏,无法打开”的解决方法

文章目录 一、vue实现导出excel1、前端实现1、安装xlsx依赖2、引入3、方法4、使用4.1、将一个二维数组转成sheet4.2、将一个对象数组转成sheet4.3、合并单元格4.4、一次导出多个sheet 5、支持的文件格式 2、后端实现 二、导出文件损坏1、前端请求导出接口&#xff0c;增加返回类…

OpenHarmony驱动消息机制管理

驱动消息机制管理 当用户态应用和内核态驱动需要交互时&#xff0c;可以使用HDF框架的消息机制来实现。 消息机制的功能主要有以下两种&#xff1a; 用户态应用发送消息到驱动。 用户态应用接收驱动主动上报事件。 配置管理 HCS&#xff08;HDF Configuration Source&…

相机与镜头

一、相机视场 相机的视场角&#xff0c;也就是相机能够看到物像角度的最大值&#xff0c;视场角与焦距的关系为像高f*tan(fov/2)。由于相机的感光面是矩形&#xff0c;所以相机能够看到的区域也是矩形。探究相机的视场角&#xff0c;便于分析物面上那些区域属于相机盲区&#x…

前端模板字符串的使用

目录 1.说明 2.示例 3.总结 1.说明 模板字符串是用反引号&#xff08;&#xff09;分隔的字面量&#xff0c;允许多行字符串&#xff0c;带有嵌入表达式的字符串插值和一种带标签的模板的特殊结构。 是增强版的字符串&#xff0c;在进行字符串拼接时&#xff0c;可以拼接固…

2.0-学成在线内容管理

内容管理模块 1.需求 1.1 业务流程 内容管理的业务由教学机构人员和平台的运营人员共同完成。 教学机构人员的业务流程如下&#xff1a; 1、登录教学机构。 2、维护课程信息&#xff0c;添加一门课程需要编辑课程的基本信息、上传课程图片、课程营销信息、课程计划、上传课程…

C语言或C++通过IShellLinkA创建或解析lnk快捷方式(使用char字符数组)

本例程用到的COM接口有IShellLinkA和IPersistFile。 请注意因为函数参数的类型不为BSTR&#xff0c;所以这两个接口可直接传char *或wchar_t *字符串&#xff0c;不需要提前转化为BSTR类型。 C语言的写法&#xff1a; /* 这个程序只能在C编译器下编译成功, 请确保源文件的扩展…

操作系统的灵魂--MMU详解

虚拟内存是现代操作系统中最伟大的发明之一。它为每个进程提供了一个一致的、私有的地址空间&#xff0c;让每个进程产生了一种自己在独享主存的错觉。 为了讲清楚MMU是如何一步一步完成地址翻译&#xff0c;取出数据的&#xff0c;本篇文章在前4节中讲解了虚拟内存中一些重要…

【代码随想录】刷题笔记Day54

前言 差单调栈就结束代码随想录一刷啦&#xff0c;回家二刷打算改用python补充进博客&#xff0c;小涛加油&#xff01;&#xff01;&#xff01; 647. 回文子串 - 力扣&#xff08;LeetCode&#xff09; 双指针法 中心点外扩&#xff0c;注意中心点可能有一个元素可能有两个…

Java-SPI机制

SPI基本概念 SPI&#xff08;Service Provider Interface&#xff09;是一种服务发现机制&#xff0c;为某个接口寻找服务实现的机制。这有点类似 IoC 的思想&#xff0c;将装配的控制权移交到了程序之外。SPI 将服务接口和具体的服务实现分离开来&#xff0c;将服务调用方和服…

理解反向代理

反向代理是一个不可或缺的组件。 它在客户端和服务器之间充当中介&#xff0c;提高了安全性、负载平衡和应用性能。 一、反向代理简介 反向代理是一种服务器&#xff0c;它位于客户端和后端服务器之间。与常见的&#xff08;正向&#xff09;代理不同&#xff0c;反向代理代表…

爬取A站视频,涉及m3u8格式的处理

一、抓包分析 1.进入A站进行抓包分析 进入一个页面&#xff0c;右点击鼠标按钮&#xff0c;点击检查 接着点击network&#xff0c;点击Fetxh/XHR,然后刷新网页&#xff0c;得到下面的页面 发现其中有许多d595开头的文件&#xff0c;它们是ts文件&#xff0c;点击其中一个。在…

v38.Switch语句

1.Switch语句可以替代if-else语句 2.具体使用 Switch&#xff08;expression&#xff09; &#xff5b; case label&#xff1a;...... &#xff5d; ①将x与case后的label 进行比较&#xff1b; ②注意后面有冒号&#xff1b; ③从上往下开始检查case&#xff1b; ④如果…

Transform模型详解

Transformer模型详解 Encoder与Decoder输入单词Embedding位置 Embedding 自注意力机制Self-Attention 结构Self-Attention 的输出Multi-Head Attention Encoder 结构Add & NormFeed Forward组成 Encoder Decoder结构Decoder第一个 Multi-Head AttentionDecoder第二个 Multi…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例4-9 HTML5 表单验证

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>HTML5 表单验证</title> </head><body> <form action"#" method"get">请输入您的邮箱:<input type"email&q…