重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
1. 开发环境
宿主机:Windows 7
集成开发环境:Real-Evo IDE 3.2.5
虚拟机:Ubuntu 14.04
成都创新互联致力于互联网网站建设与网站营销,提供成都做网站、网站设计、网站开发、seo优化、网站排名、互联网营销、小程序设计、公众号商城、等建站开发,成都创新互联网站建设策划专家,为不同类型的客户提供良好的互联网应用定制解决方案,帮助客户在新的全球化互联网环境中保持优势。
本篇仅介绍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所示。
图 5-8 编译生成libnopoll库文件
打开x86虚拟机,并配置好libffi工程的设备IP为x86虚拟机的IP,即可将生成的库文件导入到x86虚拟机中。至此,则完成了libffi的编译及上传。剩下的工作则是通过测试用例测试移植后的libffi库是否能够正常运行。