ELF Format 笔记(七)—— 符号表
最是那一低頭的溫柔,像一朵水蓮花不勝?zèng)鲲L(fēng)的嬌羞,道一聲珍重,道一聲珍重,那一聲珍重里有蜜甜的憂愁 ——?徐志摩
ilocker:關(guān)注 Android 安全(新手) QQ: 2597294287
符號(hào)表 (symbol table) 中保存著符號(hào)的定義或者引用信息。對(duì)于 android so 文件來說,.dynsym 符號(hào)表保存著庫(kù)文件的導(dǎo)入和導(dǎo)出符號(hào)。
用 readelf 看一下 android liblog.so 的 .dynsym 動(dòng)態(tài)符號(hào)表:
?
符號(hào) __cxa_finalize 的 Ndx(st_shndx) 為 UND,表明該符號(hào)在本 so 中未定義,需要去 liblog.so 的依賴庫(kù)中去找。那 liblog.so 依賴哪些庫(kù)?可以從 .dynamic 中找到。
?
符號(hào) __cxa_finalize 的定義應(yīng)該在 libc.so 中。
符號(hào) __android_log_vprint 的 Ndx(st_shndx) 為 8,表示該符號(hào)在本 so 中有定義,并且定義該符號(hào)的 section 在 section header table 中的索引是 8。看一下 section header table:
?
可以看到,符號(hào) __android_log_vprint 定義在 .text section 中,這也是理所當(dāng)然。所以 __android_log_vprint 是一個(gè)導(dǎo)出符號(hào),由那些需要打印日志的程序調(diào)用。
因?yàn)榉?hào) __android_log_vprint 是在本 so 中定義的,所以看到其 Value(st_value) 不為 0。android linker 在做符號(hào)重定位工作時(shí),就是由這個(gè) st_value 找到該符號(hào)定義在內(nèi)存中的地址。不過 0x00001539 當(dāng)然不是符號(hào)的最終的內(nèi)存地址,linker 會(huì)再加上 liblog.so 在內(nèi)存中的基址,所以 st_value 相當(dāng)于一個(gè)地址偏移。
回過頭再看一下,符號(hào)表其實(shí)就是一個(gè)結(jié)構(gòu)體數(shù)組,每個(gè)結(jié)構(gòu)體描述一個(gè)符號(hào)的信息。結(jié)構(gòu)體的定義如下:
?
其中 st_value 和 st_shndx ,上面已經(jīng)有所介紹。
st_name 是符號(hào)的名字,這里保存的只是一個(gè)引用字符串表的索引值。
st_size 對(duì)于導(dǎo)入符號(hào)來說,根本不知道人家有多大,所以為 0。對(duì)于導(dǎo)出符號(hào),則會(huì)明確標(biāo)明大小。
st_info 包含了符號(hào)的類型和綁定屬性等信息,后續(xù)筆記再具體寫。
st_other 保留未用,不必關(guān)心。
轉(zhuǎn)載于:https://www.cnblogs.com/ilocker/p/4631704.html
總結(jié)
以上是生活随笔為你收集整理的ELF Format 笔记(七)—— 符号表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 会话Cookie及session的关系(
- 下一篇: switch暗黑3怎么刷amibo