.plt的作用是一個跳板,保存了某個符號在重定位表中的偏移量(用來第一次查找某個符號)和對應的.got.plt的對應的地址
.rel.dyn保存了.got段的開始地址,未證明
.rel.plt保存了重定位表的信息
.got據說是保存了elf文件本身的各個符號的偏移量,即不要動態鏈接,未證明
.got.plt保存了重定位地址。
比如printf是一個重定位符號,需要連接該符號時過程是這樣:
main函數call .plt段中的一個地址,這裡的第一句話就是調轉到.got.plt中的保存的printf的地址,如果是第一次,那麼保存的地址就是.plt中的下一句話,這個下一句話就是壓入這個符號在.rel.plt中的重定位表的偏移量,然後ld程序就會根據重定位表中的信息加上這個偏移量找到這個地址,保存到重定位表所指向的地址中,這個地址其實就是.got.plt段的一個地址。
第二次調用時就可以直接獲取到.got.plt中保存的地址了。
總之,這個設計讓人就覺得很完整,有聯系,6666666