2010-09-02 3 views
7

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

ответ

16

Try:

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

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

+0

Да! Огромное спасибо. – cheshirekow

+1

Согласно https://gcc.gnu.org/onlinedocs/gcc-4.8.3/gcc/Link-Options.html, тот же эффект может быть достигнут с помощью опции «-rdynamic» на шаг gcc-ссылки. –

+0

@TomBarron Спасибо! Я обновлю свой пост. –

 Смежные вопросы

  • Нет связанных вопросов^_^