Как переопределить malloc () в Linux для использования в C ++ new - PullRequest
4 голосов
/ 06 декабря 2010

У меня есть определенные mem_malloc () и mem_free () для меня, и я хочу использовать их для замены malloc () и free (), и, следовательно, C ++ для новых и удаления.

Я определяю их следующим образом:

extern "C" {

extern void *mem_malloc(size_t);
extern void mem_free(void *);

void *
malloc(size_t size) {
  return mem_malloc(size);
}

void
free(void *memory) {
  mem_free(memory);
}
}

Однако я получаю две ошибки ссылки:

[user@machine test]$ g++ -m32 -pthread main.cpp -static  libmemnmf-O.a
/usr/lib/../lib/libc.a(malloc.o): In function `free':
(.text+0x153c): multiple definition of `free'
/tmp/ccD2Mgln.o:main.cpp:(.text+0x842): first defined here
/usr/lib/../lib/libc.a(malloc.o): In function `malloc':
(.text+0x3084): multiple definition of `malloc'
/tmp/ccD2Mgln.o:main.cpp:(.text+0x856): first defined here
libmemnmf-O.a(mem_debug.o): In function `mem_init_debug_routines':
mem_debug.c:(.text+0x83c): undefined reference to `dlopen'
mem_debug.c:(.text+0x89d): undefined reference to `dlsym'
mem_debug.c:(.text+0xa03): undefined reference to `dlclose'
mem_debug.c:(.text+0xa24): undefined reference to `dlclose'
mem_debug.c:(.text+0xa2e): undefined reference to `dlerror'
collect2: ld returned 1 exit status

1) Как я могу получить множественные ошибки malloc () и free (), чтобы они исчезли и просто взяли мое определение, а не встроенное?

2) Какая библиотека предоставляет dlopen () и друзьям? Я ожидаю, что это будет встроено, но они не определены.

Ответы [ 5 ]

4 голосов
/ 06 декабря 2010

Я предполагаю, что вы определяете malloc и free в файле main.cpp, который вы пытаетесь скомпилировать, и что mem_alloc и mem_free находятся в libmemnmf-0.a

Вероятно, происходит то, что для некоторых ссылок в main.cpp требуются объекты из glibc. В частности, что-то динамически загружает библиотеку (dlopen). Этот код включен в glibc (для ответа на вопрос 2). Когда компоновщик включает объекты из glibc и обнаруживает, что эти объекты требуют символа malloc / free, он будет пытаться напрямую включить malloc / free из библиотеки glibc. Из-за вашего флага компоновщика -static вся библиотека libmemnmf-0.a статически включена в ваш исполняемый файл. Это, очевидно, будет включать другой malloc и свободный объект в ваш исполняемый файл.

Что вам нужно сделать, это поместить подпрограммы malloc и free в отдельный файл .o и добавить этот файл где-нибудь в вашей команде link, предпочтительно в конце (при условии, что вы не указали для этого стандартную библиотеку особым образом). линия). Файл .o будет удовлетворять всем запросам символов, и библиотека glibc найдет эти совпадения разрешенными всякий раз, когда dlopen или другие объекты требуют их. Разница в том, что файл libmnef-0.a является библиотекой, и компоновщики работают с библиотеками иначе, чем с простыми объектами (что связано с количеством проходов через библиотеку для разрешения символов, запрашиваемых объектами в этой библиотеке). В качестве альтернативы, вы можете сбросить флаг -static, который, как я ожидаю, также решит проблему, но у вас, вероятно, есть веская причина включить этот флаг для начала.

Если вы хотите переопределить поведение new и delete, вы также можете обратиться к операторам перегрузки new и delete для классов, чтобы обеспечить метод распределения для конкретного класса или пул памяти.

2 голосов
/ 06 декабря 2010

Попробуйте:

#define free mem_free
#define malloc mem_alloc

После , включая stdlib.h.

2.) Dlopen () и друзья:

#include <dlfcn.h>

Флаги компоновщика: -ldl

См. Справочную страницу dlopen (3) .

1 голос
/ 06 декабря 2010

По умолчанию вы ссылаетесь на libc, который определяет malloc, попробуйте переименовать с помощью #define. Dlopen и т. Д. Определены в ld .

0 голосов
/ 25 июля 2015

Я искал этот ответ.Наконец я нашел то, что работает для меня.У компоновщика есть опция --wrap = symbol, которую вы можете использовать.

Выполнить

man ld

и выполнить поиск по запросу "wrap".

Я разместил это начто кто-то находит этот вопрос, но ни один из ответов не работает для него, как это было в моем случае.

0 голосов
/ 06 декабря 2010

Вы можете отдать приоритет библиотеке, используя переменные окружения LD_LIBRARY_PATH и LD_PRELOAD.

Это позволит вам предоставить пользовательские malloc и free в динамической библиотеке, которая будет преобладать над библиотеками, предоставляемыми libc. Я считаю, что это предпочтительнее, чем решение на #define основе.

...