linux下的鏈結器支援乙個強大的庫打樁(library interpositioning),允許你攔截對系統標準庫中某個目標函式的呼叫,取而代之執行自己的包裝函式。它可以給我們帶來兩個好處,一是通過新增某些語句,可以追蹤自己的程式對某些庫函式的呼叫情況;二是可以在你自己的程式中,對某些庫函式偷天換日,替換成乙個完全不同的實現。
**需求:**假設需要在主程式myprog.c中跟蹤對庫函式malloc和free的使用情況。
建立mymalloc.c檔案,定義需要的包裝函式mymalloc和myfree.
該檔案向預處理器指明用mymalloc.c中的包裝函式替換庫里的目標函式#ifdef compiletime
#include
#include
//定義malloc 包裝函式
void
*mymalloc
(size_t size)
//定義free 包裝函式
void
*myfree
(void
*ptr)
#endif
建立檔案myprog.c,並在其中正常呼叫malloc函式.#define malloc(size) mymalloc(size)
#define free(ptr) myfree(ptr)
void
*mymalloc
(size_t size)
;void
*myfree
(void
*ptr)
;
#include #include int main(void)
-i.:指示c預處理器在搜尋通常的系統目錄前,先在當前目錄中查詢malloc.hgcc -dcompiletime -c mymalloc.c
gcc -i. -o myprog myprog.c mymalloc.c
linux利用靜態鏈結器完成庫打樁。先看它的乙個命令列引數:./myprog
malloc(32)
= 0x9ee010
free(0x9ee010)
建立mymalloc.c檔案,定義需要的包裝函式.
建立檔案myprog.c,並在其中正常呼叫malloc函式.#ifdef liketime
#include
void
*__real_malloc
(size_t size)
;void
__real_free
(void
*ptr)
;//定義malloc 包裝函式
void
*__wrap_malloc
(size_t size)
//定義free 包裝函式
void
*__wrap_free
(void
*ptr)
#endif
#include int main(void)
gcc -dlinktime -c mymalloc.c
gcc -c myprog.c
gcc -wl,--wrap,malloc -wl,--wrap,free -o myprog myprog.o mymalloc.o
編譯時打樁需要訪問程式的源**,而鏈結時需要訪問可重定位目標檔案。那有沒有一種辦法讓僅僅訪問可執行目標就能達到同樣的目的呢?我們可以利用基於動態鏈結器的ld_preload環境變數來實現。./myprog
malloc(32) = 0x18cf010
free(0x18cf010)
利用這個原理,你可以對任何共享庫中的任何函式打樁,包括libc.so。
下面建立mymalloc.c檔案,其中定義了malloc和free的包裝函式。每個包裝函式中,利用dlsym呼叫libc中的標準函式。
建立檔案myprog.c,並在其中正常呼叫malloc函式.#ifdef runtime
#define _gnu_source
#include
#include
#include
//定義malloc 包裝函式
void
*malloc
(size_t size)
char
*ptr =
*mallocp
(size)
;//利用函式指標間接呼叫libc中的malloc函式
printf
("malloc(%d) = %p\n",(
int)size, ptr)
;return ptr;
}//定義free 包裝函式
void
*free
(void
*ptr)
*freep
(ptr)
;//利用函式指標間接呼叫libc中的free函式
printf
("free(%p)\n"
, ptr);}
#endif
#include int main(void)
gcc -druntime -shared -fpic -o mymalloc.so mymalloc.c -ldl
gcc -o myprog myprog.c //編譯
在bash中執行,及其結果:
ld_preload="./mymalloc.so" ./myprog
結果如下
在csh或tcsh中執行方法:malloc(32) = 0x1bf7010
free(0x1bf7010)
(setenv ld_preload "./mymalloc.so"; ./myprog; unsetenv ld_preload)
結果如下
gnu binutils包有許多實用的工具特別有幫助,而且可以執行在每乙個linux平台上。malloc(32) = 0x2157010
free(0x2157010)
嵌入式linux&arm
csdn部落格
一文搞懂transform skew
目錄 如何理解斜切 skew,先看乙個 demo。在下面的 demo 中,有 4 個正方形,分別是 紅色 不做 skew 變換,綠色 x 方向變換,藍色 y 方向變換,黑色 兩個方向都變換,拖動下面的滑塊可以檢視改變 skew 角度後的效果。切換 selector 可以設定 transform or...
一文搞懂C 標準IO庫
介紹 分類普通流 檔案流介紹注意點 string流介紹 首先看一下io庫,標準函式庫,stl這些概念之間都是怎麼樣乙個關係 什麼是io庫?io庫就是有一些標準io類組成的類庫 通過這些io類可以實現對可實現對裝置 控制台,檔案等 的io操作,對記憶體的io 即string類 操作 其中對控制台的io...
一文搞懂property函式
接下來我帶大家了解乙個函式的作用以及使用技巧,希望對大家都有幫助,話不多說,接下來就開始我的表演特性 首先property有兩種用法,一種是作為函式的用法,一種是作為裝飾器的用法,接下來我們就逐一分析 property函式 看一下作為函式它包含的引數都有哪些 property fget none,f...