如果可能的话,如何创建一个自定义函数来替换package.loaders table
中的第三个扩展。通过阅读手册 require/package.loaders,手册不清楚如何动态链接应用程序和库。
一旦它找到一个C库,这个插件首先使用一个动态链接工具将应用程序与库链接起来。
test
├── example.lua
└── libcexample.so
libcexample.so
require 'libcexample'
这个dynamic link facility
是什么?它可以在普通的包加载器之外使用吗?
2条答案
按热度按时间qlzsbp2j1#
这是一个非常特定于操作系统的问题,Lua不应该记录如何利用系统提供的API(或者如何完全实现动态链接器)。
5.1/loadlib.c包含Lua实现的细节:
package.loaders[3]
的默认实现是loader_C
,它调用ll_loadfunc
,而ll_loadfunc
又调用特定于操作系统的ll_load
和ll_sym
,以查找适当的入口点(以及ll_unloadlib
)。<dlfcn.h>
的dlopen
和dlsym
(以及dlclose
)。<dyld.h>
的NSCreateObjectFileImageFromFile
和NSLookupSymbolInModule
(以及NSUnLinkModule
)。dyld
,而支持dlfcn
,因此可以配置为使用后者。<windows.h>
(<libloaderapi.h>
)的LoadLibraryA
和GetProcAddress
(以及FreeLibrary
)。注意:
package.loadlib
是ll_loadlib
,它也调用ll_loadfunc
,但根据文档,它使用与require
/package.loaders[3]
不同的语义 Package 。当然,您可以自己实现所有这些功能,但这需要您对系统有特定的了解。
cbjzeqam2#
什么是动态链接工具?
“动态链接工具”是package.loadlib函数。
是否可以在正常的 Package 装载机之外使用?
是的