微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PANIC:调用 Lua API 时出现未受保护的错误未定义符号:lua_gettop

如何解决PANIC:调用 Lua API 时出现未受保护的错误未定义符号:lua_gettop

我的环境是 Lua-5.4.2 Luasocket-3.0-rc1。 当我直接运行 lua 脚本时,它工作成功。 当我用c语言运行它时,它告诉我错误

错误消息是: PANIC:调用 Lua API 时出现未受保护的错误错误运行脚本:从文件“/usr/local/lib/lua/5.4/socket/core.so”加载模块“socket.core”时出错:未定义符号:lua_gettop) 中止(核心转储)

有人知道为什么吗?

lua 脚本代码为:(test.lua)

#!/usr/local/bin/lua
local socket = require("socket")
print(socket._VERSION)

c 代码是:(main.c)

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
int main(void)
{
    lua_State *L;
    L = luaL_newstate();
    luaopen_base(L);
    luaL_openlibs(L);
        
    printf("lua enter\n");
    if (luaL_dofile(L,"test.lua"))
    {
        luaL_error(L,"error running script: %s",lua_tostring(L,-1));
    }
    printf("lua exit\n");
     
    while(1) pause();
    lua_close(L);
    return 0;
}

解决方法

tl;dr:将 -Wl,-E 传递给 GCC。

我能够用这个 Dockerfile 重现你的问题:

FROM gcc:11.1.0
RUN wget https://www.lua.org/ftp/lua-5.4.2.tar.gz \
 && git clone https://github.com/diegonehab/luasocket.git
RUN tar zxf lua-5.4.2.tar.gz \
 && cd lua-5.4.2 \
 && make linux \
 && make install \
 && cd ../luasocket \
 && git checkout 5b18e475f38fcf28429b1cc4b17baee3b9793a62 \
 && make linux LUAV=5.4 \
 && make install LUAV=5.4
COPY test.lua main.c ./

当我在生成的 Docker 容器中运行 lua test.lua 时,它工作正常。当我运行 gcc -o test main.c /usr/local/lib/liblua.a -ldl -lm -Wl,-rpath='/usr/local/lib/lua/5.4/socket' && ./test 时,我和你一样恐慌。

独立的 Lua 二进制文件有效而您的无效的原因是前者is linked with -E

MYLDFLAGS= $(LOCAL) -Wl,-E

ld's documentation for -E 是这样说的:

如果您使用 dlopen 加载一个动态对象,该对象需要引用回由程序定义的符号,而不是其他一些动态对象,那么您可能需要在链接程序本身时使用此选项.

Lua 使用 dlopen 加载您 require 的 C 模块,并且所述模块需要调用 Lua 函数,这些函数链接到您的二进制文件中,因此您需要此选项是有道理的。事实上,当我将 -Wl,-E 添加到 GCC 命令行时,它对我来说效果很好:

root@077bbb831441:/# gcc -o test main.c /usr/local/lib/liblua.a -ldl -lm -Wl,-rpath='/usr/local/lib/lua/5.4/socket' -Wl,-E && ./test
lua enter
LuaSocket 3.0-rc1
lua exit

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。