C --› malloc --› dlsym

Я использовал dlsym() для вызова своей версии malloc вместо библиотеки malloc по умолчанию:

 lt_malloc = (void*(*)(size_t))dlsym(RTLD_NEXT, "malloc");
 TRACE((stderr, "initialize: lt_malloc=%p\n", lt_malloc));
 if (!lt_malloc) {
     fprintf(stderr, "LeakTracer: could not resolve 'malloc' in 'libc.so': %s\n", dlerror());
     exit(1);
 }

Теперь, через определенное время, может быть таймер или около того, я хочу вернуться к исходной версии malloc (библиотека libc malloc). Как я могу это сделать?

Заранее спасибо.


person RajSanpui    schedule 31.03.2011    source источник


Ответы (2)


Означает ли приведенный выше код 1) вы назвали свой malloc также malloc? 2) или что вы назначаете libc malloc для lt_malloc?

Приведенный выше код предполагает, что lt_malloc — это malloc из libc, поэтому «исходный» malloc. Ну тогда у вас наверняка есть какие-то макросы или функция

Итак, вы переключаетесь так же легко, как my_malloc = libc_malloc my_malloc = my_debug_malloc

и вы просто вызываете my_malloc

Если это бесполезно, объясните размещенный код и что вы ожидаете от «ente code here».

person Friedrich    schedule 31.03.2011
comment
@Friedrich: Пожалуйста, обратитесь к справочной странице для dlsym, особенно по использованию макроса RTLD_NEXT. Да, у нас где-то есть свой код malloc, в программе, которая будет вызываться. - person RajSanpui; 31.03.2011
comment
Я знаю, что делает dlsym, поэтому lt_malloc — это libc malloc. Так где же тогда твой malloc? Что такое имя и как его вызвать с помощью макроса или другого указателя на функцию или как? - person Friedrich; 31.03.2011
comment
Нет, я думаю, в таком случае вам нужно лучше знать макрос RTLD_NEXT. Я скопирую сюда выдержку из справочной страницы: There are two special pseudo-handles, RTLD_DEFAULT and RTLD_NEXT. The former will find the first occurrence of the desired symbol using the default library search order. The latter will find the next occurrence of a function in the search order after the current library. This allows one to provide a wrapper around a function in another shared library. - person RajSanpui; 31.03.2011
comment
Думаю, ответ будет RTLD_DEFAULT, но что произойдет, если моя версия malloc уже загружена в память? RTLD_DEFAULT перезаписывает его? - person RajSanpui; 31.03.2011
comment
Твоего malloc точно нет в libc. Так где же он? - person Friedrich; 31.03.2011
comment
@Friedrich: в моем файле определен malloc, который я здесь не указал. lt_malloc будет указывать на исходный libc malloc - person RajSanpui; 31.03.2011
comment
Я прекрасно знаю, что lt_malloc — это malloc из libc. И поэтому я спросил, как зовут вашего malloc? Это тоже malloc или нет? - person Friedrich; 01.04.2011
comment
@Friedrich: Конечно, это будет malloc, иначе, как вы думаете, мы можем поместить обертку? - person RajSanpui; 01.04.2011
comment
@Friedrich: Если мы иногда внимательно изучаем справочную страницу, попадание и пробная версия не требуются. Но в любом случае, как вы меня и просили, позвольте мне сказать вам: RTLD_DEFAULT всегда будет поражать мой malloc и будет зацикливаться. (Это проверено) - person RajSanpui; 06.04.2011

Вам лучше использовать dlopen в библиотеке, содержащей вашу функцию malloc, и использовать дескриптор из dlopen в качестве первого аргумента для dlsym.

В качестве альтернативы вы можете использовать LD_PRELOAD.

person Mathias Brossard    schedule 10.06.2011