gcc觀察運行時連接符號綁定

經過設置 LD_DEBUG 環境變量,能夠觀察使用缺省搜索模型及最終綁定的運行時符號搜索編輯器

對於開發調試動態庫頗有幫助能夠設置爲:

-> bindings:顯示動態連接的符號綁定過程

-> libs:顯示共享庫的查找過程

-> versions:顯示符號的版本依賴關係

-> reloc:顯示重定位過程

-> symbols:顯示符號表查找過程

-> statistics:顯示動態連接過程當中的各類統計信息

-> all:顯示以上全部信息spa

演示一個簡單的例子:設計

下面分別是w.c, W.c, x.c, X.c, main.c 5 個文件調試

w.c接口

W.c開發

x.cio

X.ctest

main.c變量

下面是執行的命令.gcc

執行下面命令顯示符號搜索綁定過程.

liyl@liyl-X450VC:~/sourse/gcc_option_test$ LD_DEBUG=symbols,bindings ./prog1

 

 

定義顯式插入

缺省搜索模型可能會致使同名符號的實例插入到同名的後續實例上。即便沒有任何顯式標籤,仍然會發生插入,以便從全部引用綁定到同一個符號定義。發生該隱式插入是符號搜索的結果,而不是由於向運行時連接程序發出了任何顯式指令。使用直接綁定能夠禁用該隱式插入。

雖然直接綁定可以將符號引用直接解析到關聯的符號定義,可是顯式插入是在任何直接綁定搜索以前處理的。所以,即便是在直接綁定環境內,也能夠對插入項進行設計並預期它在任意直接綁定關聯上進行插入。可使用下列技術顯式定義插入項。

  • 使用 LD_PRELOAD 環境變量。

  • 使用連接編輯器 –z interpose 選項。

  • singleton 符號定義產生的結果。

LD_PRELOAD 環境變量的插入功能和 –z interpose 選項已經使用了一段時間。請參見運行時插入。由於這些目標文件是顯式定義爲插入項的,所以運行時連接程序將在處理任何直接綁定以前檢查這些目標文件。

爲一個共享目標文件創建的插入將應用於該動態目標文件的全部接口。系統使用 LD_PRELOAD 環境變量裝入目標文件時,會創建該目標文件插入。在裝入已使用 –z interpose 選項生成的目標文件時,也會創建目標文件插入。當使用具備特殊句柄 RTLD_NEXT 的 dlsym(3C) 等技術時,該目標文件模型很重要。插入目標文件應始終具備下一個目標文件的一致視圖。

 

經過LD_PRELOAD 環境變量顯示插入符號:

例子中把a,b 的binding 從libw.so 篡改成libx.so

LD_PRELOAD=libx.so LD_DEBUG=symbols,bindings ./prog1

相關文章
相關標籤/搜索