热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Lua调用动态链接库尝试

需求:需要用Lua调用已有的.so动态链接库。查了很多需要修改.so文件内容的方法,但感觉比较麻烦。后来发现一个Alien的工具(http

需求:需要用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的简单测试。

 

【参考文献】

  1. https://blog.csdn.net/a_ran/article/details/41943749
  2. https://blog.csdn.net/sm9sun/article/details/77882959
  3. https://luarocks.org/
  4. https://github.com/mascarenhas/alien
  5. https://www.cnblogs.com/wolfred7464/p/5147675.html

 

 

 

 


推荐阅读
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • systemd-nspawn可以创建最轻量级的容器(ns的意思就是namespace),本文的实验平台是Ubuntu16.04,x86_64机器。本文的目的是:在Ubuntu中用syst ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • Netty源代码分析服务器端启动ServerBootstrap初始化
    本文主要分析了Netty源代码中服务器端启动的过程,包括ServerBootstrap的初始化和相关参数的设置。通过分析NioEventLoopGroup、NioServerSocketChannel、ChannelOption.SO_BACKLOG等关键组件和选项的作用,深入理解Netty服务器端的启动过程。同时,还介绍了LoggingHandler的作用和使用方法,帮助读者更好地理解Netty源代码。 ... [详细]
  • 本文整理了Java中org.gwtbootstrap3.client.ui.Icon.addDomHandler()方法的一些代码示例,展示了Icon.ad ... [详细]
  • 我正在使用sql-serverkafka-connect和debezium监视sqlserver数据库,但是当我发布并运行我的wo ... [详细]
author-avatar
yklyh
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有