2017-09-27 198 views
3

GCC 6.3的手冊頁說:如何正確使用`--wrap`選項來包裝函數?

--wrap=symbol 
      Use a wrapper function for symbol. Any undefined reference to 
      symbol will be resolved to "__wrap_symbol". Any undefined 
      reference to "__real_symbol" will be resolved to symbol. 
      ... 
      If you link other code with this file using --wrap malloc, then all 
      calls to "malloc" will call the function "__wrap_malloc" instead. 
      The call to "__real_malloc" in "__wrap_malloc" will call the real 
      "malloc" function. 

所以我創建了一個簡單的例子:

#include <stdio.h> 

int foo() { 
    printf("foo\n"); 
    return 0; 
} 

int __wrap_foo() { 
    printf("wrap foo\n"); 
    return 0; 
} 

int main() { 
    printf("foo:");foo(); 
    printf("wrapfoo:");__wrap_foo(); 
    printf("realfoo:");__real_foo(); 
    return 0; 
} 

並編譯它:

gcc main.c -Wl,--wrap=foo -o main 

這給了我一個警告:

main.c:18:21: warning: implicit declaration of function ‘__real_foo’ [-Wimplicit-function-declaration] 
    printf("realfoo:");__real_foo(); 
        ^~~~~~~~~~ 

好吧。現在,我建議像這樣的輸出:

foo:wrap foo 
wrapfoo:wrap foo 
realfoo:foo 

相反,我得到這樣的:

foo:foo 
wrapfoo:wrap foo 
realfoo:foo 

我希望事情是清楚的。我對這個警告感到困惑。通常,__real函數應該由鏈接器鏈接到foo()。此外,致電foo()應與__wrap_foo掛鉤。但輸出顯示,foo()正在執行。

如何正確使用--wrap

+4

它做的工作。但是,因爲你有一個翻譯單元,和'foo'存在,通話到'foo'不是一個**未定義的引用**到'foo'。 – StoryTeller

+0

嗯,我不明白。上面的例子的輸出對我來說似乎是錯誤的。'foo()'應該輸出''wrap foo' ! 我究竟做錯了什麼? – eDeviser

+2

您忽略了「未定義參考」**要求**。 – StoryTeller

回答

2

至於講故事的人告訴我,我忽略我上面已經貼了「未定義的引用」的要求:

...任何未定義參考到符號將被解析爲「__wrap_symbol」。任何未定義的參考到「__real_symbol」將被解析爲符號。

要使用--wrap選項我重新安排我的代碼,例如這樣的:

的main.c:

#include <stdio.h> 
extern int foo(); 
extern int __real_foo(); 

int __wrap_foo() { 
    printf("wrap foo\n"); 
    return 0; 
} 

int main() { 
    printf("foo:");foo(); 
    printf("wrapfoo:");__wrap_foo(); 
    printf("realfoo:");__real_foo(); 
    return 0; 
} 

foo.c的:

#include <stdio.h> 
int foo() { 
    printf("foo\n"); 
    return 0; 
} 

然後編譯:

gcc main.c foo.c -Wl,--wrap=foo -o main 

運行./main後,驚人的輸出:

foo:wrap foo 
wrapfoo:wrap foo 
realfoo:foo 

訣竅是(糾正我,如果我錯了)認爲foo()__real_foo()引用不會在編譯時定義。即它們有**未定義的引用,」這是爲requierement鏈接鏈接到foo()__wrap_foo()__real_foo()foo()

相關問題