Linux_ELF文件

目錄

前言:?

一、ELF文件的類型

二、ELF文件的組成格式?

1. ELF頭部(ELF Header)

2. 節頭表(Section Header Table)

3. 程序頭表(Program Header Table)

4. 節(Sections)與段(Segments)

?三、ELF文件從形成到加載輪廓

1、ELF可執行文件形成過程

2、 可執行文件從磁盤加載到內存section的變化

1、Section與Segment的基本關系

2、合并機制與內存優化

四、理解動靜態庫鏈接和加載?

?編輯

1. 動態鏈接核心原理

2. 程序啟動與動態鏈接流程

動態鏈接器:

1. 位置無關代碼(PIC)基礎原理


前言:?

ELF(Executable and Linkable Format):

是Unix/Linux系統下的標準可執行文件、目標文件和共享庫格式。

是一種文件格式的名稱

一、ELF文件的類型

ELF文件根據用途可分為以下幾種主要類型:

  1. ?可重定位文件(Relocatable File)?

    • 文件擴展名通常為.o
    • 由編譯器生成,包含代碼和數據但未指定絕對地址
    • 用于與其他目標文件鏈接生成可執行文件或共享庫
    • 在Linux系統中通過gcc -c命令生成
  2. ?可執行文件(Executable File)?

    • 通常沒有特定擴展名(如Linux中的a.out)
    • 包含可直接執行的程序代碼和數據
    • 由鏈接器處理可重定位文件后生成
    • 包含程序入口點,可直接被操作系統加載執行
  3. ?共享目標文件(Shared Object File)?

    • 文件擴展名通常為.so
    • 包含可共享的代碼和數據,用于動態鏈接
    • 可在兩種情況下使用:
      • 鏈接時與其他文件鏈接生成新目標文件
      • 運行時與可執行文件結合作為進程映像的一部分
  4. ?核心轉儲文件(Core Dump File)?

    • 由操作系統在程序崩潰時生成
    • 包含程序崩潰時的內存狀態和寄存器信息
    • 用于調試和故障排除
類型擴展名主要用途生成方式使用場景
可重定位文件.o鏈接編譯器生成鏈接階段
可執行文件無/.out執行鏈接器生成運行階段
共享目標文件.so動態鏈接鏈接器生成鏈接和運行階段
核心轉儲文件core調試系統生成調試階段

二、ELF文件的組成格式?

?基本信息如圖:

1. ELF頭部(ELF Header)

  • 位于文件起始位置,固定大小(32位系統52字節,64位系統64字節)
  • 包含文件的基本信息:
    • 魔數(Magic Number):0x7f 0x45 0x4c 0x46(ASCII為"ELF")
    • 文件類型(可執行/可重定位/共享庫等)
    • 目標體系結構(如x86、ARM)
    • 程序入口地址(可執行文件)
    • 節頭表和程序頭表的位置和大小信息

2. 節頭表(Section Header Table)

  • 包含多個節頭表條目,每個條目描述一個節(section)的信息
  • 主要作用:
    • 記錄各節的名稱、類型、文件偏移、大小、讀寫權限等
    • 主要用于鏈接過程(鏈接視圖)
    • 對于可重定位文件是必須的,對于可執行文件是可選的

3. 程序頭表(Program Header Table)

  • 包含多個程序頭表條目,每個條目描述一個段(segment)的信息
  • 主要作用:
    • 描述如何將文件中的段加載到內存
    • 主要用于執行過程(執行視圖)
    • 對于可執行文件和共享庫是必須的,對于可重定位文件可能為空

4. 節(Sections)與段(Segments)

  • ?節(Section)?:

    • 鏈接視圖的基本單位
    • 常見節包括:
      • .text:可執行代碼
      • .data:已初始化的全局/靜態變量
      • .bss:未初始化的全局/靜態變量
      • .rodata:只讀數據
      • .symtab:符號表
      • .strtab:字符串表
      • .rel.text/.rel.data:重定位信息
  • ?段(Segment)?:

    • 執行視圖的基本單位
    • 由多個具有相同權限的連續節組成
    • 常見段類型:
      • LOAD:需加載到內存的段(代碼段、數據段)
      • DYNAMIC:動態鏈接信息
      • INTERP:指定動態鏈接器路徑10

?三、ELF文件從形成到加載輪廓

1、ELF可執行文件形成過程

- step-1:將多份 C/C++ 源代碼,翻譯成為?標 .o ?件
- step-2:將多份 .o ?件section進?合并

2、 可執行文件從磁盤加載到內存section的變化

1、Section與Segment的基本關系

ELF文件具有雙重視圖特性:

  • ?鏈接視圖?:以Section為基本單位,包含.text(代碼)、.data(已初始化數據)、.bss(未初始化數據)等,主要用于鏈接階段
  • ?執行視圖?:以Segment為基本單位,由多個屬性相同的Section合并而成,用于運行時加載

關鍵區別:

特性SectionSegment
用途鏈接階段執行階段
組織結構獨立功能單元合并后的內存塊
表結構Section Header TableProgram Header Table
必要性可執行文件可選可執行文件必須

2、合并機制與內存優化

合并過程的核心目的是?減少內存碎片?,提高頁面使用效率:

  1. ?為什么要合并

    • 現代系統采用分頁加載機制,典型頁大小為4KB(4096字節)
    • 示例:未合并時.text(4097B)和.data(1B)占用3頁(2+1),合并后僅需2頁(4098B)
  2. ?合并規則?:

    • 相同內存屬性(可讀/可寫/可執行)的Section會被合并8
    • 必須具有相同的加載需求(需要運行時申請空間)8
    • 典型合并模式:
      • 代碼段:合并.text.rodata等只讀可執行Section
      • 數據段:合并.data.bss等可讀寫Section
  3. ?程序頭表(Program Header Table)作用?:

    • 每個表項(Elf32_Phdr/Elf64_Phdr)描述一個Segment的:
      • 類型(p_type):如PT_LOAD(需加載段)
      • 標志位(p_flags):讀寫執行權限
      • 文件偏移(p_offset)和大小(p_filesz)
      • 內存地址(p_vaddr)和大小(p_memsz)
      • 對齊要求(p_align)8
    • 加載器根據這些信息建立進程內存映像

四、理解動靜態庫鏈接和加載?

1、靜態庫

下面是樣例代碼?

我們可以通過objdump -d 命令:將代碼段(.text)進?反匯編查看,其中callq的加載到內存的機械碼,而后面跟著的一串0代表訪問的函數地址,在鏈接中才會填充地址,也叫做地址重定位?

靜態鏈接就是把庫中的.o進?合并,和上述過程?樣
所以鏈接其實就是將編譯之后的所有?標?件連同?到的?些靜態庫運?時庫組合,拼裝成?個獨?的可執??件。其中就包括我們之前提到的地址修正,當所有模塊組合在?起之后,鏈接器會根據我們的.o?件或者靜態庫中的重定位表找到那些需要被重定位的函數全局變量,從?修正它們的地址。這其實就是靜態鏈接的過程

研究靜態鏈接其實就是研究不同的.o文件是如何鏈接到一起的,.o類型文件也叫做可重定位目標文件

1. 動態鏈接核心原理

動態鏈接的本質是將鏈接過程推遲到程序加載時完成,這一機制實現了代碼共享和內存優化。當執行一個程序時,操作系統會執行以下關鍵步驟:

  1. ?程序加載?:將程序的可執行代碼和依賴的動態庫加載到內存
  2. ?地址分配?:為每個動態庫動態分配內存地址(ASLR技術確保地址隨機化)
  3. ?地址空間映射?:將動態庫映射到進程的地址空間
  4. ?符號解析?:解析程序對動態庫中符號的引用

動態鏈接的兩個關鍵階段:

  • ?地址空間映射?:通過mmap系統調用將動態庫映射到進程地址空間
  • ?符號綁定?:通過PLT/GOT機制實現函數調用跳轉

2. 程序啟動與動態鏈接流程

C/C++程序的執行并非直接從main函數開始,而是經歷以下初始化過程

階段執行內容負責組件
_start設置堆棧、初始化數據段crt0.o
動態鏈接加載共享庫、符號解析ld-linux.so
__libc_start_main線程初始化、信號處理glibc
main用戶代碼執行用戶程序

詳細流程:

  1. ?入口點_start?:由C運行時庫提供,建立基本執行環境
  2. ?動態鏈接器調用?:通過.interp段定位ld-linux.so
  3. ?庫加載與重定位?:
    • 解析DT_NEEDED條目加載依賴庫
    • 處理.rel.plt和.rel.dyn重定位表
  4. ?控制權轉移?:通過__libc_start_main最終調用main函數

動態鏈接器:


? 動態鏈接器(如ld-linux.so)負責在程序運?時加載動態庫。
? 當程序啟動時,動態鏈接器會解析程序中的動態庫依賴,并加載這些庫到內存中。
環境變量和配置?件:
? Linux系統通過環境變量(如LD_LIBRARY_PATH)和配置?件(如/etc/ld.so.conf及其?配置?件)來指定動態庫的搜索路徑。
? 這些路徑會被動態鏈接器在加載動態庫時搜索。
緩存?件:
? 為了提?動態庫的加載效率,Linux系統會維護?個名為/etc/ld.so.cache的緩存?件。
? 該?件包含了系統中所有已知動態庫的路徑和相關信息,動態鏈接器在加載動態庫時會?先
搜索這個緩存?件

1. 位置無關代碼(PIC)基礎原理

位置無關代碼(Position Independent Code)是動態庫能夠實現多進程共享的核心技術,其核心特性包括:

  • ?地址無關性?:代碼可以在內存任意位置加載執行,無需修改指令
  • ?相對尋址?:所有地址引用都基于當前指令指針或全局偏移表(GOT)
  • ?重定位延遲?:符號解析推遲到加載或運行時完成

PIC的實現主要通過兩種機制:

  1. ?PC相對尋址?:用于函數內部跳轉和局部數據訪問
  2. ?全局偏移表(GOT)?:存儲外部變量和函數的絕對地址,通過間接訪問實現重定位

?

基本過程

  1. 通過mm_struct中的變量找到有關共享區的結構體,根據里面的成員指針變量找到路徑
  2. 根據路徑找到磁盤中的數據塊加載到內存
  3. 發生映射關系關聯起來
  4. 得到庫的起始虛擬地址
  5. 數據區會有一個名為.GOT的表記錄庫函數的偏移量,映射過后,表會根據庫的起始虛擬地址進行修改得到完整的訪問共享區的地址

?--------------------------------------------------------------------------------------------------------------------------

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

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

相關文章

Go語言語法---輸入控制

文章目錄 1. fmt包讀取輸入1.1. 讀取單個值1.2. 讀取多個值 2. 格式化輸入控制 在Go語言中,控制輸入主要涉及從標準輸入(鍵盤)或文件等來源讀取數據。以下是幾種常見的輸入控制方法: 1. fmt包讀取輸入 fmt包中的Scan和Scanln函數都可以讀取輸入&#xf…

【PostgreSQL數據分析實戰:從數據清洗到可視化全流程】附錄-C. 常用SQL腳本模板

?? 點擊關注不迷路 ?? 點擊關注不迷路 ?? 點擊關注不迷路 文章大綱 附錄C. 常用SQL腳本模板速查表一、數據清洗與預處理模板二、數據聚合與分析模板三、窗口函數應用模板四、性能優化與監控模板五、數據備份與恢復模板六、權限管理與安全模板七、事務與錯誤處理模板八、時…

51單片機課設基于GM65模塊的二維碼加條形碼識別

系統組成 主控單元:51單片機(如STC89C52)作為核心控制器,協調各模塊工作。 掃描模塊:GM65條碼掃描頭,支持二維碼/條形碼識別,通過串口(UART)與單片機通信。 顯示模塊&a…

【OpenGL學習】(二)OpenGL渲染簡單圖形

文章目錄 【OpenGL學習】(二)OpenGL渲染簡單圖形OpenGL渲染圖形流程頂點,圖元和片元VAO,VBO ,EBO著色器示例:使用OpenGL渲染三角形 【OpenGL學習】(二)OpenGL渲染簡單圖形 OpenGL渲…

基于STM32的INA226電壓電流檢測儀

系統總體框圖 功率檢測裝置原理圖功能及模塊連接說明 一、系統功能概述 該裝置以STM32F103C8T6微控制器為核心,集成功率檢測、數據交互、狀態顯示和用戶提示功能,通過模塊化設計實現穩定運行。 二、各模塊功能及連接方式 按鍵模塊 功能&#xff1a…

YOLOv2目標檢測算法:速度與精度的平衡之道

一、YOLOv2的核心改進:從V1到V2的蛻變 YOLOv2作為YOLO系列的第二代算法,在繼承V1端到端、單階段檢測的基礎上,針對V1存在的小目標檢測弱、定位精度低等問題進行了全方位升級,成為目標檢測領域的重要里程碑。 (一&am…

將嵌入映射到 Elasticsearch 字段類型:semantic_text、dense_vector、sparse_vector

作者: Andre Luiz 討論如何以及何時使用 semantic_text、dense_vector 或 sparse_vector,以及它們與嵌入生成的關系。 通過這個自定進度的 Search AI 實踐學習親自體驗向量搜索。你可以開始免費云試用,或者在本地機器上嘗試 Elastic。 多年來…

uniapp取消瀏覽自動填充

為了防止瀏覽器自動將記住的密碼回填進type"password"輸入框&#xff0c;所以在type"password"輸入框上面加了兩行代碼&#xff0c;使瀏覽器將密碼填充到新加的輸入框里&#xff0c;并將這兩個input隱藏掉 <input type"password" autocomple…

從數據包到可靠性:UDP/TCP協議的工作原理分析

之前我們已經使用udp/tcp的相關接口寫了一些簡單的客戶端與服務端代碼。也了解了協議是什么&#xff0c;包括自定義協議和知名協議比如http/https和ssh等。現在我們再回到傳輸層&#xff0c;對udp和tcp這兩傳輸層巨頭協議做更深一步的分析。 一.UDP UDP相關內容很簡單&#xf…

顯卡、Cuda和pytorch兼容問題

這里寫目錄標題 驅動與CUDA版本兼容性問題1. **驅動與CUDA版本兼容性問題**2. **任務特性與硬件適配差異**3. **優化策略與框架配置差異**4. **散熱與功耗限制**5. **數據傳輸與CPU瓶頸**排查建議總結 查詢PyTorch中實際使用的CUDA版本**1. 查詢PyTorch中實際使用的CUDA版本***…

DeepSeek 大模型部署全指南:常見問題、優化策略與實戰解決方案

DeepSeek 作為當前最熱門的開源大模型之一&#xff0c;其強大的語義理解和生成能力吸引了大量開發者和企業關注。然而在實際部署過程中&#xff0c;無論是本地運行還是云端服務&#xff0c;用戶往往會遇到各種技術挑戰。本文將全面剖析 DeepSeek 部署中的常見問題&#xff0c;提…

Hadoop的目錄結構和組成

Hadoop 目錄結構 bin 目錄&#xff1a;包含了 Hadoop 的各種命令行工具&#xff0c;如hadoop、hdfs等&#xff0c;用于啟動和管理 Hadoop 集群&#xff0c;以及執行各種數據處理任務。etc 目錄&#xff1a;存放 Hadoop 的配置文件&#xff0c;包括core-site.xml、hdfs-site.xm…

Python Matplotlib 庫【繪圖基礎庫】全面解析

讓AI成為我們的得力助手&#xff1a;《用Cursor玩轉AI輔助編程——不寫代碼也能做軟件開發》 一、發展歷程 Matplotlib 由 John D. Hunter 于 2003 年創建&#xff0c;靈感來源于 MATLAB 的繪圖系統。作為 Python 生態中最早的可視化工具之一&#xff0c;它逐漸成為科學計算領…

車載以太網驅動智能化:域控架構設計與開發實踐

title: 車載以太網驅動專用車智能化&#xff1a;域控架構設計與開發實踐 date: 2023-12-01 categories: 新能源汽車 tags: [車載以太網, 電子電氣架構, 域控架構, 專用車智能化, SOME/IP, AUTOSAR] 引言&#xff1a;專用車智能化轉型的挑戰與機遇 專用車作為城市建設與工業運輸…

圖論模板(部分)

圖論模板&#xff08;部分&#xff09; maincpp #include <iostream> #include <climits> #include <limits>typedef unsigned long long ull; typedef long long ll; typedef long double ld; typedef std::pair<int, int> PII;#define rep(i, n) f…

2025年【道路運輸企業安全生產管理人員】考試題庫及道路運輸企業安全生產管理人員考試內容

一、考試概述 2025年道路運輸企業安全生產管理人員考試題庫由【安全生產模擬考試一點通】平臺發布&#xff0c;涵蓋安全生產法律法規、車輛技術管理、從業人員管理、應急預案編制等核心領域。考試重點考察考生對安全生產主體責任、風險管控、隱患排查等實務操作的掌握程度&…

分貝計在噪音污染源識別中的用途

分貝計在噪音污染源識別中的作用 噪音污染是現代社會面臨的一個普遍問題&#xff0c;尤其在城市化進程加快的背景下&#xff0c;交通、工業、建筑和娛樂活動等產生的噪音對人們的生活質量和健康造成了嚴重影響。為了有效管理和控制噪音污染&#xff0c;首先需要準確識別噪音的…

deepin v23.1 搜狗輸入法next配置中文輸入法下默認用英文標點

deepin23.1下, fcitx5的 deepin next搜狗輸入法的屬性頁無法配置中文狀態下默認用英文標點, 但是可以改以下配置來實現這一點. 搜狗輸入法運行期間&#xff0c;用戶修改的配置被存儲在以下位置&#xff1a; ~/.config/cpis/module/im/fcitx5/com.sogou.ime.ng.fcitx5.deepin/k…

C語言:在 Win 10 上,g++ 如何編譯 gtk 應用程序

在 Windows 10 上使用 g&#xff08;或 gcc&#xff09;編譯基于 GTK 的 C 語言程序是完全可行的&#xff0c;且相比 Tcc 更為推薦&#xff0c;因為 g&#xff08;GNU 編譯器套件&#xff09;對 GTK 的支持更加完善&#xff0c;配置也更簡單。以下是詳細步驟和注意事項&#xf…

84.評論日記

原鏈接 這個視頻我發了四五條評論。評論內容甚至和下面這個視頻內的其他評論一樣。 找了另外的賬號也發了。 發現&#xff0c;無論是我這個賬號&#xff0c;還是其他的賬號&#xff0c;評論都無法看到。 我大膽猜測有一種機制&#xff0c;某些官號會被設置成一種高檢測的等…