移植libffi到sylixos

author author     2022-09-24     443

关键词:

1. 开发环境
宿主机:Windows 7
集成开发环境:Real-Evo IDE 3.2.5
虚拟机:Ubuntu 14.04

本篇仅介绍libffi库的移植过程,包括资源的获取,工程文件的修改以及编译出错处理。移植后的libffi支持ARM、MIPS、PowerPC和x86平台,本文档以x86平台为例进行移植,在完成本文档的操作步骤后,只需要修改libffi工程所依赖的base工程,然后重新编译上传,即可在所支持的平台上使用libffi库。

2. libffi简介

“FFI” 的全名是 Foreign Function Interface,通常指的是允许以一种语言编写的代码调用另一种语言的代码。而 “libffi” 库只提供了最底层的、与架构相关的、完整的“FFI”,因此在它之上必须有一层来负责管理两种语言之间参数的格式转换。
高级语言编译器产生代码时都会依据一系列的规则,这些规则十分必要,特别是对独立编译来说。其中之一是“调用约定” (Calling Convention),它包含了编译器关于函数入口处的函数参数、函数返回值的一系列假设。它有时也被称作“ABI”(Application Binary Interface)。调用约定(Calling Conventions)定义了程序中调用函数的方式,它决定了在函数调用的时候数据(比如说参数)在堆栈中的组织方式。
通常来说函数调用要用到的两条基本的指令:“CALL”指令和“RET”指令。“CALL”指令将当前的指令指针(这个指针指向紧接在CALL指令后面的那条指令)压入堆栈,然后执行一条无条件转移指令转移到新的代码地址。“RET”是与“CALL”指令配合使用的指令,在绝大多数函数中它是最后一条指令。“RET”指令弹出返回地址(就是“CALL”指令压入堆栈的地址)并将其加载到“EIP”寄存器中,然后从这个地址开始继续执行。
3. 资源获取
3.1 libffi源码获取
一般的,可以通过官方网站获取要移植的第三方件的资源。libffi最新版本的下载地址为https://github.com/libffi/libffi
本篇中使用的libffi版本为libffi-2.99.9,下载后解压文件如图 3-1所示。
技术分享
图 3-1 libffi解压后部分文件
其中src目录下主要包含要编译的源文件以及支持的平台文件。configure是配置文件,在Linux平台下运行该文件可生成Makefile文件,执行make命令即可生成最终的库文件。
libffi支持的平台可见src目录下包含的平台相关目录,支持平台如图 3-2所示。
技术分享
图 3-2 libffi支持的平台
移植到SylixOS后的libffi支持的平台有ARM、MIPS、POWERPC和x86。
对于新版本的libffi,目录结构有所不同,配置方法也有差异,在移植时需要结合具体libffi版本进行配置。
4. Linux平台下配置
4.1 配置
编译过程中使用的Linux环境为Ubuntu发行版。将下载的压缩包文件拷贝到Ubuntu环境中并解压。由于下载的库文件已经包含了configure配置文件,因此需要执行该命令生成makefile文件,操作如图 4-1所示。
技术分享
图 4-1执行配置文件
生成makefile文件如图 4-2所示。
技术分享
图 4-2生成makefile文件
由于只是为了配置libffi库,在执行完configure脚本后即完成了libffi的配置,然后保存libffi文件夹以便移植。
5. 新建libffi库工程
5.1 导入libffi源码
在Real-Evo IDE中创建libffi共享库工程,删去libffi工程中src目录下的文件libffi.c,并导入libffi源码文件。导入后的工程文件如图 5-1所示。
技术分享
图 5-1 导入libffi源码文件到libffi库工程
5.2 修改makefile
修改libffi工程属性为专家模式,操作如图 5-2所示。
技术分享
图 5-2修改工程属性为专家模式
修改libffi.mk文件,加入进行编译的源码文件,修改内容如图 5-3所示。
技术分享
图 5-3 修改libffi.mk添加源文件
修改libffi.mk文件,加入头文件路径,修改内容如图 5-4所示。
技术分享
图 5-4 修改libffi.mk添加头文件路径
其中PLATFORM定义在Makefile文件中,PLATFORM支持的平台如图 5-5所示。
技术分享
图 5-5 PLATFORM支持的平台
其中TOOLCHAIN_PREFIX是和所依赖的base工程相关的。在指定好所依赖的base工程之后,TOOLCHAIN_PREFIX的取值就已经确定。
5.3 编译libffi工程
保存修改并编译,出现如图 5-6所示错误。
技术分享
图 5-6 编译报错
打开ffitarget.h后可看到其内容是乱码,所以导致出错,删除掉该头文件之后重新编译,即可编译通过。
为了支持PowerPC平台,需要在libffi/src/libffi/include/ffi.h文件中添加内容如图 5-7所示。
技术分享
图 5-7 增加POWERPC宏
为了支持MIPS平台,需要在libffi/src/libffi/src/mips/ffi.c文件中做接口替换,原调用接口为:

__builtin__clear_cache(clear_location, clear_location + FFI_TRAMPOLINE_SIZE);

替换为:

__clear_cache(clear_location, clear_location + FFI_TRAMPOLINE_SIZE);

再次编译,即可生成libffi库文件,生成库文件位于Debug目录下。如图 5-8所示。

  技术分享

图 5-8 编译生成libnopoll库文件
打开x86虚拟机,并配置好libffi工程的设备IP为x86虚拟机的IP,即可将生成的库文件导入到x86虚拟机中。至此,则完成了libffi的编译及上传。剩下的工作则是通过测试用例测试移植后的libffi库是否能够正常运行。


本文出自 “12547908” 博客,请务必保留此出处http://12557908.blog.51cto.com/12547908/1976132

已移植到loongarch64的libffi源码目录

这个目录是没有的:GitHub-loongarch64/libffi:Aportableforeign-functioninterfacelibrary.这个目录就有了: GitHub-loongson/libffi:Aportableforeign-functioninterfacelibrary.  查看详情

sylixos标准工程移植到lite版本

1.概述   针对低端处理器(如ARMM系列处理器)的开发工作,翼辉信息推出了SylixOSLite工程版本。SylixOSLite版本工程属于SylixOS轻量级工程,与标准的SylixOS工程相比裁剪掉部分功能(如GDB调试、虚拟内存管理、动态装载、... 查看详情

vxworks工程移植到sylixos应用笔记

....适用范围该应用笔记适用帮助用户在RealEvo-IDE开发环境中移植Vxworks应用程序,并部署到SylixOS操作系统上运行,使用到的开发工具为RealEvo-IDE集成开发环境。2.准备工作2.1环境准备在使用之前,须安装有翼辉信息开发的集成开发套... 查看详情

移植libnopoll到sylixos技术笔记

...untu    目标机:mini2440本篇仅介绍nopoll库的移植过程,包括资源的获取,工程文件的修改以及编译出错处理 查看详情

sylixos音频驱动移植

...70平台音频驱动的方法总结,以此提供一些SylixOS音频驱动移植方法的参考。2.原理概述2.1 Codec编解码芯片  声音信号分为模拟信号和数字信号,Codec编解码芯片主要功能就是实现模拟信号与数字信号的互相转换。 &nb... 查看详情

vxworks驱动移植至sylixos总结(代码片段)

本文档描述了将VxWorks中的驱动源码快速移植至SylixOS中的方法,使用时需要结合SylixOS中的VxWorks兼容层实现。1.驱动注册与初始化1.1VxWorks中驱动注册与初始化1.1.1初始化函数VxWorks中大部分函数使用了VxWorks的VxBus结构,对于基于VxBus... 查看详情

sylixos基于nuc970平台的sd驱动移植

...文档为实现Nuc970平台的SD驱动总结,提供一些SylixOSSD驱动移植方法的参考。2.原理概述2.1 控制器类型  SD控制器有两种类型,分为SD标准控制器(SDHCI)和SD非标准控制器。  SylixOSBase代码中实现了SDHCI的驱动,但Nuc970... 查看详情

移植eigen库到sylixos下及使用方法

1.开发环境宿主机:Windows7 集成开发环境:Real-EvoIDE3.5.3 虚拟机:Ubuntu 目标机:x862.Eigen简介Eigen是一个提供了线性代数、矩阵、向量操作等运算的C++库,其中包含了很多算法。Eigen的License是MPL2,支持多平台。 Eigen... 查看详情

sylixos下移植glib时clock_gettime函数分析

1.问题分析   移植glib中间件时,运行测试用例出现异常错误,定位问题为g_clock_gettime函数获取的时间和系统API获取的时间不一致导致。   glib中间件中g_get_monotonic_time函数原型如程序清单1.1所示。程序清单1.1... 查看详情

sylixos下移植glib时clock_gettime函数分析

1.问题分析   移植glib中间件时,运行测试用例出现异常错误,定位问题为g_clock_gettime函数获取的时间和系统API获取的时间不一致导致。   glib中间件中g_get_monotonic_time函数原型如程序清单1.1所示。程序清单1.1... 查看详情

通过curl下载文件

...下载依赖curl中间件,故下载前需基于SylixOS进行curl中间件移植,移植过程本文档不做详细介绍,请参照《SylixOS下中间件移植手册》。2.2 下载流程&nb 查看详情

全网首发:祝贺编译成功loongarch64jna-5.10.0及难点说明

...0c;而且不同CPU需要不同的代码。这就是说CPU厂家必须及时移植。  编译下来的体会,难点有两个:找到移植到loongarch64的libffi源码  本来这不是个问题,结果龙芯在github上有两个开源区,loongson的libffi是已经移... 查看详情

全网首发:祝贺编译成功loongarch64jna-5.10.0及难点说明

...0c;而且不同CPU需要不同的代码。这就是说CPU厂家必须及时移植。  编译下来的体会,难点有两个:找到移植到loongarch64的libffi源码  本来这不是个问题,结果龙芯在github上有两个开源区,loongson的libffi是已经移... 查看详情

全网首发:祝贺编译成功loongarch64jna-5.10.0及难点说明

...0c;而且不同CPU需要不同的代码。这就是说CPU厂家必须及时移植。  编译下来的体会,难点有两个:找到移植到loongarch64的libffi源码  本来这不是个问题,结果龙芯在github上有两个开源区,loongson的libffi是已经移... 查看详情

sylixoswrite0字节问题

1问题描述在移植中间件过程中,在SylixOS调用write函数写入0字节的数据到文件中时,会导致对应的中间件测试用例失败,失败的原因是文件系统中的write函数在Linux系统和SylixOS有区别,两种实现的差别如下。2write函数的实现机制2.... 查看详情

sylixos上ethercat实现

...者都支持。其中IgH作为常用的EtherCAT开源协议栈,SylixOS已移植支持。 2SylixOS-IgH使用框架 &nbs 查看详情

sylixos中rpc简介

1、概述SylixOS中移植了SUN公司的开源RPC库——libsunrpc,主要用于远程过程调用,现对其通信机制及远程调用过程做简单的介绍。2、RPC通信机制    2.1RPC介绍RPC(RemoteProcedureCallProtocol)——远程过程调用协议,它是一... 查看详情

linuxfromscratch(lfs11.0)构建lfs系统-libffi-3.4.2(代码片段)

Libffi库提供一个可移植的高级编程接口,用于处理不同调用惯例。这允许程序在运行时调用任何给定了调用接口的函数。安装Libffi解压软件包:cd/sourcestar-xflibffi-3.4.2.tar.gzcdlibffi-3.4.2编译、检查并安装libffi:time./configur... 查看详情