Правильное использование libdl и динамически связанных библиотек - PullRequest
8 голосов
/ 04 декабря 2011

Мне нужно динамически связать созданную мной библиотеку.Я не совсем уверен, в чем проблема.Все компилируется правильно, но я всегда ловлю handle в качестве указателя NULL:

void *handle;
char *error;
handle = dlopen ("./hw11-lib-michaelSchilling.so", RTLD_LAZY);
//same error comes up with full path as well as './hw11...'
if(!handle){
    error = dlerror();
    printf("%s\n", error);
    printf("Error loading library.\n");
    exit(1);
}

Я не могу передать эту ошибку, и я не уверен, что может быть не так.Я почти уверен, что все правильно скомпилировал.Вот шаги компиляции, которые я использовал:

gcc -rdynamic -c hw11-lib-michaelSchilling.c -o hw11-lib-michaelSchilling.so
gcc hw11-michaelSchilling-4.c -ldl -o hw11-michaelSchilling-4

Я получаю сообщение об ошибке:

Только ET_DYN и ET_EXEC могут быть загружены.

Ответы [ 4 ]

17 голосов
/ 04 декабря 2011

При сборке hw11-lib-michaelSchilling.so вы, похоже, не говорите gcc, что хотите получить общий объект (.so в имени недостаточно).

С -c он создает объектный файл (не shared object) и вызывает его michaelSchilling.so. Компоновщик даже не вызывается.

Удалите -c из командной строки gcc и добавьте -shared:

gcc -shared -rdynamic hw11-lib-michaelSchilling.c -o hw11-lib-michaelSchilling.so
1 голос
/ 04 декабря 2011

Косая черта (/) в качестве первого символа имени пути указывает на то, что имя пути является абсолютным (относительно корневого каталога), не относительно текущего рабочего каталога и, конечно, не относительно расположения двоичного файла.Вам нужно будет указать полный путь, выяснив местоположение двоичного файла (что само по себе непросто), или вы можете использовать $ORIGIN с dlopen (он работает с rpath, но янеясно, работает ли он с dlopen).

0 голосов
/ 01 октября 2017
gcc -fPIC -shared -rdynamic  library.c -o library.o

у меня работает на Linux при компиляции библиотеки для кода, который его открывает, вам нужно -ldl

0 голосов
/ 04 декабря 2011

Находится ли hw11-lib-michaelSchilling.so в абсолютном корне вашей файловой системы?Вы утверждаете, что это происходит через косую черту ... но я подозреваю, что это не так.

При обработке ошибок включите вывод dlerror() в то, что вы печатаете, чтобы найти причину сбоя.

...