Не находится функция библиотеки?

В общем есть сервер игры 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
  • Вопрос задан
  • 316 просмотров
Пригласить эксперта
Ответы на вопрос 3
dollar
@dollar Куратор тега Lua
Делай добро и бросай его в воду.
Ну, lua_getglobal определена через lua_getfield, так что выходит, что макрос работает, а сам символ нет.
spoiler
#define lua_getglobal(L,s)  lua_getfield(L, LUA_GLOBALSINDEX, s)

Попробуйте поиграть с флагами компиляции типа -Wl,-export-dynamic
Ответ написан
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
А зачем в скрипте сборки gmsv_ekau_linux.dll стоит это: -Wl,-soname,lua_shared.so?
Ответ написан
@q27off
s/gmod13_open/ekau_luaopen/g
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы