首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试在Arch Linux上用C语言编写Lua模块将会出现segfault

尝试在Arch Linux上用C语言编写Lua模块将会出现segfault
EN

Stack Overflow用户
提问于 2021-08-16 21:37:44
回答 1查看 117关注 0票数 1

我写了以下C文件(针对Lua5.1) bar_src.c

代码语言:javascript
复制
#include <lua5.1/lua.h>
#include <lua5.1/lauxlib.h>
#include <lua5.1/lualib.h>

static int foo(lua_State *L)
{
  int a = luaL_checknumber(L, 1);
  int b = luaL_checknumber(L, 2);

  lua_pushnumber(L, a + b);

  return 1;    
}

luaL_Reg foolib[] = {
  {"foo", foo},
  {NULL, NULL}
};

int luaopen_bar(lua_State *L)
{
  luaL_register(L, "bar", foolib);
  return 1;
}

并编译为:gcc -shared -fpic -o bar.so bar.c -llua5.1。然而,每当我尝试在lua中运行require("bar")时,它立即执行segmentation fault (core dumped)

我想在另一个系统上试用,所以我在repl.it (运行在Ubuntu18.04上)上做了同样的事情,一切都运行得很好,这意味着我的Linux配置有一个问题。

编辑:我在/var/lib/systemd/coredump中找到了段错误的核心转储,并使用gdb $(which lua) /var/lib/systemd/coredump/core.lua.[file]将其加载到GDB中,gdb说:

代码语言:javascript
复制
Core was generated by `lua'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00005620820f3ad3 in lua_pushvalue ()
EN

回答 1

Stack Overflow用户

发布于 2021-08-17 10:53:21

问题是我使用的是Lua5.4解释器,我应该用lua5 .1命令来运行它。

在本例中,我使用了旧版本的Lua,Lua 5.1,但是Lua的arch包安装了5.1、5.2、5.3和最新的5.4。虽然5.4的文档不多,但有一本参考手册。编译器说luaL_register函数不在Lua 5.4中,但我找到了一个叫做luaL_newlib() in the manual的替代函数。

我更改了我的代码,如下所示:

代码语言:javascript
复制
#include <lua5.1/lua.h>
#include <lua5.1/lauxlib.h>
#include <lua5.1/lualib.h>

static int foo(lua_State *L)
{
  int a = luaL_checknumber(L, 1);
  int b = luaL_checknumber(L, 2);

  lua_pushnumber(L, a + b);

  return 1;    
}

luaL_Reg foolib[] = {
  {"foo", foo},
  {NULL, NULL}
};

int luaopen_bar(lua_State *L)
{
  luaL_newlib(L, foolib);
  return 1;
}

这段代码编译得很好,当我required它时,没有段错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68809493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档