不好意思,刚邮件还没有写完就发送出去了。接着说我刚没说完的问题
恩,我想问的是openssl的库是通过ffi.load加载而后被调用的,
但是nginx中的函数是如何被嵌入到string.lua中的呢?
lua是嵌入的语言,我目前只知道两种嵌入(lua嵌入c):
1. lua通过安装luajit,通过调用ffi.load加载c库;
2. lua通过lua_State调用c;
问下,我这儿的调用(string.lua调用nginx中的ngx_hex_dump函数)跟这两种有什么区别呢?
或者我可以参考什么代码或者文档学习?谢谢了
On Thursday, December 24, 2015 at 3:30:48 PM UTC+8, YuanSheng Wang wrote:
>
调用出现问题,我查了下string.lua中to_hex的实现:
这个问题同样是因为宿主程序 nginx 和 luajit 的区别引起的。 nginx 内部对外导出了 ngx_hex_dump 函数,而 luajit 是没有的。
lua 是一个嵌入式语言,会因为不同的宿主程序使得 lua 可以有完全不同的功能。所以我们才说它是 嵌入式 语言。
2015-12-24 15:15 GMT+08:00 Paul Von
<paul...@gmail.com>:
恩,按照你的方式我将md5.lua文件修改如下:
md5.lua
local ffi = require "ffi"
local ffi_new = ffi.new
local ffi_str = ffi.string
--local C = ffi.C
local C = ffi.load("/usr/local/openssl-1.0.2/lib/libcrypto.so.1.0.0")
local setmetatable = setmetatable
openssl的api接口调用没有什么问题了,但是
local str = require "resty.string"
print("md5: ", str.to_hex(digest))
调用出现问题,我查了下string.lua中to_hex的实现:
local C = ffi.C
function _M.to_hex(s)
local len = #s * 2
local buf = ffi_new(str_type, len)
C.ngx_hex_dump(buf, s, #s)
return ffi_str(buf, len)
end
On Thursday, December 24, 2015 at 4:18:05 AM UTC+8, agentzh wrote:
Hello!
2015-12-22 23:04 GMT-08:00 Paul Von:
> 最近下了春哥的lua_resty_string_master库,这个库在nginx下运行调试时一点问题都没。但我想单独的将lua_resty_string_master中的lua脚本拿出来运行测试,别嵌在nginx中,但是在luajit
> test_md5.lua时出现:
> [root@fcc-dev test_lua_resty_string]# luajit test_md5.lua
> luajit: ./md5.lua:44: luajit: undefined symbol: MD5_Init
>
MD5_Init 是 OpenSSL 库里的 C 函数,这里 LuaJIT 报告它找不到这个符号。之所以在 nginx 里可以运行是因为你的
nginx 已加载了 OpenSSL 库,而 luajit 这个命令行工具并没有加载 OpenSSL. 解决的办法是自己通过
ffi.load() 函数加载 OpenSSL 对应的动态链接库文件。
Regards,
-agentzh
--