使用ld的wrap選項替換已有庫函式

2021-06-18 17:17:36 字數 758 閱讀 9876

3 replies

很多時候,可能需要替換已有庫函式,或者對其庫函式進行修改。

為了避免對那些靜態鏈結庫或者動態鏈結庫檔案大動干戈,我們可以使用ld提供的–wrap選項。

例如,想把所有的malloc函式都作修改,以便讓malloc出的記憶體都是32位元組對齊的。

我們可以給ld傳選項「­­wrap=malloc」, 告訴ld,我們將替換名稱為malloc的函式。

接著再如下定義乙個新的malloc函式:

void * __wrap_malloc( size_t

size)

可以看到,程式中有個類似庫函式名稱的__wrap_malloc。

ld在遇到__wrap選項後,會使用__wrap_malloc函式名替換所有對malloc的呼叫。

並以此實現替換的作用。

那麼,如果還向呼叫原函式怎麼辦呢?

可以使用__real_malloc,這個函式名稱就對應了原來的malloc。

每次呼叫malloc時都列印生成的指標位址。

void * __wrap_malloc( size_t

size)

附完整程式:

#include

#include

void * __wrap_malloc( size_t

size)

intmain ()

編譯選項:

$gcc test_malloc.c -wl,--wrap=malloc

使用ld的wrap選項替換已有庫函式

很多時候,可能需要替換已有庫函式,或者對其庫函式進行修改。為了避免對那些靜態鏈結庫或者動態鏈結庫檔案大動干戈,我們可以使用ld提供的 wrap選項。例如,想把所有的malloc函式都作修改,以便讓malloc出的記憶體都是32位元組對齊的。我們可以給ld傳選項 wrap malloc 告訴ld,我們...

linux vi替換的使用

esc 命令模式與插入模式的切換 一 vi查詢 當你用vi開啟乙個檔案後,因為檔案太長,如何才能找到你所要查詢的關鍵字呢?在vi裡可沒有選單 查詢,不過沒關係,你在命令模式下敲斜桿 這時在狀態列 也就是螢幕左下腳 就出現了 然後輸入你要查詢的關鍵字 敲回車就可以了。如果你要繼續查詢此關鍵字,敲字元n...

gcc g 命令的經常使用選項

gcc g 命令的經常使用選項格式 選項 解釋 o file 指定輸出檔名稱。在編譯為目標 時,這一選項不是必須的。假設file沒有指定,預設檔名稱是a.out.c 僅僅編譯生成目標檔案,不鏈結 m486 針對 486 進行 優化。o0 不進行優化處理。o 或 o1 優化生成 o2 進一步優化。o3...