簡體   English   中英

GCC Makefile定義

[英]GCC Makefile Define

我有一些要測試的C代碼。 它使用malloc,calloc和釋放代碼。 我想將這些功能更改為內部調用原始功能的自定義功能。 例如:

emxArray->size = (int *)malloc((unsigned int)(sizeof(int) * numDimensions));

會成為:

emxArray->size = (int *)myMalloc((unsigned int)(sizeof(int) * numDimensions));

myMalloc在哪里:

void* myMalloc(unsigned size)
{
    if (size < 8)
    {
        //printf("*** Bumped from %d....\n", size);
        size = 8;
    }
    allocated += size;
    return malloc(size);
}

如您所見,myMalloc在內部調用malloc。 它只是做一些額外的東西。 我想用myMalloc替換整個代碼中的malloc用法。 我已經通過完成所有代碼並將malloc手動替換為myMalloc來成功地做到了這一點,但這遠非理想。 我將僅在測試的基礎上替換此代碼,因此生產代碼應僅包含malloc調用。 我意識到我也可以使用腳本來執行此操作,但只想在Makefile中使用define語句:

-Dmalloc=myMalloc

但這也替換了myMalloc函數中的malloc,這會導致無限遞歸的情況。 我嘗試將myMalloc函數中的malloc調用更改為malloc_d,並向Makefile添加了第二個定義。

-Dmalloc=myMalloc -Dmalloc_d=malloc

我在想,第一個定義不會替換malloc_d(它沒有),而第二個定義只會更改malloc_d(它沒有)。 我有相同的遞歸情況。 無論如何,用Makefile定義可以做到這一點嗎? 還是多遍預編譯的情況總是會搞砸呢?

更新:

好的,因此我已經開始查看已指出的LD_PRELOAD選項。 我以為我有一個可行的解決方案,但是,我仍然遇到麻煩! 這是我做的...

  1. 我將myMalloc()和myFree()從主文件移到了自己的文件中。 然后,我使用以下命令將其編譯到共享庫中:gcc -shared -o libMyMalloc.so -fPIC myMalloc.c
  2. 然后,我在主文件中添加了以下“虛擬函數”:

    void * myMalloc(unsigned size){void * ptr; 返回ptr; }

    無效的myFree(void * ptr){}

如您所見,它們什么也不做。

  1. 我在make文件中添加了以下定義:-Dmalloc = myMalloc \\ -Dfree = myFree
  2. 我編譯了代碼,並針對創建的libMyMalloc.so庫運行了該代碼:

    LD_PRELOAD = / home / rad / Desktop / myMalloc / libMyMalloc.so ./testRegress

但是,我仍然無法使其與libMyMalloc.so文件中定義的myMalloc函數一起運行。

最簡單的解決方案是不直接在代碼中調用malloc :如果選擇其他名稱(例如MALLOC ),則切換到自定義分配器很簡單。

示例代碼:

#ifndef MALLOC
#define MALLOC malloc
#endif

對於測試版本,可以使用-DMALLOC=myMalloc

如果出於某種原因要保留對malloc的調用,它將變得更加復雜。 然后, 在包含所有標准庫頭之后,您必須添加以下內容:

#ifdef USE_MY_MALLOC
#undef malloc
#define malloc(SIZE) myMalloc(SIZE)
#endif

您可以使用parens調用標准庫函數,即

void* myMalloc(unsigned size)
{
    ...
    return (malloc)(size);
}

並通過-DUSE_MY_MALLOC啟用它。


考慮到注釋中給出的其他要求,想到了兩種方法:

  • 預處理生成的源,以文本方式替換對malloc調用
  • 攔截stdlib.h包含(假設這是MATLAB從中獲取其malloc聲明的位置)

您自己的stdlib.h版本看起來像這樣:

#ifndef MY_STDLIB_H_
#define MY_STDLIB_H_

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

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

#endif

然后,您可以有條件地將放置該文件的目錄添加到包含路徑。 還要注意,這不是一個特別健壯的解決方案,但是無論如何它可能對您有用。

您可以使用指向函數的指針。 通常情況下,使其指向malloc。 在調試模式下,讓它指向您的功能。

在一些h文件中:

extern void *(*myMalloc)(size_t size);

在你們其中的一個c文件中:

#ifdef DEBUG
void *(*myMalloc)(size_t size) = dMalloc;
#else
void *(*myMalloc)(size_t size) = malloc; // derived from libc
#endif

我找到了解決方案,並希望分享。 感謝所有為我做出正確貢獻的人。

我最終創建了自定義庫代碼,並將其編譯為共享庫:

gcc -shared -o libtmalloc.so -fPIC tmalloc.c

然后,我修改了makefile以使用共享庫,並在自定義函數名稱(內部調用malloc()),malloc_t以及calloc()和free()中全局定義了“ malloc”:

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跟蹤庫來觀察內存使用情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM