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