У меня плохая общая библиотека (неопределенный символ).
Когда я в первый раз вызываю dlopen (), я получаю NULL-результат с правильным сообщением об ошибке от dlerror ().
Если я игнорирую сообщение об ошибке и вызываю dlopen (), используя те же аргументы, я получаю ненулевой дескриптор во второй раз (который указывает, что библиотека была успешно загружена).Это, очевидно, неправильно.
Эта проблема возникает в Ubuntu 11.04 (IIRC, 10.10 не имела этой проблемы).В Centos 5.5 этой проблемы нет.
В частности, эта проблема возникает в интерпретаторе Tcl.Он попытается загрузить разделяемую библиотеку, сначала с канонизированным абсолютным путем, а если это снова не удастся, буквально с точной строкой пути, указанной пользователем.В моем случае оба должны потерпеть неудачу, но второй вызов неправильно выполняется в Ubuntu 11.04.
Как ни странно, я могу воспроизвести эту проблему только с моей точной производственной разделяемой библиотекой.Если я создаю уменьшенную разделяемую библиотеку, она работает правильно.
Такой программы достаточно, чтобы показать проблему с моей производственной библиотекой:
#include <stdio.h>
#include <dlfcn.h>
int main()
{
void* h;
h = dlopen("./prod.so", RTLD_NOW | RTLD_LOCAL);
printf("h is %p\n", h);
printf("err is %s\n", dlerror());
h = dlopen("./prod.so", RTLD_NOW | RTLD_LOCAL);
printf("h is %p\n", h);
}