LibFFI 正在参加 2020 年度 OSC 中国开源项目评选,请投票支持!
LibFFI 在 2020 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
投票让它出道
已投票
LibFFI 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」 !
LibFFI 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」「最积极运营项目」 !
LibFFI 获得 2020 年度 OSC 中国开源项目评选「最积极运营项目」 !

软件简介

“FFI” 的全名是 Foreign Function Interface,通常指的是允许以一种语言编写的代码调用另一种语言的代码。而 “Libffi” 库只提供了最底层的、与架构相关的、完整的”FFI”,因此在它之上必须有一层来负责管理两种语言之间参数的格式转换。

高级语言编译器产生代码时都会依据一系列的规则,这些规则十分必要,特别是对独立编译来说。其中之一是“调用约定” (Calling Convention),它包含了编译器关于函数入口处的函数参数、函数返回值的一系列假设。它有时也被称作“ABI”(Application Binary Interface)。调用约定(Calling Conventions)定义了程序中调用函数的方式,它决定了在函数调用的时候数据(比如说参数)在堆栈中的组织方式。

通常来说函数调用要用到的两条基本的指令:”CALL”指令和”RET”指令。”CALL”指令将当前的指令指针(这个指针指向紧接在CALL指令后面的那条指令)压入堆栈,然后执行一条无条件转移指令转移到新的代码地址。”RET”是与”CALL”指令配合使用的指令,在绝大多数函数中它是最后一条指令。”RET”指令弹出返回地址(就是早些时候”CALL”指令压入堆栈的地址)并将其加载到”EIP”寄存器中,然后从这个地址开始继续执行。

图1-1 说明调用约定”stdcall”的调用过程,调用时,最末一个参数最先压入堆栈,而由被调用函数使用RET指令清栈。RET指令带有一个操作数,该操作数指明在EIP跳回主要函数之前需要释放的堆栈空间的字节数。这就是说,stdcall调用约定中RET指令带的操作数往往就意味着函数一共传入几个参数。

calltype stdcall

图1-1 stdcall调用

独立编译时,调用一个函数除了要知道函数的签名外,还要知道其调用约定。比如 Delphi 中调用”Stdcall”的”VC++”的函数,需对调用约定加以声明。

Procedure ShowMess (h :HWND; mess :PChar ); Stdcall; external LibName;

“LibFFI”针对这些不同的调用约定,提供一个高层次的可移植的API,只需调用这些API就可以在运行时进行动态的函数调用。(这种方式和函数指针不同,函数指针比如在编译时就决定了函数的类型,而”libffi”可以在运行时是才决定被调用函数的类型)。有了 libffi ,我们就有可能写出一个通用而且简洁的调用 C 函数的方法。

目前有许多项目都使用了 libff ,包括 ruby,cpython, openjdk,dalvik vm 等等。例如在 Ruby 中,利用 rubyffi (包装了 libffi )可以如此动态地调用一个 dll

介绍内容来自:http://blogs.ejb.cc/archives/1502/libffi-example-of-the-use

展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论 (0)

加载中
更多评论
暂无内容
发表了博客
2017/10/25 19:30

移植libffi到SylixOS

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 Fu...

0
0
2020/11/19 07:42

解决运行scrapy是报错No module named cryptography,解决cryptography的安装问题,解决libffi的安装问题

解决运行scrapy是报错No module named cryptography,解决cryptography的安装问题,解决libffi的安装问题 参考文章: (1)解决运行scrapy是报错No module named cryptography,解决cryptography的安装问题,解决libffi的安装问题 (2)https://www.cnblogs.com/xiaoli2018/p/4661604.html 备忘一下。...

0
0
发表了博客
2019/08/14 17:52

当你安装python3没有安装依赖环境yum install -y libffi-devel,pip和setuptools,pip会装不上,不安装yum -y install zlib-deve...

在准备安装python3和pip3时,请先安装依赖环境:yum install -y libffi-devel,和 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel一定要先装!不然会出现如下例一连串连锁反应的bug 在安装linux的centos里安装python3报错: File "/usr/local/src/Python-3.7.0/Lib/ctypes/__init__.py", line 7, in <module> from _c...

0
0
发表了博客
2016/03/27 20:48

编译可在Android上运行的libffi库

# 编译可在Android上运行的libffi库 @(Android研究)[android|libffi] ---------- [TOC] ---------- ## 前言 >本文公开首发于阿里聚安全博客:https://jaq.alibaba.com/community/index.htm?spm=0.0.0.0.ycEUXK libffi版本:3.2.1。 本文在Ubuntu 64位系统上对libffi项目进行交叉编译。 下文中的"NDK"若无特殊说明均指"Android NDK"。 ## 步骤 ### 1. 下载并安装Android NDK 下载并安装Android NDK的过程在这里不做介绍。 ### 2....

0
0
发表了博客
2015/07/31 00:19

解决scrapy报错No module named cryptography.hazmat.bind

在linux下配置完运行是出现ImportError: No module named cryptography.hazmat.bindings.openssl.binding的错误。 原因是craptography并没有安装。如果直接安装cryptography时又会出现找不到libffi和cffi文件的错误。表示如果还需要先配置libffi和cffi,需要先配置libffi然后配置cffi。 1、配置libffi的步骤: ubuntu下通过源码安装的方法: wget ftp://sourceware.org/pub/libffi/libffi-3.0.11.tar.gz tar zxvf libffi-3....

0
2
发表了博客
2019/05/29 10:44

报错:ModuleNotFoundError: No module named '_ctypes'

报错背景: CentOS 7 Python3.7 安装 setuptools 插件的时候报错。 报错现象: [root@master setuptools-41.0.1]# python3.7 setup.py build Traceback (most recent call last): File "setup.py", line 11, in <module> import setuptools File "/bigdata/sources/python/setuptools-41.0.1/setuptools/__init__.py", line 20, in <module> from setuptools.dist import Distribution, Feature File "/bi...

0
0
发表了博客
2019/02/18 15:47

FFI (语言交互接口(Foreign Function Interface))

FFI(Foreign Function Interface)是用来与其它语言交互的接口, 在有些语言里面称为语言绑定(language bindings), Java 里面一般称为 JNI(Java Native Interface) 或 JNA(Java Native Access)。 由于现实中很多程序是由不同编程语言写的,必然会涉及到跨语言调用,比如 A 语言写的函数如果想在 B 语言里面调用,这时一般有两种解决方案:一种是将函数做成一个服务,通过进程间通信(IPC)或网络协议通信(RPC, RESTful等);另一种...

0
0
发表了博客
2019/03/24 18:55

使用yum命令报错File "/usr/bin/yum", line 30 except KeyboardInterrupt, e:

使用yum命令报错File "/usr/bin/yum", line 30 except KeyboardInterrupt, e: 解决办法: 修改yum配置文件,将python版本指向以前的旧版本 # vi /usr/bin/yum #!/usr/bin/python2.7 修改urlgrabber-ext-down文件,更改python版本 # vi /usr/libexec/urlgrabber-ext-down #!/usr/bin/python2.7 注:当安装2个python版本时,可在/usr/bin目录下执行ls -l python*命令 此命令显示python对应的版本及路径 2、CentOS 7 编译安装 Pyth...

0
0
发表了博客
2015/11/07 09:19

解决某 error: command 'gcc' failed with exit status 1

centos下安装cffi等在pip install的时候会出现 No package 'libffi' found 然后执行安装libffi-devel解决了 yum install libffi-devel

0
0
发表了博客
2013/06/14 15:19

glib库编译

1、下载glib源代码 http://ftp.acc.umu.se/pub/gnome/sources/glib/ 2、使用configure生成Makefile ./configure --prefix=/usr/local/glib-2.34.3 需要注意的地方 2.1在配置前,要确保系统已经安装了libffi开发包 如果没有安装,可以到libffi官网下载 在编译安装完libffi开发包后,需要设置两个环境变量,要不然这configure的时候会出现如下的错误提示: no package 'libffi' found glib 设置的环境变量为: export LIBFFI_CFLA...

0
4
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
暂无内容
0 评论
16 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部