目標文件的段結構及核心組件詳解

目標文件(如?.o?或?.obj)是編譯器生成的中間文件,其結構遵循?ELF(Linux)或?COFF(Windows)格式。以下是其核心段(Section)和關鍵機制的詳細解析:


1. 目標文件的典型段結構

段名存儲內容作用
.text可執行機器指令(函數代碼)存放編譯后的二進制指令(如成員函數、靜態函數)
.data已初始化的全局/靜態變量存儲顯式初始化的數據(如?int x = 5;
.bss未初始化的全局/靜態變量(清零)僅記錄變量大小,不占磁盤空間(運行時由系統初始化為0)
.rodata只讀數據(字符串常量、虛表、RTTI)存儲不可修改的數據(如?const char* str = "Hello";
.symtab符號表(函數、變量名及地址)記錄符號的元信息,供鏈接器解析跨文件引用
.rel.text代碼段的重定位信息標記?.text?中需要修正的指令(如?call?的目標地址)
.rel.data數據段的重定位信息標記?.data?中需要修正的指針(如跨文件的全局變量引用)
.debug調試信息(DWARF 格式)供調試器使用(如行號、變量類型),發布版可剝離
.eh_frame異常處理信息(棧展開)支持 C++ 異常機制(如?try/catch

2. 符號表(.symtab)詳解

(1) 符號表的組成

符號表記錄所有?函數、全局變量、靜態變量?的信息,每條記錄包含:

  • 符號名(如?_ZN7MyClass8funcEv,C++ 名稱修飾后的名稱)

  • 符號值(臨時地址,通常是段內偏移)

  • 符號類型(函數?FUNC、數據?OBJECT、未定義?UND

  • 綁定屬性(全局?GLOBAL、局部?LOCAL

  • 所屬段(如?.text.data

(2) 符號表示例

bash

readelf -s example.o

輸出:

Num:    Value  Size Type    Bind   Vis      Ndx Name1: 00000000    10 FUNC    GLOBAL DEFAULT    1 _ZN7MyClass8funcEv2: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND _Z3foov
  • Value=00000000:臨時地址(鏈接后修正)。

  • Ndx=1:符號屬于?.text?段(通過節頭表索引確定)。

  • UND:未定義符號(需鏈接時解析)。

(3) 符號表的作用

  • 鏈接階段:解析跨文件引用(如?main.o?調用?lib.o?的函數)。

  • 調試階段:映射機器碼到源碼符號(如?addr2line?工具)。


3. 重定位表(.rel.text / .rel.data)詳解

(1) 重定位的用途

  • 修正代碼段(.text)和數據段(.data)中的?臨時地址,使其指向正確的最終地址。

  • 解決跨文件引用問題(如調用其他?.o?文件的函數)。

(2) 重定位條目結構

每個條目包含:

  • 偏移量(Offset):需修正的指令/數據在段內的位置。

  • 類型(Type):如何修正(如絕對地址、相對偏移)。

  • 符號(Symbol):目標符號名。

(3) 重定位表示例

bash

readelf -r example.o

輸出:

Relocation section '.rel.text':
OFFSET   TYPE           SYMBOL
00000005 R_X86_64_PC32  _Z3foov
  • OFFSET=0x05call?指令的操作數位于?.text?段偏移?0x05?處。

  • TYPE=R_X86_64_PC32:需修正為?相對地址(目標地址 - 下條指令地址)。

  • SYMBOL=_Z3foov:修正目標是函數?foo()

(4) 重定位過程

  1. 鏈接器?合并所有?.text?段,分配最終地址(如?foo()?的地址為?0x401200)。

  2. 計算修正值:

    • 對于?R_X86_64_PC32

      修正值 = 目標地址(0x401200) - 下條指令地址(0x401005 + 5 = 0x40100A) = 0x1F6
  3. 修改指令:

    asm

    ; 修正前(目標文件)
    call 0x00000000  
    ; 修正后(可執行文件)
    call 0x1F6        ; 實際編碼為 E8 F6 01 00 00

4. 代碼段(.text)與數據段(.data/.bss)

(1) 代碼段(.text)

  • 內容:所有函數的機器碼(如?main()MyClass::func())。

  • 特點

    • 只讀可執行(防代碼注入)。

    • 函數調用通過?call?指令實現(地址由重定位修正)。

(2) 數據段(.data)

  • 內容:已初始化的全局/靜態變量(如?int x = 42;)。

  • 特點

    • 可讀寫,占用磁盤空間(存儲初始值)。

    • 加載到內存的?數據段

(3) BSS 段(.bss)

  • 內容:未初始化的全局/靜態變量(如?int y;)。

  • 特點

    • 不占用磁盤空間(僅記錄大小)。

    • 運行時由系統初始化為0,加載到內存的?BSS 段


5. 動態鏈接的特殊處理

(1) 全局偏移表(GOT)

  • 存儲動態庫中符號的絕對地址(如?printf)。

  • 首次訪問時由動態鏈接器填充。

(2) 過程鏈接表(PLT)

  • 實現?延遲綁定,首次調用函數時觸發動態鏈接器解析地址。

    asm

    復制

    下載

    call printf@plt  ; 首次調用跳轉到 PLT

6. 關鍵總結

組件作用示例工具命令
.text存儲可執行指令(函數代碼)objdump -d example.o
.data存儲已初始化的全局/靜態變量readelf -x .data example.o
.bss存儲未初始化的全局/靜態變量(運行時清零)size example.o
.symtab記錄符號名、類型、地址(供鏈接器使用)readelf -s example.o
.rel.text標記代碼段中需要修正的指令(如?callreadelf -r example.o
.rel.data標記數據段中需要修正的指針(如跨文件變量引用)objdump -r -j .data example.o

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/79318.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/79318.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/79318.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【軟件設計師:復習】上午題核心知識點總結(一)

一、數據結構與算法(高頻) 1. 線性數據結構 數組與鏈表 數組:隨機訪問(O(1))、插入/刪除(O(n))、內存連續。鏈表:單向鏈表、雙向鏈表、循環鏈表;插入/刪除(O(1))、隨機訪問(O(n))。典型問題: 合并兩個有序鏈表(LeetCode 21)。鏈表反轉(迭代/遞歸實現)。棧與…

【ROS2】 核心概念2——功能包package

官方英文文檔&#xff1a;Creating a package — ROS 2 Documentation: Humble documentation 中文參考&#xff1a;古月ROS2 功能包講解 - 圖書資源 省流&#xff0c;就學習一個命令 ros2 pkg create --build-type <build-type> <package_name> ROS2的重要概念…

Java內存對象實現聚合查詢

文章目錄 什么是聚合查詢excel表格演示插入透視表透視表操作 sql聚合查詢創建表和插入數據按照國家業務類型設備類型統計總銷量按設備類型統計總銷量 Java內存對象聚合查詢普通對象方式創建對象聚合查詢條件查詢方法調用方式結果 Record對象方式Recor對象創建對象聚合查詢條件查…

VSCode開發調試Python入門實踐(Windows10)

我的Windows10上的python環境是免安裝直接解壓的Python3.8.x老版本&#xff0c;可參見《Windows下Python3.8環境快速安裝部署。 1. 安裝VSCode 在Windows 10系統上安裝Visual Studio Code&#xff08;VS Code&#xff09;是一個簡單的過程&#xff0c;以下是詳細的安裝方法與…

Tomcat DOS漏洞復現(CVE-2025-31650)

免責申明: 本文所描述的漏洞及其復現步驟僅供網絡安全研究與教育目的使用。任何人不得將本文提供的信息用于非法目的或未經授權的系統測試。作者不對任何由于使用本文信息而導致的直接或間接損害承擔責任。如涉及侵權,請及時與我們聯系,我們將盡快處理并刪除相關內容。 前…

使用Qt QAxObject解決Visual Fox Pro數據庫亂碼問題

文章目錄 使用Qt QAxObject解決Visual Fox Pro數據庫亂碼問題一、問題背景&#xff1a;ODBC讀取DBF文件的編碼困境二、核心方案&#xff1a;通過QAxObject調用ADO操作DBF1. 技術選型&#xff1a;為什么選擇ADO&#xff1f;2. 核心代碼解析&#xff1a;QueryDataByAdodb函數3. 連…

HTTP知識速通

一.HTTP的基礎概念 首先了解HTTP協議&#xff0c;他是目前主要使用在應用層的一種協議 http被稱為超文本傳輸協議 而https則是安全的超文本傳輸協議 本章節的內容首先就是對http做一個簡單的了解。 HTTP是一種應用層協議&#xff0c;是基于TCP/IP協議來傳遞信息的。 其中…

制作一款打飛機游戲26:精靈編輯器

雖然我們基本上已經重建了Axel編輯器&#xff0c;但我不想直接使用它。我想創建一個真正適合我們當前目的的編輯器&#xff0c;那就是編輯精靈&#xff08;sprites&#xff09;。這將是今天的一個大目標——創建一個基于模板的編輯器&#xff0c;用它作為我們實際編輯器的起點。…

mac下載homebrew 安裝和使用git

mac下載homebrew 安裝和使用git 本人最近從windows換成mac&#xff0c;記錄一下用homebrew安裝git的過程 打開終端 command 空格&#xff0c;搜索終端 安裝homebrew 在終端中輸入下面命令&#xff0c;來安裝homebrew /bin/bash -c "$(curl -fsSL https://raw.githu…

【LeetCode Hot100】圖論篇

前言 本文用于整理LeetCode Hot100中題目解答&#xff0c;因題目比較簡單且更多是為了面試快速寫出正確思路&#xff0c;只做簡單題意解讀和一句話題解方便記憶。但代碼會全部給出&#xff0c;方便大家整理代碼思路。 200. 島嶼數量 一句話題意 求所有上下左右的‘1’的連通塊…

《社交類應用開發:React Native與Flutter的抉擇》

社交類應用以令人目不暇接的速度更新迭代。新功能不斷涌現&#xff0c;從更智能的算法推薦到多樣化的互動形式&#xff0c;從增強的隱私保護到跨平臺的無縫體驗&#xff0c;每一次更新都旨在滿足用戶日益增長且多變的需求。面對如此高頻的更新需求&#xff0c;選擇合適的跨端框…

關于3D的一些基礎知識

什么是2D/3D? 2D&#xff08;二維&#xff09;和3D&#xff08;三維&#xff09;是描述空間維度的概念&#xff0c;它們的核心區別在于空間維度、視覺表現和應用場景。以下是詳細對比&#xff1a; 1. 定義與維度 ? 2D&#xff08;二維&#xff09; ? 定義&#xff1a;僅包…

大連理工大學選修課——機器學習筆記(7):集成學習及隨機森林

集成學習及隨機森林 集成學習概述 泛化能力的局限 每種學習模型的能力都有其上限 限制于特定結構受限于訓練樣本的質量和規模 如何再提高泛化能力&#xff1f; 研究新結構擴大訓練規模 提升模型的泛化能力 創造性思路 組合多個學習模型 集成學習 集成學習不是特定的…

嵌入式產品運行中數據丟失怎么辦?

目錄 1、數據丟失現象與根源分析 2、硬件層優化 3、系統/驅動層優化 4、應用軟件層優化 5、文件系統選型深度解析 5.1、NAND Flash 適用文件系統 5.2、eMMC 適用文件系統 6、系統掛載選項優化實踐 嵌入式系統在運行過程中&#xff0c;尤其是在涉及頻繁數據寫入&#xf…

第十一節:性能優化高頻題-響應式數據深度監聽問題

解決方案&#xff1a;watch的deep: true選項或watchEffect自動追蹤依賴 Vue響應式數據深度監聽與性能優化指南 一、深度監聽的核心方案 watch的deep: true模式 ? Vue2實現&#xff1a;需顯式聲明深度監聽配置 watch: {obj: {handler(newVal) { /* 處理邏輯 */ },deep: tru…

【Linux實踐系列】:進程間通信:萬字詳解命名管道實現通信

&#x1f525; 本文專欄&#xff1a;Linux Linux實踐項目 &#x1f338;作者主頁&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客勵志語錄&#xff1a; 與其等待完美的風&#xff0c;不如學會在逆風中調整帆的角度——所有偉大航程都始于此刻出發的勇氣 ★★★ 本文前置知…

權力結構下的人才價值重構:從 “工具論” 到 “存在論” 的轉變?

引言? 在現在的公司管理里&#xff0c;常常能聽到這樣一種說法&#xff1a;“我用你&#xff0c;你才是人才&#xff1b;不用你&#xff0c;你啥都不是。” 這其實反映了一種很常見的評判人才價值的標準&#xff0c;就是只看公司的需求&#xff0c;把人才當作實現公司目標的工…

UE實用地編插件Physical Layout Tool

免費插件 https://www.fab.com/zh-cn/listings/a7fb6fcf-596f-48e9-83cc-f584aea316b1 可以通過物理模擬批量放置物體 不用再一個個擺放了 裝飾環境從未如此簡單&#xff0c;您不必再考慮對齊物體。 物理地放置物體&#xff0c;移動它們&#xff0c;在移動或在地圖上放置物體…

Nerfstudio 環境配置與自有數據集(圖片和視頻)測試全方位全流程實戰【2025最新版!!】

一、引言 神經輻射場(Neural Radiance Fields&#xff0c;簡稱NeRF)是近年來計算機視覺和圖形學領域的一項革命性技術&#xff0c;它能夠從2D圖像中學習復雜的3D場景表示。然而&#xff0c;NeRF技術的實現和應用門檻較高&#xff0c;需要較為專業的計算機視覺和深度學習知識。…

Transformer:顛覆深度學習的架構革命與技術演進

2017年&#xff0c;谷歌團隊在論文《Attention Is All You Need》中提出的Transformer架構&#xff0c;徹底改變了人工智能對序列數據的處理范式。它不僅解決了傳統循環神經網絡&#xff08;RNN&#xff09;的長期依賴和并行化難題&#xff0c;更催生了BERT、GPT等劃時代模型&a…