C语言 用于共享对象库的Lua 5.1自定义加载器

8ehkhllq  于 2023-10-16  发布在  其他
关注(0)|答案(2)|浏览(91)

如果可能的话,如何创建一个自定义函数来替换package.loaders table中的第三个扩展。通过阅读手册 require/package.loaders,手册不清楚如何动态链接应用程序和库。
一旦它找到一个C库,这个插件首先使用一个动态链接工具将应用程序与库链接起来。

test
├── example.lua
└── libcexample.so

libcexample.so

require 'libcexample'

这个dynamic link facility是什么?它可以在普通的包加载器之外使用吗?

qlzsbp2j

qlzsbp2j1#

这是一个非常特定于操作系统的问题,Lua不应该记录如何利用系统提供的API(或者如何完全实现动态链接器)。
5.1/loadlib.c包含Lua实现的细节:
package.loaders[3]的默认实现是loader_C,它调用ll_loadfunc,而ll_loadfunc又调用特定于操作系统的ll_loadll_sym,以查找适当的入口点(以及ll_unloadlib)。

  • 在Linux/Solaris/BSD/etc上,这使用<dlfcn.h>dlopendlsym(以及dlclose)。
  • 在达尔文(MacOSX)上,这使用了<dyld.h>NSCreateObjectFileImageFromFileNSLookupSymbolInModule(以及NSUnLinkModule)。
  • 请注意,现代达尔文(Mac OS X >= 10.3,macOS)不赞成dyld,而支持dlfcn,因此可以配置为使用后者。
  • 在Windows上,它使用<windows.h><libloaderapi.h>)的LoadLibraryAGetProcAddress(以及FreeLibrary)。

注意:package.loadlibll_loadlib,它也调用ll_loadfunc,但根据文档,它使用与require/package.loaders[3]不同的语义 Package 。
当然,您可以自己实现所有这些功能,但这需要您对系统有特定的了解。

cbjzeqam

cbjzeqam2#

什么是动态链接工具?
“动态链接工具”是package.loadlib函数。
是否可以在正常的 Package 装载机之外使用?
是的

相关问题