2010-09-29 51 views
4

我已經在網上搜索了很多,但是我找不到一個與g ++一起工作的例子,所有例子都使用gcc。 我不斷收到的錯誤是有沒有人用C++封裝函數的例子?

wrap_malloc.o: In function `__wrap_malloc(unsigned int)': 
wrap_malloc.cc:(.text+0x20): undefined reference to `__real_malloc(unsigned int)' 
wrap_malloc.o: In function `main': 
wrap_malloc.cc:(.text+0x37): undefined reference to `__wrap_malloc' 
collect2: ld returned 1 exit status 

創建此錯誤是下面的代碼(此代碼的工作,如果我用gcc編譯它,並從cstdio更改頁眉到stdio.h之外):

#include <cstdio> 
#include <cstdlib> 

void *__real_malloc(size_t); 

void *__wrap_malloc(size_t c) { 
    printf("My malloc called with %d\n", c); 
    return __real_malloc(c); 
} 

int main(void) { 
    void *ptr = malloc(12); 
    free(ptr); 
    return 0; 
} 

這是我如何編譯:

wrap_malloc.o: wrap_malloc.cc 
    g++ -c wrap_malloc.cc -o wrap_malloc.o 

wrap_malloc: wrap_malloc.o 
    g++ wrap_malloc.o -o wrap_malloc -Wl,--wrap,malloc 

謝謝!

回答

12

當您使用C++編譯器時,所有名稱都會發生錯位。當您運行nm wrap_malloc.o,這應該給你這樣的事情這意味着變得清晰:

00000000 b .bss 
00000000 d .data 
00000000 r .rdata 
00000000 t .text 
     U __Z13__real_mallocj 
00000000 T __Z13__wrap_mallocj 
     U _printf 

這意味着你使用(ü)一個名爲__Z13__real_mallocj和您定義的文本段的象徵符號( T)稱爲__Z13__wrap_mallocj。但你可能需要一個叫做__real_malloc的符號。要做到這一點,你不得不說的編譯器__real_malloc是C風格的功能,如:

extern "C" void *__real_malloc(size_t); 

extern "C" void *__wrap_malloc(size_t c) { 
    printf("My malloc called with %d\n", c); 
    return __real_malloc(c); 
} 

現在的nm輸出爲:

00000000 b .bss 
00000000 d .data 
00000000 r .rdata 
00000000 t .text 
     U ___real_malloc 
00000000 T ___wrap_malloc 
     U _printf 

你可以看到那名_printf不是招沒有改變。這是因爲在頭文件中,許多函數已被聲明爲extern "C"

注意:我在cygwin環境中的Windows上執行了上述所有操作。這就是爲什麼外部符號還有一個額外的前導下劃線。

+0

非常感謝!現在我明白了這個問題。 – 2010-09-29 22:37:33

0

如果這是完整的代碼,你遇到的問題是你還沒有實現__real_malloc()

順便說一下,帶有雙下劃線的標識符由語言保留。你可能想考慮選擇不同的名字。

+1

此代碼是一個演示,我打算使用包裝只是爲了測試。如果使用--wrap = malloc編譯代碼,它會將所有調用重定向到__wrap_malloc。如果你想使用真實的東西,你必須調用__real_malloc。這裏是documentation =>任何未定義的符號引用將被解析爲「__wrap_ symbol」。對「__real_ symbol」的任何未定義的引用將被解析爲符號。 這可以用來爲系統功能提供包裝。包裝函數應該被稱爲「__wrap_ symbol」。如果它希望調用系統函數,它應該調用「__real_ symbol」。 – 2010-09-29 21:55:38