当前位置: 首页 > 软件库 > 程序开发 > 常用工具包 >

LibFFI

外部函数接口
授权协议 MIT
开发语言 C/C++
所属分类 程序开发、 常用工具包
软件类型 开源软件
地区 不详
投 递 者 辛成周
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

“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

  • 最近调试了weston的一个coredump,对libffi有了一些了解,在此记录下,使用的是arm处理器,32位,soft float,libffi3.1,使用的abi是SYSV。 libffi简介和使用示例:http://www.atmark-techno.com/~yashi/libffi.html,建议先看完,有所了解再继续看本文。大体意思就是libffi用于高级语言之间的相互调用。由于函

  • 核心还是利用oc消息的查找派发机制,进行类结构的动态修改,用新函数替换老函数,然后再调用老函数。   前言     众所周知,使用runtime的提供的接口,我们可以设定原方法的IMP,或交换原方法和目标方法的IMP,以完全代替原方法的实现,或为原实现前后相当于加一段额外的代码。 @interface ClassA: NSObject - (void)methodA; + (void)method

  • C 语言 主动调用函数 // - 函数声明 double addFunc(int a, double b){ return a + b; } // - 测试函数 void libffi_add(){ // - 构造函数模板 包括参数和返回值 ffi_cif cif; ffi_type *argTyeps[2] = { &ffi_type_sint, &ffi_t

  • https://stackoverflow.com/questions/23722678/command-gcc-failed-with-exit-status-1-error-while-installing-scrapy warning: no previously-included files found matching '*.py' Requirement already satisfi

  • 很顺利就编译通过。 下载 http://github.com/libffi/libffi 安装依赖库 sudo apt-get install texinfo 编译 ./autogen.sh ./configure make sudo make install

  • 找不到libffi.so.6库的错误 在Spark独立集群一堆CentOS7主机里,加了一台Ubuntu20(无间道?)测试。 提交Java应用没问题,提交Python的时候出现错误: ImportError: libffi.so.6: cannot open shared object file: No such file or directory 于是: $> sudo apt-get ins

  • ImportError: libffi.so.7: cannot open shared object file: No such file or directory 下一个就好了 wget http://mirrors.edge.kernel.org/ubuntu/pool/main/libf/libffi/libffi7_3.3-4_amd64.deb sudo dpkg -i libffi7

  • Addthis entry in your /etc/apt/sources.list if it'snot deb http://archive.ubuntu.com/ubuntu vivid main restricted universe 更新来源清单 sudo apt-get update 然后再试一次 sudo apt-get install libffi-dev

  • 命令 yum install libffi libffi-devel -y

  • 最近调试了weston的一个coredump,对libffi有了一些了解,在此记录下,使用的是arm处理器,32位,soft float,libffi3.1,使用的abi是SYSV。 libffi简介和使用示例:http://www.atmark-techno.com/~yashi/libffi.html,建议先看完,有所了解再继续看本文。大体意思就是libffi用于高级语言之间的相互调用。由于函

  •  1. 下载源码编译安装 wget ftp://sourceware.org/pub/libffi/libffi-3.3.tar.gz cd libffi-3.3 ./configure --prefix=/usr/local/libffi-3.3 make make install 2. 配置路径 export LD_LIBRARY_PATH=/usr/local/libffi-3.3:$LD_

  • 前言 当python调用c库时,需要使用_ctypes模块,因此需要交叉libffi。 下载libffi 在这里http://sourceware.org/libffi/下载需要的libffi版本,我下载的是libffi-3.3.tar.gz版本,将其放在我的虚拟机/root/gw200/lib/目录下。在终端中进入此目录。 电脑版libffi ubuntu主机的话很简单,直接安装现成的包就行 s

  • 错误 Running setup.py install for cffi ... error Complete output from command /usr/bin/python3 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-9stiwxpi/cffi/setup.py';f=getattr(tokenize,

  • 问题 ImportError: dlopen(/opt/homebrew/Caskroom/miniforge/base/lib/python3.9/lib-dynload/_ctypes.cpython-39-darwin.so, 0x0002): Library not loaded: @rpath/libffi.7.dylib Referenced from: /opt/

 相关资料
  • 介绍 本教程会使用snappy压缩/解压缩库来作为一个 Rust 编写外部语言代码绑定的介绍。目前 Rust 还不能直接调用 C++ 库,不过 snappy 库包含一个 C 接口(记录在snappy-c.h中)。 一个关于 libc 的说明 很多这些例子使用libc crate,它提供了很多 C 类型的类型定义,还有很多其他东西。如果你正在自己尝试这些例子,你会需要在你的Cargo.toml中添加

  • 我刚刚开始学习React和JavaScript。在我阅读了留档和教程之后,我看了一下示例项目,并试图整理我还没有得到的内容。 然后我看到有一些函数是在函数内部定义的,还有一些函数是在函数外部定义的。 例如,在之外: 和内部render()。。。 为什么它们看起来如此不同,为什么你想在内部和外部有一些函数? 编辑: 之外的函数的另一个示例: EDIT2:在另一个线程中,有人回答说,如果函数背后的逻辑

  • Rust 提供了外部语言函数接口(Foreign Function Interface,FFI)到 C 语言库。外部语言函数必须声明在一个 extern 代码块,且该代码块要带有一个包含外部语言库名称的 #[link] 属性。 use std::fmt; // 此外部代码块链接到 libm 库 #[link(name = "m")] extern { // 这是外部语言函数 //

  • 问题内容: 我在此线程上给出了答案,并讨论了matplotlib上的衰落点。我对ImportanceOfBeingErnest的答案感到好奇。因此,我尝试使用他的代码。 首先,这是我的代码。 然后,我注意到了一件奇怪的事。至少对于我来说。注意和(在代码末尾)。位置1放置在函数之后,另一个放置 在 代码 后 ,因为函数在位置1之后结束,因此转到位置2。 由于需要运行动画,所以我想知道为什么在位置1而

  • 问题内容: 我想使用匿名函数,所以我决定制作一个简单的主要查找器。这里是: 然而,我发现了什么,就是在每次访问,而我希望它是一个字面上的数字。我怎样才能使其成为替代? 问题答案: 您可以在创建lambda时“捕获” 这会将lambda的上下文设置为等于创建时的值。您还可以说,如果需要的话,它并不能完全捕获,但是可以满足您的需要。 这是一个查找问题,类似于具有定义函数的以下内容:

  • 外部链接 关键参数 报告 method metrics(指标, 数据单位) 其他参数 外部链接 source/link/a pv_count (浏览量(PV)) pv_ratio (浏览量占比,%) visit_count (访问次数) visitor_count (访客数(UV)) new_visitor_count (新访客数) new_visitor_ratio (新访客比率,%) ip_c