В общем есть сервер игры garry's mod (source hl2) на линукс, по стандарту там есть видоизмененная библиотека lua5.1 под названием lua_shared.so, при том что она изменена названия функцйия библиотеки те же, т.е. не изменены. И так, есть задача написать модуль который загружается с помощью функции require из пути /lua/bin/ . Библиотека имеет две экспортируемые функции, это gmod13_open и gmod13_close. По стандарту ф этим функциям при вызове передается параметр луа машины lua_State. Так вот, компилирую код
#ifdef _WIN32
#define DLL_EXPORT extern "C" __declspec( dllexport )
#else
#define DLL_EXPORT extern "C" __attribute__((visibility("default")))
#endif
extern "C"
{
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
static void lua_print(lua_State* L, const char* msg)
{
lua_getglobal(L, "print");
lua_pushstring(L, msg);
lua_call(L, 1, 0);
}
static int lua_testfunction(lua_State* l)
{
return 0;
}
static const luaL_Reg module[] =
{
{"TestFunction", lua_testfunction},
{NULL, NULL}
};
DLL_EXPORT int gmod13_open(lua_State* L)
{
lua_print(L, "-> ekau module loaded.");
luaL_register(L, "ekau", module);
return 0;
}
DLL_EXPORT int gmod13_close(lua_State* L)
{
return 0;
}
С помощью shell скрипта
#!/usr/bin/sh
LIBPATH=/home/independent/.steam/steam/steamapps/common/GarrysMod/garrysmod/lua/bin/
LUASHARED=/home/independent/.steam/steam/steamapps/common/GarrysMod/garrysmod/bin/
gcc -fPIC -m32 -I../gmod-module-base/include/ -I../lua-5.1.5/src/ main.cpp -shared -Wl,-soname,lua_shared.so,--no-undefined -DGMMODULE -o library -L$LUASHARED -l:lua_shared.so
mv library $LIBPATH'/gmsv_ekau_linux.dll'
Вызываю в игре функцию require с параметром "ekau" и получаю на выходе такую ошибку
Couldn't load module library!
1: (message = "Couldn't load module library!") [lua/gcompute/execution/local/gluaexecutioninstance.lua: 178]
2: ("ekau", userdata: 0xc7467a38, "/home/independent/.steam/steam/steamapps/common/GarrysMod/garrysmod/lua/bin/gmsv_ekau_linux.dll: undefined symbol: lua_getfield", "Couldn't load module library!") [[C]: -1]
3: xpcall (function (message)) [[C]: -1]
4: Start (self = { GCompute.Execution.GLuaExecutionInstance: 0xc6a5a9f0 }) [lua/gcompute/execution/local/gluaexecutioninstance.lua: 173]
5: CreateExecutionInstance (self = { GCompute.Execution.GLuaExecutionContext: 0xc69dcd30 }, code = "require \"ekau\"", sourceId = "@repl_0", instanceOptions = 6, callback = nil) [lua/gcompute/execution/executioncontext.lua: 56]
6: HandleExecutionInstanceCreationRequest0 (self = { GCompute.Execution.RemoteExecutionContextHost: 0xc71158f0 }, connection = { GLib.Net.Connection: 0xcc50f580 }, inBuffer = { GLib.Net.Layer1.PinnedNetInBuffer: 0xc74a0b40 }) [lua/gcompute/execution/remote/remoteexecutioncontexthost.lua: 94]
7: (self = { GCompute.Execution.RemoteExecutionContextHost: 0xc71158f0 }, connection = { GLib.Net.Connection: 0xcc50f580 }, inBuffer = { GLib.Net.Layer1.PinnedNetInBuffer: 0xc74a0b40 }) [lua/gcompute/execution/remote/remoteexecutioncontexthost.lua: 78]
8: xpcall (GLib.Error) [[C]: -1]
9: () [lua/glib/threading/thread.lua: 262]
А именно
undefined symbol: lua_getfield", "Couldn't load module library!"
Почему пишет что функция не определена/найдена???? Как решить эту проблему, парюсь уже не первый день.
Это я так полагаю покажет что библиотека lua_shared.so загружена системой
independent@independent-W35xSS-370SS:~$ lsof -p 8511 | grep lua_shared
hl2_linux 8511 independent mem REG 8,20 720238 667545 /home/independent/.steam/steam/steamapps/common/GarrysMod/garrysmod/bin/lua_shared.so
Это покажет что
lua_getfield находится в библиотеке lua_shared.so
independent@independent-W35xSS-370SS:~/.steam/steam/steamapps/common/GarrysMod/garrysmod/bin$ nm -r lua_shared.so | grep lua_getfield
0004d190 T lua_getfield