общий объект не может найти символы в основном двоичном файле, 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) 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?

11
задан cheshirekow 2 September 2010 в 02:07
поделиться

1 ответ

Попробуйте:

g++ -fPIC -rdynamic -o testexe testexe.cpp -ldl

Без -rdynamic (или что-то эквивалентное, например -Wl,--export-dynamic), символы из самого приложения не будут доступны для динамического связывания.

19
ответ дан 3 December 2019 в 06:19
поделиться
Другие вопросы по тегам:

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