LuaJIT FFI无法从可执行文件加载符号

累加器

第一个Lua代码:

local ffi = require "ffi"

ffi.cdef[[
void printc(const char *fmt, ...);
]]
ffi.C.printc("Hello world")

不起作用。错误:

boot.lua:6: /usr/lib64/libluajit-5.1.so.2: undefined symbol: printc

但是,该符号实际上是在运行LuaJIT的可执行文件中定义的(并且函数声明是从C复制粘贴的):

$ nm --defined-only build/a.out | grep printc
00000000000650c1 T printc

我对解决方案的第一个想法是用与可执行文件相同的符号构建一个共享库,并将其加载到LuaJIT中:

$ cc -fPIC -shared $LDFLAGS $OFILES -o build/a.so

新月代码:

local ffi = require "ffi"
lib = ffi.load("./build/a.so")
ffi.cdef[[
void printc(const char *fmt, ...);
]]
lib.printc("Hello world")

这使我可以调用该printc函数。但是,有一个很大的问题:加载的库使用与正在运行的程序不同的内存空间。缓冲区lib.printc("Hello world")被写不是LuaJIT在使用运行相同缓冲程序。它就像是在交互一个完全不同的过程。

printc应该打印到LuaJIT在其中运行的可执行文件的控制台子系统。控制台缓冲区存储为写入的全局extern字符串数组printcLuaJIT通过加载获取的全局控制台缓冲区a.so指向的内存地址不同于正在运行的a.out程序的全局控制台缓冲区

因此,这不是可行的解决方案。我不知道该怎么办。这些符号已作为我的可执行文件的一部分导出,但LuaJIT并未加载它们。我也无法ffi.load执行:

lib = ffi.load("./build/a.out")

boot.lua:2: ./build/a.out: cannot dynamically load position-independent executable

如何获得LuaJIT FFI从正在运行的可执行文件中加载符号?

累加器

传递该-rdynamic标志cc可解决此问题,从而允许LuaJIT运行ffi.C.*程序中的功能。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将函数从C ++可执行文件公开给LuaJIT

来自分类Dev

如何将函数从C ++可执行文件公开给LuaJIT

来自分类Dev

无法加载可执行文件

来自分类Dev

将LuaJIT FFI结构转换为表

来自分类Dev

使用LuaJit进行FFI加密/解密

来自分类Dev

将LuaJIT FFI结构转换为表

来自分类Dev

无法使LuaJIT与cygwin一起编译

来自分类Dev

无法使LuaJIT与cygwin一起编译

来自分类Dev

无法从mkbundle的可执行文件加载程序集

来自分类Dev

LuaJIT ffi cdata和Torch Tensor之间的最佳转换

来自分类Dev

luajit ffi函数返回字符串的奇怪输出

来自分类Dev

Luajit ffi如何在time.h中调用funcitons?

来自分类Dev

嵌入LuaJIT-创建包含文件夹

来自分类Dev

嵌入LuaJIT-创建包含文件夹

来自分类Dev

gdb:无法重新编译可执行文件:(未找到调试符号)

来自分类Dev

符号链接找不到所需的可执行文件

来自分类Dev

制作可执行文件的符号链接

来自分类Dev

加载与可执行文件合并的文件

来自分类Dev

可执行文件将无法执行

来自分类Dev

更改Django 1.7加载的python可执行文件

来自分类Dev

指向可执行文件的符号链接无法启动应用程序,错误:<符号链接>不存在

来自分类Dev

PowerShell无法识别外部可执行文件

来自分类Dev

安装perlbrew:无法检索patchperl可执行文件

来自分类Dev

无法链接到主可执行文件

来自分类Dev

Apple Dsymutil错误“无法打开可执行文件”

来自分类Dev

无法从C ++启动可执行文件

来自分类Dev

无法保存来自UNIX可执行文件的输出

来自分类Dev

安装perlbrew:无法检索patchperl可执行文件

来自分类Dev

Eclipse gdb无法调试Cygwin可执行文件