外部函数接口 LibFFI

MIT
C/C++ 查看源码»
跨平台
2013-11-15
红薯

“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

的码云指数为
超过 的项目
加载中
请先登录后再评论。

暂无资讯

暂无问答

移植libffi到SylixOS

1. 开发环境 宿主机:Windows 7 集成开发环境:Real-Evo IDE 3.2.5 虚拟机:Ubuntu 14.04 本篇仅介绍libffi库的移植过程,包括资源的获取,工程文件的修改以及编译出错处理。移植后的libffi支...

2017/10/25 19:30
36
0
当你安装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-dev...

2019/08/14 17:52
15
0
编译可在Android上运行的libffi库

编译可在Android上运行的libffi库

2016/03/27 20:48
626
1
解决scrapy报错No module named cryptography.hazmat.bind

解决scrapy报错No module named cryptography.hazmat.bind解决cryptography的安装问题,解决libffi的安装问题 引用http://www.cnblogs.com/xiaoli2018/p/4661604.html...

2015/07/31 00:19
4.3K
0
报错: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 ...

2019/05/29 10:44
13
0
FFI (语言交互接口(Foreign Function Interface))

FFI(Foreign Function Interface)是用来与其它语言交互的接口, 在有些语言里面称为语言绑定(language bindings), Java 里面一般称为 JNI(Java Native Interface) 或 JNA(Java Native Acce...

2019/02/18 15:47
8
0
使用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 修改url...

2019/03/24 18:55
11
0
解决某 error: command 'gcc' failed with exit status 1

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

2015/11/07 09:19
402
0
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在配置前,要确保系统已...

2013/06/14 15:19
7.2K
0
[Dynamic Language] Python3.7 源码安装 ModuleNotFoundError: No module named '_ctypes' 解决记录

Python3.7 源码安装 ModuleNotFoundError: No module named '_ctypes' 解决记录 源码安装时报错 File "/home/abeenserver/netsource/Python-3.7.0/Lib/ctypes/__init__.py", line 7, in <mo...

2018/07/23 16:31
79
0

没有更多内容

加载失败,请刷新页面

返回顶部
顶部