Я экспериментирую с созданием своего рода архитектуры плагинов для программы, которую я написал, и с моей первой попытки у меня возникла проблема. Возможно ли доступ к символам из основного исполняемого файла изнутри общего объекта? Я думал, что было бы хорошо следующие:общий объект не может найти символы в главном двоичном файле, C++
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) Если нет, как обычно работают программы, которые используют плагины, они могут получить код в произвольном порядке общие объекты для запуска внутри своих программ?
Да! Огромное спасибо. – cheshirekow
Согласно https://gcc.gnu.org/onlinedocs/gcc-4.8.3/gcc/Link-Options.html, тот же эффект может быть достигнут с помощью опции «-rdynamic» на шаг gcc-ссылки. –
@TomBarron Спасибо! Я обновлю свой пост. –