一文搞懂linux的庫打樁

2021-10-04 03:34:46 字數 3349 閱讀 2457

linux下的鏈結器支援乙個強大的庫打樁(library interpositioning),允許你攔截對系統標準庫中某個目標函式的呼叫,取而代之執行自己的包裝函式。它可以給我們帶來兩個好處,一是通過新增某些語句,可以追蹤自己的程式對某些庫函式的呼叫情況;二是可以在你自己的程式中,對某些庫函式偷天換日,替換成乙個完全不同的實現。

**需求:**假設需要在主程式myprog.c中跟蹤對庫函式malloc和free的使用情況。

建立mymalloc.c檔案,定義需要的包裝函式mymalloc和myfree.

#ifdef compiletime

#include

#include

//定義malloc 包裝函式

void

*mymalloc

(size_t size)

//定義free 包裝函式

void

*myfree

(void

*ptr)

#endif

該檔案向預處理器指明用mymalloc.c中的包裝函式替換庫里的目標函式

#define malloc(size)  mymalloc(size)

#define free(ptr) myfree(ptr)

void

*mymalloc

(size_t size)

;void

*myfree

(void

*ptr)

;

建立檔案myprog.c,並在其中正常呼叫malloc函式.

#include #include int main(void)

gcc -dcompiletime -c mymalloc.c

gcc -i. -o myprog myprog.c mymalloc.c

-i.:指示c預處理器在搜尋通常的系統目錄前,先在當前目錄中查詢malloc.h

./myprog

malloc(32)

= 0x9ee010

free(0x9ee010)

linux利用靜態鏈結器完成庫打樁。先看它的乙個命令列引數:

建立mymalloc.c檔案,定義需要的包裝函式.

#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

建立檔案myprog.c,並在其中正常呼叫malloc函式.

#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

./myprog

malloc(32) = 0x18cf010

free(0x18cf010)

編譯時打樁需要訪問程式的源**,而鏈結時需要訪問可重定位目標檔案。那有沒有一種辦法讓僅僅訪問可執行目標就能達到同樣的目的呢?我們可以利用基於動態鏈結器的ld_preload環境變數來實現。

利用這個原理,你可以對任何共享庫中的任何函式打樁,包括libc.so。

下面建立mymalloc.c檔案,其中定義了malloc和free的包裝函式。每個包裝函式中,利用dlsym呼叫libc中的標準函式。

#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

建立檔案myprog.c,並在其中正常呼叫malloc函式.

#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
結果如下

malloc(32) = 0x1bf7010

free(0x1bf7010)

在csh或tcsh中執行方法:

(setenv ld_preload "./mymalloc.so";  ./myprog;  unsetenv ld_preload)
結果如下

malloc(32) = 0x2157010

free(0x2157010)

gnu binutils包有許多實用的工具特別有幫助,而且可以執行在每乙個linux平台上。

嵌入式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...