Я экспериментирую с созданием своего рода архитектуры плагинов для программы, которую я написал, и с первой попытки я ' У меня проблема. Можно ли получить доступ к символам из основного исполняемого файла из общего объекта? Я думал, что следующее будет хорошо:
testlib.cpp:
void foo();
void bar() __attribute__((constructor));
void bar(){ foo(); }
testexe.cpp:
#include <iostream>
#include <dlfcn.h>
using namespace std;
void foo()
{
cout << "dynamic library loaded" << endl;
}
int main()
{
cout << "attempting to load" << endl;
void* ret = dlopen("./testlib.so", RTLD_LAZY);
if(ret == NULL)
cout << "fail: " << dlerror() << endl;
else
cout << "success" << endl;
return 0;
}
Скомпилировано с:
g++ -fPIC -o testexe testexe.cpp -ldl
g++ --shared -fPIC -o testlib.so testlib.cpp
Вывод:
attempting to load
fail: ./testlib.so: undefined symbol: _Z3foov
Так что, очевидно, это не хорошо. Итак, я думаю, у меня есть два вопроса: 1) Есть ли способ заставить общий объект находить символы в исполняемом файле, из которого он загружен? 2) If not, how do programs that use plugins typically work that they manage to get code in arbitrary shared objects to run inside their programs?
Попробуйте:
g++ -fPIC -rdynamic -o testexe testexe.cpp -ldl
Без -rdynamic
(или что-то эквивалентное, например -Wl,--export-dynamic
), символы из самого приложения не будут доступны для динамического связывания.