нехороший malloc, нужны телепаты
От: frogkiller Россия  
Дата: 13.10.08 11:55
Оценка:
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!
Курица — это инструмент, с помощью которого одно яйцо производит другие.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.