Try removing -static and/or adding -Wl,-E to your cc command. Also,
why do you say "the symbol is there" when the very nm command you ran
indicated that it was "U"ndefined?
I said that because in macos it is also U and it works there. nm was just some voodoo I picked up to find the entry points etc. Similar posts about this issue had people asking for the output of nm and it seemed acceptable
Joseph C. Sible
On Sun, Aug 8, 2021 at 6:21 PM Peter Hickman
<peterhickman386@googlemail.com> wrote:
>
> Well I have the error now and it is a bit of an issue. First some set up
>
> The C wrapper
>
> #include <lauxlib.h>
> #include <lua.h>
> #include <lualib.h>
> int main(int argc, char **argv) {
> const char *error;
> lua_State *L = luaL_newstate();
> luaL_openlibs(L);
> if (luaL_dofile(L, "here/boot.lua") == LUA_OK) {
> lua_pop(L, lua_gettop(L));
> } else {
> error = lua_tostring(L, -1);
> puts(error);
> }
> lua_close(L);
> return 0;
> }
>
> is compiled with
>
> cc -o here.Linux.x86_64 boot.c -Wall -Werror -fPIC -ansi -static -O3 -DLUA_C89_NUMBERS -I/usr/include/lua5.3/ -llua5.3 -lm -ldl
>
> Which issues only 1 warning
>
> /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/liblua5.3.a(loadlib.o): In function `lookforfunc':
> (.text+0x596): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
>
> There is only 1 version of lua on this computer, 5.3, and if I run the script from the shell
>
> $ lua5.3 here/boot.lua
>
> It works just fine, if I run the compiled version
>
> $ ./here.Linux.x86_64
> here/boot.lua:31: ./here/lib/socket/core.so: undefined symbol: lua_gettop
>
> But the symbol is there
>
> $ nm ./here/lib/socket/core.so | grep lua_gettop
> U lua_gettop
>
> Now my googling seems to say that luasocket is probably not being compiled in a way that exports the symbols correctly but the posts I've found are focused on lua <-> rust / python bridges and older versions of lua, 5.1
>
> However I am installing luasocket as a dependency of luasec with luarocks so I am unaware of the correct incantation to get the magic to happen
>
> The same C and lua scripts work just fine on on my mac (slightly different cc options because you can't do a real static compile on macos)
>
> Any pointers for me here or should I be skipping luarocks and compiling luasocket from source (which I would prefer not to)?
>
>