
【計】 position independent code
【計】 A; AD; ADDR; address; ADR; ADRS
be foreign to; be independent of; have nothing to do with
【計】 don't care
word
【計】 code
【經】 code
地址無關代碼(Position-Independent Code, PIC)是計算機科學和軟件工程中的一個重要概念,特指一種在内存中無論加載到哪個地址都能正确執行的機器代碼或可執行文件格式。其核心設計目标是增強程式的靈活性與安全性,尤其在共享庫(Shared Libraries)和地址空間布局隨機化(ASLR)等場景中至關重要。
相對尋址替代絕對尋址
PIC通過使用相對偏移量(如相對程式計數器PC)而非絕對内存地址來訪問數據或調用函數。例如,函數調用指令不直接寫入目标函數的絕對地址,而是計算當前指令位置與目标函數的相對距離。
示例指令:
call 0x1234
(絕對尋址) → call +0x200
(相對尋址)
全局偏移表(GOT)
編譯器為每個共享庫生成全局偏移表(Global Offset Table, GOT),存儲外部變量和函數的實際地址。代碼通過GOT的固定偏移間接訪問這些符號,加載器在運行時動态填充GOT中的地址值。
過程鍊接表(PLT)
函數調用通過過程鍊接表(Procedure Linkage Table, PLT)實現延遲綁定。首次調用函數時,PLT條目跳轉到動态鍊接器解析函數地址并更新GOT;後續調用直接通過GOT跳轉。
多個進程可共享同一份PIC庫代碼的物理内存副本,減少内存占用(如Linux的.so
文件、Windows的DLL)。
支持ASLR技術,隨機化代碼加載地址以防範緩沖區溢出攻擊。
無需重定位即可加載到任意内存地址,適用于嵌入式系統或動态鍊接環境。
Linux的glibc
、Windows系統DLL均采用PIC編譯,确保多進程高效共享代碼段。
主程式通過PIC機制調用共享庫函數,避免硬編碼地址依賴。
ASLR依賴PIC實現隨機化基址,有效抵禦ROP(Return-Oriented Programming)攻擊。
PIC因增加間接尋址(如GOT/PLT訪問)可能引入輕微性能開銷,但現代處理器通過分支預測和緩存優化已大幅降低其影響。在安全性和靈活性需求優先的場景中,此開銷通常可接受。
權威參考資料:
-fPIC
Compilation Option
地址無關代碼(Position-Independent Code,PIC)是計算機領域的重要概念,其核心特點與實現原理如下:
地址無關代碼指無需修改即可加載到内存任意位置執行的機器碼。它通過特殊編譯技術,使代碼中的地址引用不依賴絕對内存地址,從而解決動态庫共享、多進程隔離等問題。該技術廣泛應用于共享庫(如Linux的.so文件),使同一份庫代碼可被多個進程複用,避免重複占用内存。
指令與數據分離
将代碼中需要修改的地址部分(如全局變量地址)剝離到數據區,保持指令部分固定。每個進程擁有獨立的數據副本,而指令部分可共享。
地址引用分類處理
提示:該技術需編譯器支持,編譯時需添加
-fPIC
等參數。其實現細節涉及ELF文件格式、動态鍊接過程等底層機制,可通過提及的GOT表機制進一步研究。
玻璃引流管摻混辛烷值超微粒子秤杆成形不良的電流滴定東方霍亂二十三碳烯酸風水的幹肛窦冠冕堂皇管箱蓋兼容性軟件工具焦磷酸氫钇技術性違約卡片盒空描述符利騷厄氏背外側束錄音再生棉燈芯偶蹄類全嵌段非離子表面活性劑任意保險人造革砂心模闆受委屈者完全相反的位覺部