歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> 學習Linux

動態鏈接過程,動態鏈接

動態鏈接過程,動態鏈接


動態鏈接過程,動態鏈接


  最近學習了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。

  

http://xxxxxx/Linuxjc/1135730.html TechArticle

Copyright © Linux教程網 All Rights Reserved