Есть ли способ переопределить malloc во время компоновки в Windows? - PullRequest
9 голосов
/ 23 сентября 2008

Я хотел бы заменить malloc по умолчанию во время соединения, чтобы использовать пользовательский malloc. Но когда я пытаюсь переопределить malloc в моей программе, я получаю эту ошибку:

MSVCRT.lib(MSVCR80.dll) : error LNK2005: _malloc already defined in test.lib(test.obj)

Это отлично работает на любом Unix и работает на Windows с большинством функций, но не с malloc. Как я могу это сделать? А что отличается от malloc, который запрещает переопределять его?

Я знаю, что могу заменить каждый вызов malloc своим пользовательским malloc или использовать для этого макрос, но я бы не стал изменять каждую стороннюю библиотеку.

Ответы [ 4 ]

16 голосов
/ 23 сентября 2008

Здесь действительно хорошая дискуссия о том, как это тяжело:

http://benjamin.smedbergs.us/blog/2008-01-10/patching-the-windows-crt/

Судя по всему, вам нужно исправить CRT

Редактировать: на самом деле, сотрудник MS дал технику в обсуждении. Вам нужно переместить ваш malloc в lib, а затем связать его до CRT

"он также упоминает, что если вы связываете свой malloc как lib до CRT (т.е. обязательно включите« игнорировать стандартные библиотеки »и явно включите CRT), вы получите хочу и может без проблем распространять эту библиотеку. "

2 голосов
/ 23 сентября 2008

Я думаю, это зависит от того, в каком порядке вы связываете файлы. Я думаю, вам нужно сначала связать свою пользовательскую функцию, а затем библиотеку импорта.

1 голос
/ 18 ноября 2010

Как насчет определения malloc = _custom_malloc в make-файле проекта. Чем добавление файла, такого как:

my_memory.c
#undef malloc
#undef calloc
...
void *_custom_malloc(int size) { return jmalloc(size); }
void *_custom_calloc(int size) { return jcalloc(size); }
...
1 голос
/ 23 сентября 2008

Начиная с версии 3.0 Firefox использует собственный распределитель (AFAIR jmalloc) - вы можете проверить, как они это сделали. Я читал, что у них были некоторые проблемы с этим. Вы можете проверить это сообщение в блоге .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...