需求:需要用Lua调用已有的.so动态链接库。查了很多需要修改.so文件内容的方法,但感觉比较麻烦。后来发现一个Alien的工具(https://github.com/mascarenhas/alien),基于该工具可以在Lua程序里面调用.so中的API。下面是尝试过程。PS:我用的Kali的虚拟机,对应的Linux系统版本为Debian 4.18.10-2。
一、安装Lua
apt-get update
apt-get install lua5.3
二、安装luarocks
luarocks是Lua模块的软件包管理器。
apt-get install luarocks
也可以通过以下方法安装
【
wget http://luarocks.org/releases/luarocks-3.0.4.tar.gz
tar zxpf luarocks-3.0.4.tar.gz
cd uarocks-3.0.4
./configure
make bootstrap
】
三、安装Alien
luarocks install alien
【PS:安装过程中会出现非常多的问题,需要大量依赖,不过都可以利用apt-get install 命令安装,我在安装过程中安装了如下命令】
apt-get install automake
apt-get install libtool
apt-get install libffi-dev
apt-get install markdown
在安装上述依赖包时,可能会提示重启某些服务的情况,敲回车即可。如果出现不能安装的情况,可以网上查找相应依赖包的源码,进行编译。
安装完成后,在lua环境中测试:
require("alien_c")
require("alien")
如果显示:table:0x....并且不报错,说明alien安装成功
四、简单测试基于Alien调用c语言API
1 编写helloworld.c文件
#include
char* hello(char* input)
{
return input;
}
int main()
{
char* input = hello("hello world!\n");
printf(input);
return 0;
}
2 编译动态链接库
gcc helloworld.c -shared -fPIC -o hello. so
【-shared 表明要生成一个可共享的对象(具体查看下面的英文介绍)
Produce a shared object which canthen be linked with other objects to form an executable. Not all systems support this option. For predictable results, you must also specify thesame set of options that were used togenerate code (`-fpic', `-fPIC', or model suboptions) when youspecify this option.(1)
-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code), 则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意 位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。】
这样就在当前目录下生成了一个so文件hello.so
3 编写并测试Lua脚本test.lua
#!/usr/bin/lua
alien = require("alien_c") --1.加载alien
libc = alien.load("./hello.so") -- 2.加载动态链接库so,dll都可以
libc.hello:types("string","string") -- 3.说明参数类型:例如输入一个j
son,返回一个json
in_str="hello world"
out_str = libc.hello(in_str) -- 调用
print(out_str)
保存后执行下面命令
lua test.lua
发现执行成功。
至此完成了Lua调用so的简单测试。
【参考文献】
- https://blog.csdn.net/a_ran/article/details/41943749
- https://blog.csdn.net/sm9sun/article/details/77882959
- https://luarocks.org/
- https://github.com/mascarenhas/alien
- https://www.cnblogs.com/wolfred7464/p/5147675.html