在下详细地看了lua-resty-core这种ffi调用ABI的方式 有一些原理上的疑惑 希望能得到春哥的指点 :)
场景描述:
1.在nginx中添加一个addon(与模块ngx-lua平行) 此模块向外暴露出一个extern的函数接口 此例中即int ffi_test_func()
2.nginx.conf:
content_by_lua_file 'ffi_test_func.lua';
3.ffi_test_func.lua:
local ffi = require 'ffi'
local tonumber = tonumber
local C = ffi.C
local ngx = ngx
ffi.cdef[[
int ffi_test_func();
]]
function ffi_test_func()
return tonumber(C.ffi_test_func())
end
ngx.say("::"..tostring(ffi_test_func()))
问题:
luajit的ffi.C域函数是怎么找到ffi_test_func函数的?这一部分实现的代码在何处?
传统的so加载是在运行过程中动态load的 而lua-resty-core的这种寻找ABI函数的方式应该不是在链接过程中完成的 但是 如果是在nginx启动过程中 是如何找到自己的GLOBAL函数的呢?
在 2015年11月3日星期二 UTC+8上午11:52:37,agentzh写道:
Hello!
2015-11-03 11:49 GMT+08:00 Yun Thanatos:
>
> 看了下resty-core的实现 这种解决方法确实具有很强的整体性 而且便于后期的维护 : )
>
谢谢。后续 ngx_lua 新添加的较大的 Lua API 主要就只走 lua-resty-core 这一种形式了,比如 ngx.ssl,
ngx.balancer, ngx.semaphore 等模块,而 ngx_lua 核心只暴露 ABI 供外部 Lua 代码通过 FFI
直接调用。这样也可以鼓励大家定制自己的 Lua 包裹实现。
Regards,
-agentzh