学习lua-resty-string的lua ffi使用遇到个问题。

153 views
Skip to first unread message

cheng ye

unread,
Jul 21, 2017, 10:17:24 PM7/21/17
to openresty

为什么春哥调用ngx的一些c函数不需要使用ffi.load来载入对应的动态链接库。这些函数不是c标准库啊,不是只有c标准库才可以不用ffi.load方法么


Zexuan Luo

unread,
Jul 22, 2017, 6:01:01 AM7/22/17
to openresty
ffi 可以调用已经导出的符号。
在 OpenResty 上下文里,nginx 的 C 函数、OpenSSL 的 C 函数、还有另外一些编译进来的 nginx 的第三方模块,这些都是可以被直接调用的。
(所以你可以编写一个 Nginx C 模块,然后通过 Lua 代码调用它的函数)
当然之所以可以这么做,从根本来说,是因为编译器默认编译的时候,就把它们编译成可导出的符号。

假如你用 MSVC 来编译,默认的情况下是不会导出符号的,这时候就无法直接调用这些 C 函数了。

在 2017年7月22日星期六 UTC+8上午10:17:24,cheng ye写道:

Zexuan Luo

unread,
Jul 22, 2017, 6:11:28 AM7/22/17
to openresty
顺便一提,如果你对具体有哪些函数可以直接调用(已导出),可以执行下面这个命令:(仅在Linux上有效)
readelf -Ws $(which nginx)

其他系统上也有类似的方法,你搜索下。

在 2017年7月22日星期六 UTC+8下午6:01:01,Zexuan Luo写道:

cheng ye

unread,
Jul 23, 2017, 1:31:11 AM7/23/17
to openresty
嗯嗯,有没有什么推荐的书籍方便我去了解这方面的知识呢?。还有就是谢谢大神解答,好几次问问题都看到你热心的回复了。真心感谢🙏

在 2017年7月22日星期六 UTC+8下午6:11:28,Zexuan Luo写道:

Zexuan Luo

unread,
Jul 23, 2017, 3:28:27 AM7/23/17
to openresty
你这个问题还真把我问倒了。相关的书籍,还真没有。最好的途径就是多阅读源码,外加动手实践。

cheng ye

unread,
Jul 23, 2017, 3:31:28 AM7/23/17
to openresty
哈哈,估计要在好好看看c语言了。以前学过,现在都忘了。主要lua的ffi中经常用到c。不得不学啊

在 2017年7月23日星期日 UTC+8下午3:28:27,Zexuan Luo写道:
Reply all
Reply to author
Forward
0 new messages