Как вызвать функцию в исполняемом файле из моей библиотеки? - PullRequest
12 голосов
/ 09 июня 2011

У меня есть исполняемый файл и динамическая библиотека (.so). Библиотека экспортирует некоторые символы, и исполняемый файл вызывает ее успешно. Но я хочу сделать возможным вызов функций исполняемого файла библиотеки. Я попытался сделать следующее в исполняемом файле:

//test
extern "C" void print(const char * str) {
    std::cout << str << std::endl;
}

и это в библиотеке:

extern "C" void print(const char *);

но когда я вызываю dlopen в исполняемом файле (для загрузки библиотеки), возвращается ошибка undefined symbol: print. как я могу это исправить?

Ответы [ 2 ]

12 голосов
/ 09 июня 2011

В Linux / ELF вы можете передать опцию -export-dynamic компоновщику (-rdynamic в драйвере компилятора gcc), чтобы символы из исполняемого файла экспортировались в общие объекты.

В вашей библиотеке будет фиктивная реализация print, которая будет скрыта реализацией в вашем исполняемом файле, так как исполняемый файл обычно ищется перед общими объектами для разрешения символов.

Это имеет тот недостаток, что он не очень мелкозернистый, вы можете переопределить какой-то символ, который вы не собирались.Более точный вариант - создать список символов для экспорта в виде:

{
    print;
    <other symbols>
};

и передать этот список компоновщику, например, из gcc: -Wl,--dynamic-list=<file with list of symbols>

4 голосов
/ 09 июня 2011

Более простой способ добиться этого - заставить исполняемый файл зарегистрировать функцию для последующего использования библиотекой, библиотека хранит указатель на функцию и может вызвать ее позже.

...