首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GCC Makefile定义

GCC Makefile定义
EN

Stack Overflow用户
提问于 2014-09-17 16:54:05
回答 3查看 693关注 0票数 1

我有一些C代码,我想做一些测试。它使用malloc、calloc,并通过代码释放。我希望将这些函数更改为内部调用原始函数的自定义函数。例如:

代码语言:javascript
复制
emxArray->size = (int *)malloc((unsigned int)(sizeof(int) * numDimensions));

将成为:

代码语言:javascript
复制
emxArray->size = (int *)myMalloc((unsigned int)(sizeof(int) * numDimensions));

其中myMalloc是:

代码语言:javascript
复制
void* myMalloc(unsigned size)
{
    if (size < 8)
    {
        //printf("*** Bumped from %d....\n", size);
        size = 8;
    }
    allocated += size;
    return malloc(size);
}

如您所见,myMalloc内部调用malloc。只是做了些额外的事情。我想用myMalloc替换malloc的用法。我已经通过遍历所有代码并用myMalloc手动替换malloc,成功地做到了这一点,但这远非理想。我将只在测试的基础上替换这个代码,因此生产代码应该只包含malloc调用。我意识到我也可以用一个脚本来完成这个任务,但是我只想在Makefile中使用一个定义语句:

代码语言:javascript
复制
-Dmalloc=myMalloc

但这也取代了myMalloc函数中的malloc,这将导致无限递归情况。我尝试将myMalloc函数中的malloc调用更改为malloc_d,并向Makefile添加了第二个定义。

代码语言:javascript
复制
-Dmalloc=myMalloc -Dmalloc_d=malloc

我认为第一个定义不会取代malloc_d (它没有),而第二个定义只会更改malloc_d (它没有)。我也有同样的递归情况。是否需要使用Makefile定义来完成此操作?还是多路预编译的情况总是搞砸这件事?

更新:

好的,我已经开始研究已经指出的LD_PRELOAD选项。我认为我有一个可行的解决办法,然而,我仍然有麻烦!我就是这么做的..。

  1. 我将myMalloc()和myFree()从主文件中移出并放入自己的文件中。然后我使用gcc -shared -o libMyMalloc.so -fPIC myMalloc.c将其编译成一个共享库。
  2. 然后,我将以下“虚拟函数”添加到主文件中: myMalloc(无符号大小){ void* ptr;返回ptr;} void myFree(void* ptr) {}

如你所见,他们什么也不做。

  1. 我在make文件中添加了以下定义:-Dmalloc=myMalloc \ -Dfree=myFree
  2. 我编译了代码,并在我创建的libMyMalloc.so库上运行它: LD_PRELOAD=/home/rad/Desktop/myMalloc/libMyMalloc.so ./testRegress

但是,我仍然没有让它与在myMalloc文件中定义的libMyMalloc.so函数一起运行。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-23 18:56:52

我找到了我的解决方案,想和大家分享。感谢所有为我做出贡献并指出正确方向的人。

最后,我创建了我的自定义库代码并将其编译成一个共享库:

代码语言:javascript
复制
gcc -shared -o libtmalloc.so -fPIC tmalloc.c

然后,我修改了makefile以使用共享库,并且全局地将'malloc‘定义为我的自定义函数名(在内部调用malloc()到malloc_t,以及calloc()和free()):

代码语言:javascript
复制
gcc -L/home/path/to/mallocTrace -Wall -o test test.c lib/coder/*.c -lm -ltmalloc \
-Dmalloc=malloc_t \
-Dcalloc=calloc_t \
-Dfree=free_t

定义更改了对我的所有函数调用,这些函数调用链接到共享库中的实现。因为我使用的是共享库(已经编译好了),所以不必担心makefile定义会导致自定义函数中的递归调用情况。通过这种使用,我可以从其他工具中获取任何预先生成的C代码,并通过这些简单的makefile更改和使用我的定制malloc跟踪库来观察内存的使用情况。

票数 0
EN

Stack Overflow用户

发布于 2014-09-17 20:06:02

最简单的解决方案是在代码中不直接调用malloc:如果选择不同的名称(例如MALLOC),切换到自定义分配器就很简单。

示例代码:

代码语言:javascript
复制
#ifndef MALLOC
#define MALLOC malloc
#endif

对于测试构建,您可以使用-DMALLOC=myMalloc

如果出于某种原因,希望保留对malloc的调用,情况就会变得更加复杂。然后,在所有标准库头都包含了之后,您必须添加类似于下面的

代码语言:javascript
复制
#ifdef USE_MY_MALLOC
#undef malloc
#define malloc(SIZE) myMalloc(SIZE)
#endif

您可以通过使用parens调用标准库函数

代码语言:javascript
复制
void* myMalloc(unsigned size)
{
    ...
    return (malloc)(size);
}

并通过-DUSE_MY_MALLOC启用它。

考虑到评论中提出的额外要求,提出了两种办法:

  • 预处理生成的源,通过文本替换对malloc的调用。
  • 拦截stdlib.h的包含(假设MATLAB从那里获取其malloc声明)

您自己版本的stdlib.h应该如下所示:

代码语言:javascript
复制
#ifndef MY_STDLIB_H_
#define MY_STDLIB_H_

#include "/usr/include/stdlib.h"

#undef malloc
#define malloc(SIZE) myMalloc(SIZE)

#endif

然后,可以有条件地将放置该文件的目录添加到包含路径。还请注意,这不是一个特别健壮的解决方案,但无论如何,它可能对您有用。

票数 2
EN

Stack Overflow用户

发布于 2014-09-17 18:22:33

可以使用指向函数的指针。在正常情况下,让它指向malloc。在调试模式中,让它指向您的函数。

在某些h文件中:

代码语言:javascript
复制
extern void *(*myMalloc)(size_t size);

在你们中的一个c文件中:

代码语言:javascript
复制
#ifdef DEBUG
void *(*myMalloc)(size_t size) = dMalloc;
#else
void *(*myMalloc)(size_t size) = malloc; // derived from libc
#endif
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25896217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档