僅使用其內存映像可以提取已加載共享庫的導出符號?在運行時定位ELF共享庫導出
我在說的是.dynsym部分列出的符號。據我所知,我們可以這樣:
找到庫的基地址。
例如,通過讀取/proc/<pid>/maps
,可以找到從磁盤庫中映射的內存區域,然後我們可以查找ELF魔術字節以找到ELF標頭,從而爲我們提供基地址。從程序頭中找到PT_DYNAMIC段。
解析ELF標題,然後遍歷程序標題以找到包含.dynamic部分的段。提取動態符號表的位置。
對ElfN_Dyn進行迭代結構可以找到帶有DT_TAB和DT_SYMTAB的d_tags。這些將爲我們提供字符串表(帶有符號名稱)和動態符號表本身的地址。
這就是我偶然發現的地方。 .dynamic部分有一個標記爲字符串表(DT_STRSZ)的大小,但沒有指示符號表大小。它只包含單個條目的大小(DT_SYMENT)。我如何檢索表格中符號條目的數量?
應該可以推斷,從.dynsym節的大小,但ELF文件在內存中表示爲段。節表不需要加載到內存中,只能通過讀取相應的文件(可靠地)訪問。
我相信這是可能的,因爲動態鏈接器必須知道符號表的大小。但是,動態加載器可能已經將其存儲在文件被加載的地方,並且鏈接器僅使用緩存的值。雖然將符號表加載到內存中看起來有點愚蠢,但不會加載少數幾個字節的大小。