Войти
ПрограммированиеФорумОбщее

Подмена CRT-функций и doug lea malloc.

Страницы: 1 2 3 4 Следующая »
#0
15:18, 27 авг. 2007

Как корректно подменять функции?
Если я пишу в .c/.cpp файле подменённые функции вроде malloc, free, _msize, realloc, calloc

extern "C" void *malloc() { ... ... }

то при компиляции в Visual C++ 2005 как cl /MTd /EHsc test.cpp возникают ошибки:

LIBCMTD.lib(dbgheap.obj) : error LNK2005: _malloc already defined in test.obj
LIBCMTD.lib(dbgheap.obj) : error LNK2005: _calloc already defined in test.obj
LIBCMTD.lib(dbgheap.obj) : error LNK2005: _realloc already defined in test.obj
LIBCMTD.lib(dbgheap.obj) : error LNK2005: _free already defined in test.obj
LIBCMTD.lib(dbgheap.obj) : error LNK2005: __msize already defined in test.obj

то при компиляции как cl /MT /EHsc test.cpp
LIBCMT.lib(calloc.obj) : error LNK2005: _calloc already defined in test.obj
LIBCMT.lib(realloc.obj) : error LNK2005: _realloc already defined in test.obj


При компиляции Visual C++ 2003 аналогичные ошибки в /MTd и всё работает в /MT

Внимание вопрос.
Как подменять CRT-функции что бы работало, и как заставить работать doug lea malloc ( http://g.oswego.edu/dl/html/malloc.html )?


#1
15:38, 27 авг. 2007

Элементарно. Под любым другим именем, кроме malloc.

#2
15:40, 27 авг. 2007

cppguru
Надо всё-таки malloc. Причём - линкером. Это самое надёжное и всеобъемлющее. Хоторое захватит и STL, и CRT, и сторонние либы.

#3
15:43, 27 авг. 2007

_Winnie

#define malloc dlmalloc
?

#4
15:47, 27 авг. 2007

=A=L=X=
>#define malloc dlmalloc
Оно ненадёжное, не влияет на сторонние либы. Искать для каждой либы в какое ей место засунуть этот #define - нерационально. Учитывая, что не всё в исходниках или не всё хочется пересобирать (CRT, например).

#5
15:54, 27 авг. 2007

_Winnie
>cppguru
>Надо всё-таки malloc. Причём - линкером. Это самое надёжное и всеобъемлющее.
>Хоторое захватит и STL, и CRT, и сторонние либы.

Э нет, такого просто так не сделать.
Если у самого линкера нет такой опции, как "подменять одно имя другим", то тут либо хакерство, либо геморрой...

#6
15:55, 27 авг. 2007

Под MSVC CRT полностью подменить malloc dlmalloc'ом я не смог. В либах, вроде jpeglib, zlib и прочее, делается легко - там все функции распределения памяти в одном месте, иногда в виде #define, просто делаем extern dlmalloc/dlfree и меняем malloc/free на них. Т.е., если используем какие-либо функции из crt, распределяющие память, то будет использован обычный malloc.
Под Mingw32 все линкуется на раз.

#7
16:04, 27 авг. 2007

я бы отрыл malloc.c в црт, нашел бы функцию, и сделал так:

void *malloc(SIZE_T size)
{
 extern void *dlmalloc(SIZE_T);
 return dlmalloc(size);
 ///старый код комментируем
}

главное - потом не забыть исправить обратно (:

#8
16:51, 27 авг. 2007

Nomad
... после чего надо не забыть пересобрать все библиотеки? ;)
уж тогда проще через lib.exe выдрать "неправильные" версии из библиотеки, чтобы заменить их своими.
Но вообще это странно - defaultlib не должна давать ошибку, а только предупреждение. Надо будет проверить на домашнем компе.

#9
17:15, 27 авг. 2007

dDIMA
а lib.exe - это как?

E:\test\crt_replace>cl /EHsc test.cpp malloc.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

test.cpp
Generating Code...
Compiling...
malloc.c
Generating Code...
Microsoft (R) Incremental Linker Version 8.00.50727.42
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:test.exe
test.obj
malloc.obj
LIBCMT.lib(calloc.obj) : error LNK2005: _calloc already defined in malloc.obj
LIBCMT.lib(realloc.obj) : error LNK2005: _realloc already defined in malloc.obj
test.exe : fatal error LNK1169: one or more multiply defined symbols found

E:\test\crt_replace>lib /remove:realloc /out:out.lib libcmt.lib
Microsoft (R) Library Manager Version 8.00.50727.42
Copyright (C) Microsoft Corporation.  All rights reserved.

LIB : warning LNK4014: cannot find member object realloc
libcmt.lib(87sqrt.obj) : warning LNK4221: no public symbols found; archive member will be inaccessible
libcmt.lib(wincrt0.obj) : warning LNK4006: __aenvptr already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(wincrt0.obj) : warning LNK4006: __wenvptr already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(wincrt0.obj) : warning LNK4006: ___error_mode already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(wincrt0.obj) : warning LNK4006: ___app_type already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(wcrt0.obj) : warning LNK4006: __aenvptr already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(wcrt0.obj) : warning LNK4006: __wenvptr already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(wcrt0.obj) : warning LNK4006: ___error_mode already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(wcrt0.obj) : warning LNK4006: ___app_type already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(dllcrt0.obj) : warning LNK4006: __aenvptr already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(dllcrt0.obj) : warning LNK4006: __wenvptr already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(dllcrt0.obj) : warning LNK4006: ___error_mode already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(dllcrt0.obj) : warning LNK4006: ___app_type already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(crt0.obj) : warning LNK4006: __aenvptr already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(crt0.obj) : warning LNK4006: __wenvptr already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(crt0.obj) : warning LNK4006: ___error_mode already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(crt0.obj) : warning LNK4006: ___app_type already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(freea.obj) : warning LNK4006: __freea already defined in libcmt.lib(wcsftime.obj); second definition ignored
libcmt.lib(freea.obj) : warning LNK4221: no public symbols found; archive member will be inaccessible

E:\test\crt_replace>lib /remove:_realloc /out:out.lib libcmt.lib
Microsoft (R) Library Manager Version 8.00.50727.42
Copyright (C) Microsoft Corporation.  All rights reserved.

LIB : warning LNK4014: cannot find member object _realloc
libcmt.lib(87sqrt.obj) : warning LNK4221: no public symbols found; archive member will be inaccessible
libcmt.lib(wincrt0.obj) : warning LNK4006: __aenvptr already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(wincrt0.obj) : warning LNK4006: __wenvptr already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(wincrt0.obj) : warning LNK4006: ___error_mode already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(wincrt0.obj) : warning LNK4006: ___app_type already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(wcrt0.obj) : warning LNK4006: __aenvptr already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(wcrt0.obj) : warning LNK4006: __wenvptr already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(wcrt0.obj) : warning LNK4006: ___error_mode already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(wcrt0.obj) : warning LNK4006: ___app_type already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(dllcrt0.obj) : warning LNK4006: __aenvptr already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(dllcrt0.obj) : warning LNK4006: __wenvptr already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(dllcrt0.obj) : warning LNK4006: ___error_mode already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(dllcrt0.obj) : warning LNK4006: ___app_type already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(crt0.obj) : warning LNK4006: __aenvptr already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(crt0.obj) : warning LNK4006: __wenvptr already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(crt0.obj) : warning LNK4006: ___error_mode already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(crt0.obj) : warning LNK4006: ___app_type already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(freea.obj) : warning LNK4006: __freea already defined in libcmt.lib(wcsftime.obj); second definition ignored
libcmt.lib(freea.obj) : warning LNK4221: no public symbols found; archive member will be inaccessible

E:\test\crt_replace>lib /remove:realloc.obj /out:out.lib libcmt.lib
Microsoft (R) Library Manager Version 8.00.50727.42
Copyright (C) Microsoft Corporation.  All rights reserved.

LIB : warning LNK4014: cannot find member object realloc.obj
libcmt.lib(87sqrt.obj) : warning LNK4221: no public symbols found; archive member will be inaccessible
libcmt.lib(wincrt0.obj) : warning LNK4006: __aenvptr already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(wincrt0.obj) : warning LNK4006: __wenvptr already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(wincrt0.obj) : warning LNK4006: ___error_mode already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(wincrt0.obj) : warning LNK4006: ___app_type already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(wcrt0.obj) : warning LNK4006: __aenvptr already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(wcrt0.obj) : warning LNK4006: __wenvptr already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(wcrt0.obj) : warning LNK4006: ___error_mode already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(wcrt0.obj) : warning LNK4006: ___app_type already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(dllcrt0.obj) : warning LNK4006: __aenvptr already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(dllcrt0.obj) : warning LNK4006: __wenvptr already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(dllcrt0.obj) : warning LNK4006: ___error_mode already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(dllcrt0.obj) : warning LNK4006: ___app_type already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(crt0.obj) : warning LNK4006: __aenvptr already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(crt0.obj) : warning LNK4006: __wenvptr already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(crt0.obj) : warning LNK4006: ___error_mode already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(crt0.obj) : warning LNK4006: ___app_type already defined in libcmt.lib(wwincrt0.obj); second definition ignored
libcmt.lib(freea.obj) : warning LNK4006: __freea already defined in libcmt.lib(wcsftime.obj); second definition ignored
libcmt.lib(freea.obj) : warning LNK4221: no public symbols found; archive member will be inaccessible

#10
17:18, 27 авг. 2007

_Winnie

/NODEFAULTLIB[:library]

правда весь CRT придется сделать самому.

#11
17:18, 27 авг. 2007

Разобрался,

E:\test\crt_replace>lib /list libcmt.lib | findstr realloc
build\intel\mt_obj\realloc.obj

E:\test\crt_replace>lib /remove:build\intel\mt_obj\realloc.obj /out:out.lib libcmt.lib

#12
18:12, 27 авг. 2007

Ты разобрался уже, _Winnie?

IIRC, для неотладочной статически-линкуемой версии CRT надо переопределить весь комплект с _crt, тогда будет линковаться без проблем.
Т.е. минимум
  _malloc_crt
  _calloc_crt
  _free_crt
  _realloc_crt
  _recalloc_crt
  _expand_crt
Мне не потребовался (вроде бы)
  _msize_crt
но YMMV.

#13
18:35, 27 авг. 2007

_Winnie
>dDIMA
>а lib.exe - это как?

>Разобрался,
>E:\test\crt_replace>lib /list libcmt.lib | findstr realloc
>build\intel\mt_obj\realloc.obj
>E:\test\crt_replace>lib /remove:build\intel\mt_obj\realloc.obj /out:out.lib
>libcmt.lib
Да, именно так :)

#14
18:44, 27 авг. 2007

_Winnie
>Разобрался,
>E:\test\crt_replace>lib /list libcmt.lib | findstr realloc
>build\intel\mt_obj\realloc.obj
>E:\test\crt_replace>lib /remove:build\intel\mt_obj\realloc.obj /out:out.lib
>libcmt.lib

Жесть! =) Наши программеры, самые программистые в мире. :)
Способ зачетный, главное почти не порождает проблем. :)

Страницы: 1 2 3 4 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.