全局覆盖visual c ++中的malloc

Las*_*lan 10 c c++ malloc overriding

我试图想出一种在visual c ++(2005)中全局覆盖malloc和相关函数的方法.我的设置是一个带有静态链接的运行时库的DLL,它包含我自己的c ++代码,外部c ++和c代码.我想要完成的是允许dll的用户设置他们自己的内存分配函数的实现.

我不能使用的解决方案:

  • 全局覆盖new和delete,我的代码库中有很多外部C库,这意味着它不会捕获很多分配.
  • 将malloc定义为不同的符号.这将迫使我将此定义推送到所有使用的外部库的构建设置中,我真的想避免这种情况.

我不关心的事情

  • 如果任何外部库以其他方式分配内存(HeapAlloc,内存映射文件或它们提出的任何内容),我接受通过重写malloc将无法正确跟踪它.

我能想出的最合理的解决方案是以某种方式干扰链接过程并确保我自己的malloc被链接而不是标准的,最好是我希望能够使用旧的malloc函数作为默认值.

在谷歌性能工具中,似乎他们在运行时手动修补函数的代码,以允许在调用原始函数之前调用钩子函数.这真的是最好的方法吗?

Dan*_*ker 7

我也渴望为此找到一个简洁的解决方案.我们为多个平台编译,所以在非windows窗口我们可以使用的东西 - 愉快地包裹.我们只需要创建替换功能,它们都可以正常运行而不会出现任何错误或黑客攻击.

在窗口方面,我们覆盖malloc调用,但随后用于/FORCE:MULTIPLE处理链接器错误.它工作,记忆功能被调用,一切都被跟踪,但感觉就像一个黑客.

来自MSDN:

A file created with this option may not run as expected. The linker will not link incrementally when the /FORCE option is specified.

它不仅感觉像是黑客,还会杀死编辑并继续进行.

/FORCE:MULTIPLE选项可能会解决您的问题,但我并不是说它是一种治疗方法,我仍然试图找到它.

MSDN/FORCE文档

:D


P S*_*ved 5

以下内容适用于Linux,但也可能适用于Win的Visual C++.

  1. Malloc功能由系统库glibc提供.默认情况下,可执行文件与其相关联.

  2. 运行程序时,动态加载程序会注意到可执行文件需要malloc函数并查找提供它的第一个库.

  3. 由于glibc(默认情况下)是该列表中的最后一个,因此找到的库可能不是glibc.

除非你将glibc静态链接到可执行文件中,否则显而易见的解决方案是将可执行文件链接到提供自己的malloc的库,并确保它确实覆盖了系统的.

  • 在Windows上不起作用.进口不仅仅是名称.每个需要提供它的DLL都列出了导入.PE格式允许您从两个DLL导入相同的函数名称. (3认同)
  • 这是真的,甚至不是很难.如果`malloc`的导入库在标准导入库之前,那么Visual C++链接器将使用该导入库,因此从相应的DLL导入`malloc`.`LIBCTiny`是另一种以这种方式工作的CRT. (2认同)

i_a*_*orf 2

您可以使用Microsoft 的Detours(商业付费)或重写您使用的 dll 的导入表。