Linux C 庫打樁技術

2021-10-06 00:07:06 字數 3649 閱讀 2842

3.2.編譯命令

3.3.運**況和執行命令

3.4.說明

4.編譯時打樁

4.2.編譯命令和執行命令

4.3.運**況

4.4.說明

5. 執行時打樁

5.2.編譯命令和執行命令

5.3.運**況

5.4.說明

6. 參考資料

庫打樁技術,可以截獲對共享庫函式的呼叫。應用上可以如可以控制函式呼叫的輸入輸出值,以自己的邏輯替換函式呼叫等;

基本思想:建立乙個與目標函式相同原型的包裝函式,通過編譯時函式實現的搜尋機制、或鏈結時函式符號解析搜尋的機制、或執行時動態鏈結庫的載入機制,將自定義的包裝函式替換目標函式。

系統環境:ubuntu14.04

gcc版本:gcc version 4.8.4 (ubuntu 4.8.4-2ubuntu1~14.04.4)

#include

#include

intmain()

#define  calloc(nmemb,size) newcalloc(nmemb,size)

#define free(ptr) newfree(ptr)

void

*newcalloc

(size_t nmemb, size_t size)

;void

newfree

(void

*ptr)

;

#include

#include

void

*newcalloc

(size_t nmemb, size_t size)

void

newfree

(void

*ptr)

gcc -m32 -g -c newcalloc.c;

gcc -m32 -g -i. -o main main.c newcalloc.o;

./main

備註 :從測試情況看,這裡不指定-i編譯選項,也能按期望執行,即main.c中即使以尖括號方式include了,也是從當前目錄先搜尋。

1、編譯時打樁,需要能訪問源**,本質上就是先定義自己的包裝函式,在包裝函式中進行呼叫標準的目標方法,並生成可重定位的檔案。再定義乙個通過巨集定義方式轉換的標頭檔案(名稱同需要打樁的函式所在的標頭檔案),gcc編譯時優先從本地搜尋該同名頭檔案而呼叫了包裝函式;

2、這裡的乙個注意點,對於包裝檔案newcalloc.c的編譯需要單獨編譯,不能與巨集定義轉換的標頭檔案放在同乙個目錄下進行編譯,否則會變成迴圈巢狀遞迴呼叫,最終導致程式異常。

1、編譯時打樁,需要能訪問可重定位的目標檔案;

2、靜態鏈結器支援使用–wrap f選項進行打樁,即把對符號f的引用解析成__wrap_f,並對符號__real_f的引用解析成f。

1、此機制基於動態鏈結器的ld_reload環境變數。當載入和執行乙個程式,需要解析未定義的引用時,動態鏈結器(ld-linux.so)會先搜尋ld_preload庫,如果沒有搜尋到 ,則再搜尋其他庫。

2、中巨集定義_gnu_source不能工作,檢視dlfcn.**件,需要使用__use_gnu(#include 前面定義)

《深入理解計算機系統》中文版,[美]randal e.bryant等著,2019.3,機械工業出版社

ARM GCC 庫打樁 符號替換

開發中,難免會遇到只有庫沒有原始碼的情況,除錯的時候,庫里的幾個函式又非常關鍵,那我們怎麼控制裡面的流程呢,並插入自己 這個時候就需要使用 gcc 工具重定義庫中的符號,然後在外面包裝該函式。乙個庫 lib test.a 庫中的函式 void hello test lib void 現在,我們想把庫...

Linux C開發 I O技術

1.嵌入式linux系統開發 通過核心提供的服務實現相應的功能。嵌入式linuxc開發相當於 會看使用說明書 2.linux系統空間劃分 使用者空間,核心空間 使用者空間不能隨便訪問核心空間 劃分空間的目的 保護核心空間不能被使用者空間隨便訪問 3.系統呼叫 核心提供的安全訪問機制 硬體中斷,軟體中...

一文搞懂linux的庫打樁

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