Need help!
1) Имеется большая страшная динамическая библиотека, размером > 100МБ, полученная из успешно работающей большой страшной программы-демона (грубо говоря, просто добавил при компиляции параметр "-shared", не суть важно).
2) Создаю программу-заглушку для тестирования:
#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>
#include <unistd.h>
int main(int argc, char **argv) {
void * aaa = (argc > 2) ? malloc(1000) : 0; //1
void * handle = dlopen ("./my_big_library.so", RTLD_LAZY);
if (!handle) {
return 1;
}
void * ccc = (argc > 1) ? malloc(1000) : 0; //2
void (*libinit)(void) = (void (*)(void))dlsym(handle, "my_lib_init");
libinit();
void * bbb = malloc(1000); //3
while (true) sleep(100);
dlclose(handle);
//free(aaa);
//free(bbb);
//free(ccc);
}
3) Если выполняется malloc(//1), то malloc'и(1,2,3) выволняются нормально, но внутри so обламывается вызов new (причём, по-видимому, обламываются не все, а лишь некоторые

но точно определить на получается ввиду нереальных объёмов библиотеки — предположительно в конструкторе возникает исключение, но почему-то оно не ловится под gdb и не приводит к coredump'у, вернее, приводит, но лишь косвенно, и значительно позже — при обращении к непроинициализированным данным).
Если же malloc(//1) отсутствует — то всё работает хорошо.
Из того, что может помочь телепатам: всё это безобразие собирается с -lthr -lperl. Perl также собирался с libthr, версии библиотек совпадают. Perl не использовал свой аллокатор (-Ui_malloc -Dusemymalloc=n). И so и тестовая программа собирались с -Wl,-E — без этого не находится boot_DynaLoader.
4) Зачем это всё нужно — предполагается, что эта so будет вызываться из perl'а через xs. Собственно, эффект полностью воспроизводится — perl подгружает so, дёргает процедуру, вызывающую libinit — и падает в корку при обращении к непроинициализированным данным.
Help!
Курица — это инструмент, с помощью которого одно яйцо производит другие.