如何解决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 举报,一经查实,本站将立刻删除。