在 Arch Linux 上尝试使用 C 编写 Lua 模块会崩溃

我编写了下面这个 C 文件(用于 lua 5.1)bar_src.c:

#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 上执行了相同的操作(使用 Ubuntu 18.04 运行),一切都完美工作,这意味着我的 Linux 配置存在问题。

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

Core was generated by `lua'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00005620820f3ad3 in lua_pushvalue ()
点赞
用户14881086
用户14881086

问题是我正在使用lua 5.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()的替代函数。

我将我的代码改成了这样:

#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;
}

这段代码可以完美编译,当我要求它时,没有出现segfaults。

2021-08-17 10:53:20