Дано:
Динамическая линковка с libxml2. Гружу символ xmlMalloc:
__typeof__(xmlMalloc) xmlMalloc;
static void _init_xmlMalloc(void) __attribute__((constructor));
static void _init_xmlMalloc(void) {
void * obj = lok_library_func(library, "xmlMalloc");
xmlMalloc = * (__typeof__(xmlMalloc) *)obj;
}
В lok_library_func обычный dlsym с проверкой на нашел\не нашел. При не нашел - падаем.
Грузит, находит по адресу. Но xmlMalloc == NULL. Т.е. переменная не присвоена. Окей, обращаемся к коду libxml:
#if defined(DEBUG_MEMORY_LOCATION) || defined(DEBUG_MEMORY)
<...>
xmlMallocFunc xmlMalloc = (xmlMallocFunc) xmlMemMalloc;
<...>
#else
<...>
/**
* xmlMalloc:
* @size: the size requested in bytes
*
* The variable holding the libxml malloc() implementation
*
* Returns a pointer to the newly allocated block or NULL in case of error
*/
xmlMallocFunc xmlMalloc = malloc;
Точно известно, что DEBUG_MEMORY_LOCATION и DEBUG_MEMORY не установлены. Значит переменная должна быть инициализирована при загрузке библиотеки (что и происходит при dlopen).
Вопрос - почему переменная NULL?
Из-за того, что она NULL происходит падение при первом же выделении памяти внутри самой либы (например на LIBXML_TEST_VERSION).