最近學習了elf文件的格式,重點關註了動態鏈接過程中的使用到的section 第一步程式在載入時,會把解釋器程式加入到.interp段。可以解決動態庫和可執行文件的載入。 一般來講程式的載入方式是懶啟動,Lazy;除非指定了LD_BIND_NOW環境變數非0,那麼在程式啟動時就會把外部符號地址全部加 ...
最近學習了elf文件的格式,重點關註了動態鏈接過程中的使用到的section
第一步程式在載入時,會把解釋器程式加入到.interp段。可以解決動態庫和可執行文件的載入。
一般來講程式的載入方式是懶啟動,Lazy;除非指定了LD_BIND_NOW環境變數非0,那麼在程式啟動時就會把外部符號地址全部載入完成。
當遇到還未載入的符號時,比如printf,出在libc中。
首先程式會到call plt段中的某個地址,這裡只是一個跳轉,如:
調用malloc
0x080484d8 <+24>: e8 63 fe ff ff call 0x8048340 <malloc@plt>
此處是跳轉到*0x804a004中的內容指定的地址,這個指針地址是處於.got.plt段的,如果是第一次調用,那麼.got.plt表中保存的是0x8048346,就是plt段的下一句話,這時候會壓入一個offset,這個8,這個8是這個符號在所對應的重定位表中的偏移量,找到重定位表中的這個符號,這個符號有一個32位的標誌,裡面有符號表中的信息,接著找到符號表中的符號。以上這些從重定位表開始的操作都應該是由ld這個庫裡面的函數里完成的。
0x08048340 <+0>: jmp *0x804a004
0x08048346 <+6>: push $0x8
0x0804834b <+11>: jmp 0x8048320
實際上這個偏移量8對應的就是地址0x804a004,ld將會找到正確的地址賦給指針0x804a004。