问题标签 [libffi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
185 浏览

c - 如何创建代表联合的 `ffi_type`?

我正在使用 libffi 调用一个需要联合类型参数的函数。

我不确定创建ffi_type描述联合类型的结构的确切规则是什么。例如,如果我有这个:

什么是正确的结构ffi_type

0 投票
2 回答
1496 浏览

cross-compiling - libffi 由 pkg-config 安装和识别,但不是由 glib

我想为 Windows 交叉编译 glib。配置抛出此错误:

配置:警告:使用不以主机三元组为前缀的交叉工具配置:错误:未满足包要求(libffi >= 3.0.0):

找不到包“libffi”

如果您以非标准前缀安装软件,请考虑调整 PKG_CONFIG_PATH 环境变量。

或者,您可以设置环境变量 LIBFFI_CFLAGS 和 LIBFFI_LIBS 以避免调用 pkg-config。有关更多详细信息,请参见 pkg-config 手册页。

但是pkg-config --modversion libffi打印“3.1”。我已经从 debian jessie 存储库安装了 libffi 和 libffi-dev。

(我不确定这是否属于超级用户,因为它也与包问题有关)

0 投票
3 回答
313 浏览

c - 如何创建代表 ac 数组的 `ffi_type`?

我将其表示a[3]struct包含三个char,但它会在 iOS i386 模拟器上失败。

任何人都知道如何处理这个问题?


这是一个演示该错误的演示。您应该使用不比更新的模拟器iPhone 5来运行BugReport项目,并且比iPhone 5看起来更新的模拟器在这种情况下没有问题。

0 投票
3 回答
204 浏览

valgrind - valgrind:获取未初始化内存的地址

我正在调试一个仅在我的程序的 PPC64 端口中出现的问题。

我有一个测试用例,其中 C 库qsort被赋予一个 libffi 生成的闭包作为字符串比较回调。字符串被正确地传递给回调,返回值被精确地存储到 libffi 传递给闭包函数的返回值缓冲区中。

但是,该数组未正确排序qsort。此外,Valgrind 报告 C 库 qsort 代码正在访问未初始化的内存,并--track-orgins=yes显示该内存是由 Libffi 堆栈分配的。我强烈怀疑这是返回值,因此由于垃圾比较,排序不正确。

即 Libffi 为返回值分配了缓冲区,并将该值传播给回调调用者;但是我的闭包调度函数被赋予了错误的指针,因此没有将返回值放在正确的位置。

由于某些奇怪的原因,Valgrind 不报告 未初始化内存的地址,只报告代码中发生使用的位置和分配的位置。

我只是想将该位置的地址与传递给闭包函数的指针进行比较:它们甚至是远程关闭的吗?

有没有办法从 Valgrind 中获取这些信息?


更新:我正在使用没有 root 权限的 GCC Compile Farm 机器;安装的 libffi 没有调试信息。它是 3.0.13 版本。

libffi但是,我刚刚构建的 git head重现了该问题。

我已经确认它是未初始化的返回值区域。

我在闭包调度汇编代码中添加了一条指令,用于在闭包调度堆栈帧的部分ffi_closure_LINUX64底部初始化一个双字大小的区域。RETVAL这使得 Valgrind 错误消失了;但当然返回值是垃圾。它还证实了一个基本的理智:调用闭包调度助手之前的代码和之后的代码引用相同的返回值区域。(堆栈指针没有意外移动,并且帧引用是正确的。)用户代码最终获得的任何地址都没有指向该返回值。

接下来,我将返回区域的初始化向下移动到名为 的 C 函数ffi_closure_helper_LINUX64中,靠近函数的入口。这也仍然使未初始化的错误消失,确认助手正在通过%r6(参数 4)获取正确的返回值区域地址。

0 投票
1 回答
314 浏览

c - 带有 void 函数的 libffi 分段错误

我无法确定此代码崩溃的原因:

它因分段错误错误而失败。据我所知,ffi_call如果ffi_prep_cifffi_type_void.

更新

lldb输出:

因此,它在 void 函数内崩溃(尝试取消引用a?,*之前a加了下划线)。

0 投票
1 回答
180 浏览

python-2.7 - Python wrapper install 给出“命令“python setup.py egg_info”失败,错误代码为 1”

在过去的两天里,我一直在尝试安装这个 Python 包装器。我在 Stack Overflow 上解决了所有其他问题。从字面上尝试了一切,但似乎没有任何效果。

我至少重新安装了所有东西,更新,尝试了 sudo -H,但似乎没有任何效果。这似乎是 setuptools 的问题,但我不知道如何解决它。

  • Mac OSX 10.11.6 (El Capitan)
  • Python 2.7.13
  • 点 9.0.1
0 投票
2 回答
18899 浏览

macos - 如何在 Mac OS X 上安装 libffi-dev

我正在尝试在 unix 上实现 micropython,这需要libffi-dev. 我是这样安装的brew install libffi-dev。但是好像没有 libffi-dev 可以找到。

有什么办法可以libffi-dev在 Mac os 上安装。谢谢你。

0 投票
2 回答
519 浏览

libtool - 如何强制 libtool 在 /lib 而不是 /lib64 中为 libffi 安装 64 位库

我正在尝试在 SLES-11 docker 容器中编译 libffi 64 位。

configure & make 行非常简单:

现在 libtool 在它的荣耀中决定像这样安装 .so:

摆脱 ../lib64 部分的魔术是什么?

0 投票
1 回答
359 浏览

macos - OSX stat() 和 libffi

我正在尝试使用 libffi 在 macos (10.11) 上访问 stat()。这是 SWI-Prolog 的新的基于 FFI 的外部接口的一部分。该接口解析<sys/stat.h>头部以获取函数原型和struct stat类型。但是,我得到了虚假的值。如果我编译下面的代码并mystat从生成的.dylib.

我怀疑我statdlsym(). /usr/lib/libc.dylib在和上都试过了/usr/lib/libSystem.B.dylib。这给出了相同的结果。如果我nm从上面的 dylib 上运行,我会得到 U _stat$INODE64. dlsym不工作stat$INODE64。查看 libc.dylib 我们得到

两者有什么关系?任何人都有任何线索可能会发生什么?

0 投票
1 回答
115 浏览

c - 在 x86 Windows 上使用 STDCALL ABI 关闭会导致 LibFFI 3.2.1 的堆栈溢出异常

我正在使用libffi 库(版本 3.2.1)通过允许脚本编写者创建用于调用 API 函数的原型或定义与 API 兼容的回调函数来启用与脚本语言的 API 接口。

在 x64 上,Windows 上只使用一种调用约定;libffi中的WIN64。这与库中的闭包完美配合,脚本编写者可以轻松创建回调函数,可用于 EnumChildWindows(HWND, WNDENUMPROC, LPARAM) 等调用

但是,在 x86 上,使用由 LibFFI 和 STDCALL ABI 创建的闭包调用 EnumChildWindows 会导致发生堆栈溢出异常。根据报告的问题,这是由于在调用 trampoline 函数时错误分配了参数。(x86 stdcall (win32) 错误地对齐堆栈参数win32 x86 stdcall 闭包:闭包调用后错误地恢复堆栈)。

我已经尝试应用这些问题报告中提到的补丁,但是它们似乎并没有解决我的测试用例的问题。我有另一个测试用例来确定它是否真的是参数对齐,方法是创建一个没有任何参数的回调函数;从外部二进制文件调用它。这个 STDCALL 函数被正确调用并且没有问题发生,因为不需要参数对齐。

在绝望的状态下,我尝试使用与 3.2.1 相同的工具链编译 libffi 存储库的提示版本,但是该版本抱怨不支持 x86 Windows 目标(sysv.S 中的 asm 语法错误)。由于 CRT 与生成的静态库的静态链接,我需要在 MSVC 中编译该库。

最后,我对解决方案的问题包括几个选项

  • 有没有人有 3.2.1 的补丁来修复 Windows x86 上的 stdcall 问题
  • 有谁知道用 MSVC 为 x86 目标编译提示版本的方法
  • 谁能告诉我如何将 LibFFI 编译为具有完全静态链接依赖项的静态库(CRT/pthreads,我尝试使用 gcc -static ... -static-libgcc -lpthreads -lrt),因为我的尝试仍然产生“未解析的符号”关于即pthread

一个多星期以来,我一直在寻找解决方案,我假设我缺少一些明显的东西,因为许多项目都使用了该库。

谢谢你,
巴斯