Дано:

Динамическая линковка с 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).









 ,






URL записи