详解ELF重定向原理
生活随笔
收集整理的這篇文章主要介紹了
详解ELF重定向原理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
重定向是計算機技術中非常底層的概念和操作。它指的是將程序中涉及到的變量名與變量在計算機內存中的位置關聯起來。當在代碼中執行類似x=1;的語句時,編譯器需要通過重定向信息找到變量x對應的內存位置,然后將數值1寫入該內存,因此重定向既跟程序的加載鏈接有關,又于編譯原理有關,因此對計算機體系結構不了解,或只關注上層應用開發,對底層技術理解不多的同學對它進行掌握就會有些困難。
為了準確將變量對應到具體的內存位置,就必須要有相關信息來描述變量名與內存之間的關系,這些信息就叫重定向記錄(relocation records),程序中描述的“變量”不僅僅指int,float類型的數據變量,還會涉及到函數的入口地址,而函數或者變量的入口地址常常在鏈接或動態裝載時才會確定。例如下面代碼:
void _start() {foo() }如果boo實現放在一個obj1.c文件,函數foo實現放在boj2.c文件,那么編譯后_start函數對應的二進制指令存儲在obj1.o中,foo對應的二進制指令存儲在obj2.o中,于是整個程序要順利執行,就必須將obj1.o和obj2.o整合在一起,負責整合工作的就是連接器,它位于Linux系統的目錄/bin/ld中。問題是如何將他們整合在一起,在執行boo函數時,內部調用foo函數時,IP寄存器能準確的指向foo函數第一條指令所在位置呢,這就需要編譯器在編譯代碼時所生成的重定向數據結構,內容如下:
typedef struct {ELF64_Addr r_offset;Uint64_t r_info; } Elf64_Rel;typedef struct {ELF64_Addr r_offset;Ui總結
以上是生活随笔為你收集整理的详解ELF重定向原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ELF介绍
- 下一篇: 【Mac新手必看】Desktop Pic