разделяемый объект не может найти символы в основном двоичном коде, C ++ - PullRequest
11 голосов
/ 02 сентября 2010

Я экспериментирую с созданием своего рода архитектуры плагинов для программы, которую я написал, и с первой попытки у меня возникла проблема.Можно ли получить доступ к символам из основного исполняемого файла из общего объекта?Я думал, что следующее будет хорошо:

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) Если нет, то как программы, использующие плагины, обычно работают так, что им удается получить код в произвольных общих объектахзапускать внутри своих программ?

1 Ответ

19 голосов
/ 02 сентября 2010

Попробуйте:

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

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

...