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

 

 

 

 


推荐阅读
  • 本文详细介绍了 Java 网站开发的相关资源和步骤,包括常用网站、开发环境和框架选择。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 【妙】bug称它为数组越界的妙用
    1、聊一聊首先跟大家推荐一首非常温柔的歌曲,跑步的常听。本文主要把自己对C语言中柔性数组、零数组等等的理解分享给大家,并聊聊如何构建一种统一化的学习思想 ... [详细]
  • C语言中全部可用的数学函数有哪些?2.longlabs(longn);求长整型数的绝对值。3.doublefabs(doublex);求实数的绝对值。4.doublefloor(d ... [详细]
  • WinMain 函数详解及示例
    本文详细介绍了 WinMain 函数的参数及其用途,并提供了一个具体的示例代码来解析 WinMain 函数的实现。 ... [详细]
  • 字符串学习时间:1.5W(“W”周,下同)知识点checkliststrlen()函数的返回值是什么类型的?字 ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • malloc 是 C 语言中的一个标准库函数,全称为 memory allocation,即动态内存分配。它用于在程序运行时申请一块指定大小的连续内存区域,并返回该区域的起始地址。当无法预先确定内存的具体位置时,可以通过 malloc 动态分配内存。 ... [详细]
  • 深入解析C语言中结构体的内存对齐机制及其优化方法
    为了提高CPU访问效率,C语言中的结构体成员在内存中遵循特定的对齐规则。本文详细解析了这些对齐机制,并探讨了如何通过合理的布局和编译器选项来优化结构体的内存使用,从而提升程序性能。 ... [详细]
  • 在C语言程序开发中,调试和错误分析是确保代码正确性和效率的关键步骤。本文通过一个简单的递归函数示例,详细介绍了如何编写和调试C语言程序。具体而言,我们将创建一个名为 `factorial.c` 的文件,实现计算阶乘的功能,并通过逐步调试来分析和解决可能出现的错误。此外,文章还探讨了常见的调试工具和技术,如GDB和断点设置,以帮助开发者高效地定位和修复问题。 ... [详细]
  • 利用 fopen、fwrite、fread、fseek 和 fclose 实现文件中整型数据的读写操作 ... [详细]
  • 在当前的软件开发领域,Lua 作为一种轻量级脚本语言,在 .NET 生态系统中的应用逐渐受到关注。本文探讨了 Lua 在 .NET 环境下的集成方法及其面临的挑战,包括性能优化、互操作性和生态支持等方面。尽管存在一定的技术障碍,但通过不断的学习和实践,开发者能够克服这些困难,拓展 Lua 在 .NET 中的应用场景。 ... [详细]
  • C语言中类型自动转换的深入解析与应用
    C语言中类型自动转换的深入解析与应用 ... [详细]
  • Python默认字符解析:深入理解Python中的字符串处理
    在Python中,字符串是编程中最基本且常用的数据类型之一。尽管许多初学者是从C语言开始接触字符串,通常通过经典的“Hello, World!”程序入门,但Python对字符串的处理方式更为灵活和强大。本文将深入探讨Python中的字符串处理机制,包括字符串的创建、操作、格式化以及编码解码等方面,帮助读者全面理解Python字符串的特性和应用。 ... [详细]
  • 具备括号和分数功能的高级四则运算计算器
    本研究基于C语言开发了一款支持括号和分数运算的高级四则运算计算器。该计算器通过模拟手算过程,对每个运算符进行优先级标记,并按优先级从高到低依次执行计算。其中,加减运算的优先级最低,为0。此外,该计算器还支持复杂的分数运算,能够处理包含括号的表达式,提高了计算的准确性和灵活性。 ... [详细]
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社区 版权所有