gpt4 book ai didi

c - LuaJIT FFI 不从可执行文件加载符号

转载 作者:行者123 更新时间:2023-12-01 09:09:16 26 4
gpt4 key购买 nike

第一个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

新的 Lua 代码:

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) 字符串数组,printc 写入该数组。 LuaJIT 通过加载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.* 函数。

关于c - LuaJIT FFI 不从可执行文件加载符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59765177/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com