通过内存地址加载Lua函数变量?

时间:2014-10-15 01:08:45

标签: c++ c memory lua memory-address

是否可以通过所请求函数的内存地址加载函数变量?

aFunctionVar = loadFunc(memAddress)
if type(aFunctionVar) == 'function' then "this var is a function!" end

是否可以在Lua中使用loadFunc()?

1 个答案:

答案 0 :(得分:3)

Lua函数(与大多数脚本语言中的函数一样)没有固定的内部地址[1]。每次Lua执行function表达式时,它会在某个任意地址为它分配一个新的闭包。以前运行的函数闭包的地址完全没用;在当前运行期间,该地址几乎不可能存在功能。

即使你确实拥有同一进程中某个函数的内存地址,vanilla Lua也没有提供任何“加载”它的方法,无论是在脚本内部还是从C API中都没有。

如果需要序列化函数,可以使用string.dump,它将返回传递函数的字节码字符串,可以使用loadstringload加载,具体取决于Lua版本。请注意,此字节码独立于源函数的代码;无论您对源代码的更改如何,该函数都会执行转储时执行的任何操作。此外,string.dump无法序列化函数的upvalues。


[1]哎呀,即使C函数也可能没有从运行到运行的固定地址;共享库中的函数需要能够放在内存中的任何位置以避免冲突。