问题标签 [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.
c - 如何创建代表联合的 `ffi_type`?
我正在使用 libffi 调用一个需要联合类型参数的函数。
我不确定创建ffi_type
描述联合类型的结构的确切规则是什么。例如,如果我有这个:
什么是正确的结构ffi_type
?
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。
(我不确定这是否属于超级用户,因为它也与包问题有关)
c - 如何创建代表 ac 数组的 `ffi_type`?
我将其表示a[3]
为struct
包含三个char
,但它会在 iOS i386 模拟器上失败。
任何人都知道如何处理这个问题?
这是一个演示该错误的演示。您应该使用不比更新的模拟器iPhone 5
来运行BugReport
项目,并且比iPhone 5
看起来更新的模拟器在这种情况下没有问题。
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)获取正确的返回值区域地址。
c - 带有 void 函数的 libffi 分段错误
我无法确定此代码崩溃的原因:
它因分段错误错误而失败。据我所知,ffi_call
如果ffi_prep_cif
用ffi_type_void
.
更新
lldb
输出:
因此,它在 void 函数内崩溃(尝试取消引用a
?,*
之前a
加了下划线)。
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
macos - 如何在 Mac OS X 上安装 libffi-dev
我正在尝试在 unix 上实现 micropython,这需要libffi-dev
. 我是这样安装的brew install libffi-dev
。但是好像没有 libffi-dev 可以找到。
有什么办法可以libffi-dev
在 Mac os 上安装。谢谢你。
libtool - 如何强制 libtool 在 /lib 而不是 /lib64 中为 libffi 安装 64 位库
我正在尝试在 SLES-11 docker 容器中编译 libffi 64 位。
configure & make 行非常简单:
现在 libtool 在它的荣耀中决定像这样安装 .so:
摆脱 ../lib64 部分的魔术是什么?
macos - OSX stat() 和 libffi
我正在尝试使用 libffi 在 macos (10.11) 上访问 stat()。这是 SWI-Prolog 的新的基于 FFI 的外部接口的一部分。该接口解析<sys/stat.h>
头部以获取函数原型和struct stat
类型。但是,我得到了虚假的值。如果我编译下面的代码并mystat
从生成的.dylib
.
我怀疑我stat
从dlsym()
. /usr/lib/libc.dylib
在和上都试过了/usr/lib/libSystem.B.dylib
。这给出了相同的结果。如果我nm
从上面的 dylib 上运行,我会得到
U _stat$INODE64
. dlsym
不工作stat$INODE64
。查看 libc.dylib 我们得到
两者有什么关系?任何人都有任何线索可能会发生什么?
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
一个多星期以来,我一直在寻找解决方案,我假设我缺少一些明显的东西,因为许多项目都使用了该库。
谢谢你,
巴斯