dladdr 獲取某個位址的符號資訊

2021-06-20 07:26:46 字數 2459 閱讀 3527

名稱 dladdr() - 獲取某個位址的符號資訊 概要 cc [ flag]... cfile ... -ldl [library]... #include dlfcn.h int dladdr(void *address, dl_info *dlip); 多執行緒應用資訊 該例行程式是執行緒安全的。 說明 dladdr() 是使使用者能夠直接訪問動態鏈結裝置(在編譯

名稱

dladdr() - 獲取某個位址的符號資訊

概要

cc [ flag]... cfile ... -ldl [library]...

#include

int dladdr(void *address, dl_info *dlip);

多執行緒應用資訊

該例行程式是執行緒安全的。

說明

dladdr() 是使使用者能夠直接訪問動態鏈結裝置(在編譯程式或ld 命令列上使用-ldl 選項)的一系列例行程式之

一。程序可通過dladdr() 獲取有關最近定義給定address 的符號的資訊。dladdr() 可確定指定的address 是否位

於構成程序的進址空間的其中乙個載入模組(可執行庫或共享庫)內。如果某個位址位於在其上面對映載入模組

的基址和為該載入模組對映的最高虛擬位址之間(包括兩端),則認為該位址在載入模組的範圍內。如果某個加

載模組符合這個條件,則會搜尋其動態符號表,以查詢與指定的address 最接近的符號。最接近的符號是指其值

等於,或最為接近但小於指定的address 的符號。

dlip 是指向dl_info 結構的指標。該結構必須由使用者分配。如果指定的address 在其中乙個載入模組的範圍內,則

結構成員由dladdr() 設定。dl_info 結構包含下列成員:

struct ;

dl_info 結構包含以下字段:

dli_fname 乙個指標,指向包含address

的載入模組的檔名。每次呼叫dladdr() 後,該記憶體位置的內容都可能發生更改。

dli_fbase 載入模組的控制代碼。該控制代碼可用作dlsym() 的第乙個引數。

dli_sname 乙個指標,指向與指定的address

最接近的符號的名稱。該符號要麼帶有相同的位址,要麼是帶有低位位址的最接近符號。

兩次呼叫dladdr() 後,該記憶體位置的內容可能發生更改。

section 3-264 hewlett-packard company − 1 − hp-ux 11i version 3: february 2007

dladdr(3c) dladdr(3c)

dli_saddr 最接近符號的實際位址。對於**符號,它包含最接近**符號的opd(正式plabel 描

述符)的位址。

dli_size (僅限elf 程序)動態符號表中定義的最接近符號的大小。

dli_bind (僅限elf 程序)動態符號表中定義的最接近符號的繫結屬性。其值用於elf 符號表

(請參閱)中的符號的繫結。

dli_type 最接近符號的型別。對於elf 程序,這與動態符號表中的型別的值相同。其值用於elf

符號表(請參閱)中的符號的型別。對於som 程序,這可能包括中定義

的值type_dat a 或type_procedure 。

返回值

如果指定的address 不在其中乙個載入模組的範圍內,則返回0 ;且不修改dl_info 結構的內容。否則,將返回

乙個非零值,同時設定dl_info 結構的字段。

診斷資訊

如果在包含address 的載入模組內,找不到其值小於或等於address 的符號,則dli_sname 、dli_saddr 和dli_size

欄位將設定為0 ; dli_bind 字段設定為stb_local , dli_type 字段設定為stt_notype 。

對於a.out ,通常只匯出一部分可見符號:尤其是鏈結了a.out 的載入模組引用的那些符號。可以使用鏈結程式

(請參閱ld(1) )來控制任何共享庫或a.out 的輸出符號的確切集合。

錯誤

如果dladdr() 失敗,則隨後對dlerrno() 的呼叫返回下列值之一:

[rtld_err_bad_dll] 載入模組中的符號位址無效。

[rtld_err_dladdr_notfound] 在所有載入模組中都找不到該位址。

[rtld_err_no_memory] 記憶體不足。

[rtld_err_setcancelstate_failed] 進入或退出dladdr() 時__thread_setcancelstate 失敗。

[rtld_err_sigenable_failed] 退出dladdr() 時sigenable 失敗。

[rtld_err_siginhibit_failed] 進入dladdr() 時siginhibit 失敗。

linux核心中符號位址的獲取

有些核心函式或者核心變數是不匯出的,但是確實需要用,那該怎麼辦?因此尋找核心符號位址就有必要進行一下總結,更有甚,如果想找一條特定的指令,比如movl的指令位址,那更需要投入一些精力!總的來說,我總結了下面五種方式 1.通過procfs中的kallsym檔案或者system.map檔案直接查詢 這種...

獲取本機的位址

剛學網路程式設計,試著做了乙個獲取本機的名及位址的方法,開始怎麼也獲取的不對,原來錯誤在這裡 i longint pointer p h addr list 這句開始少了 pointer 了,因為 h addr list 本來就是乙個指標 pchar,所以取得了這個指標的值後再去獲取這個指標所指向的...

獲取listview某個item的view物件

首先說,listview有個getchildat int position 的方法,但是這個方法只計算可視的item,也就是說position只是從第乙個可以看到的item算起的,這樣就和實際獲取的position是不一樣的。直接說解決方法吧 html view plain copy listvie...