热门标签 | 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

 

 

 

 


推荐阅读
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • PyCharm下载与安装指南
    本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 资源推荐 | TensorFlow官方中文教程助力英语非母语者学习
    来源:机器之心。本文详细介绍了TensorFlow官方提供的中文版教程和指南,帮助开发者更好地理解和应用这一强大的开源机器学习平台。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 解决Linux系统中pygraphviz安装问题
    本文探讨了在Linux环境下安装pygraphviz时遇到的常见问题,并提供了详细的解决方案和最佳实践。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文详细介绍了如何在 Spring Boot 应用中通过 @PropertySource 注解读取非默认配置文件,包括配置文件的创建、映射类的设计以及确保 Spring 容器能够正确加载这些配置的方法。 ... [详细]
  • This document outlines the recommended naming conventions for HTML attributes in Fast Components, focusing on readability and consistency with existing standards. ... [详细]
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社区 版权所有