LINUX.ORG.RU

dlopen: undefined symbol


0

0

пытаюсь прикрутить к проге поддержку плагинов. однако "не выходит каменный цветок" (ц).

в программе есть несколько глобальных переменных, которые в плагине объявлены как extern. при сборке/запуске самой проги все части проги видят эти символы нормально. плагин тоже собирается нормально, однако при загрузке либы dlerror() говорит:

/opt/editors/lib/polina/sample.so: undefined symbol: main_window: Success

main_window объявляется и инициализируется до загрузки плагина. dlopen() делаю с RTLD_NOW|RTLD_GLOBAL

gcc-3.4.5

★★★

А язык - С?

Покажи код:

1) где объявлены эти глобальные переменные
2) где вызывается dlopen и следом dlerror

jek_
()
Ответ на: комментарий от jek_

=== main.c ===

GtkWidget *main_window;
. . .
void plugins_init () {
  . . .
  void *module = dlopen("sample.so", RTLD_NOW|RTLD_GLOBAL);
  if (!module) perror(dlerror());
  . . .
}
. . .
int main (int argc, char **argv) {
  gtk_init(&argc, &argv);
  main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  . . .
  plugins_init();
  . . .
}

=== globals.h ===
extern GtkWidget *main_window;
. . .

=== sample.c ===
#include <gtk/gtk.h>
#include "globals.h"
. . .
__attribute__ ((constructor)) void init () { }

void open_pref_dialog () {
  GtkWidget *pref_dialog = gtk_dialog_new_with_buttons(. . .);
   . . .
}

__attribute__ ((destructor)) void fini () { }

friday ★★★
() автор топика
Ответ на: комментарий от jek_

И ещё. Это написано в мане (man dlopen). Цитирую:

External references in the library are resolved using the libraries in that library's dependency list and any other libraries previously opened with the RTLD_GLOBAL flag. If the executable was linked with the flag "-rdynamic", then the global symbols in the executable will also be used to resolve references in a dynamically loaded library.

Нужно внимательнее читать.

Ещё. Вызов perror(dlerror()) бессмыслен. dlopen (опять же - см. ман) не выставляет errno. Так что диагностику нужно выводить так:

printf("%s\n", dlerror());

jek_
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.