linux-----------------庫制作與原理(下)

1.ELF文件

要理解編譯鏈鏈接的細節,我們不得不了解?下ELF?件。其實有以下四種?件其實都是ELF?件:
? 可重定位?件(Relocatable File ) :即 xxx.o ?件。包含適合于與其他?標?件鏈接來創
建可執??件或者共享?標?件的代碼和數據。
? 可執??件(Executable File ) :即可執?程序。
? 共享?標?件(Shared Object File ) :即 xxx.so?件。
? 內核轉儲(core dumps) ,存放當前進程的執?上下?,?于dump信號觸發。
?個ELF?件由以下四部分組成:
? ELF頭 (ELF header) :描述?件的主要特性。其位于?件的開始位置,它的主要?的是定位?
件的其他部分。
? 程序頭表(Program header table) :列舉了所有有效的段(segments)和他們的屬性。表?
記著每個段的開始的位置和位移(offset)、?度,畢竟這些段,都是緊密的放在?進制?件中,
需要段表的描述信息,才能把他們每個段分割開。
? 節頭表(Section header table) :包含對節(sections)的描述。
? 節(Section ):ELF?件中的基本組成單位,包含了特定類型的數據。ELF?件的各種信息和
數據都存儲在不同的節中,如代碼節存儲了可執?代碼,數據節存儲了全局變量和靜態數據等。
最常?的節:
? 代碼節(.text):?于保存機器指令,是程序的主要執?部分。
? 數據節(.data):保存已初始化的全局變量和局部靜態變量。

2.ELF從形成到加載輪廓

2-1 ELF形成可執?

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

2-2 ELF可執??件加載

當用戶執行一個ELF可執行文件時,操作系統通過加載器(Loader)動態鏈接器(Dynamic Linker)協作完成內存映射、權限設置、依賴解析等關鍵操作

?個ELF會有多種不同的Section,在加載到內存的時候,也會進?Section合并,形成segment
合并原則:相同屬性,?如:可讀,可寫,可執?,需要加載時申請空間等.
這樣,即便是不同的Section,在加載到內存中,可能會以segment的形式,加載到?起
很顯然,這個合并?作也已經在形成ELF的時候,合并?式已經確定了,具體合并原則被記錄在了
ELF的 程序頭表 (Program header table)

注意:為什么要講section合并成segment

Section合并的主要原因是為了減少??碎?,提?內存使?效率。如果不進?合并,
假設????為4096字節(內存塊基本??,加載,管理的基本單位),如果.text部分
為4097字節,.init部分為512字節,那么它們將占?3個??,?合并后,它們只需2個
??。
此外,操作系統在加載程序時,會將具有相同屬性的section合并成?個?的
segment,這樣就可以實現不同的訪問權限,從?優化內存管理和權限訪問控制

3.理解連接與加載

3-1 靜態鏈接

無論是自己的.o文件還是靜態庫中的.o文件本質都是把.o文件進行鏈接的過程所以靜態鏈接就是研究靜態鏈接的過程

3-2靜態鏈接的核心流程

  1. 輸入文件準備

    • 目標文件:由編譯器生成的.o文件,包含代碼、數據及未解析的符號引用。

    • 靜態庫:通過ar工具打包的.a文件,本質是多個.o文件的集合(如libmath.a包含sin.ocos.o等)。

  2. 符號解析(Symbol Resolution)

    • 符號表合并:鏈接器遍歷所有輸入文件,構建全局符號表。

    • 處理未定義符號:若同一符號被多文件定義(如兩個.o文件均定義global_var),觸發重復定義錯誤

  3. 重定位(Relocation)

    • 地址分配:為所有節(Section)分配運行時內存地址(如.text0x400000開始)。

    • 修正引用:根據最終地址,修改代碼中的相對偏移或絕對地址。

      復制

      下載

      // 目標文件中的未重定位指令(假設函數add的地址未確定)  
      call 0x00000000  // 占位符,鏈接時替換為add的實際地址  
  4. 生成可執行文件

    • 合并所有目標文件的.text.data等節到統一Segment。

    • 生成程序頭表(Program Header)供加載器使用。

3-3ELF加載與進程地址空間

3-2-1 虛擬地址/邏輯地址

思考一下一個進程在沒有加載到內存的時候它有沒有地址呢?

?個ELF程序,在沒有被加載到內存的時候,本來就有地址,當代計算機?作的時候,都采?"平坦
模式"進??作。所以也要求ELF對??的代碼和數據進?統?編址,下?是 objdump -S 反匯編
之后的代碼

3-4動態鏈接與動態庫加載

進程是如何鏈接到庫的呢
進程間是如何共享庫的呢
我們可以思考一下在庫加載到內存的時候我們在創建每一個進程的時候是否要給每個進程的重新加載一個庫大家可以思考一下
我們是如何跟庫具體映射起來的呢看一張圖就明白了
總結
靜態鏈接的出現,提?了程序的模塊化?平。對于?個?的項?,不同的?可以獨?地測試和開發
??的模塊。通過靜態鏈接,?成最終的可執??件。
我們知道靜態鏈接會將編譯產?的所有?標?件,和?到的各種庫合并成?個獨?的可執??件,
其中我們會去修正模塊間函數的跳轉地址,也被叫做編譯重定位(也叫做靜態重定位)。
?動態鏈接實際上將鏈接的整個過程推遲到了程序加載的時候。?如我們去運??個程序,操作系
統會?先將程序的數據代碼連同它?到的?系列動態庫先加載到內存,其中每個動態庫的加載地址
都是不固定的,但是?論加載到什么地?,都要映射到進程對應的地址空間,然后通過.GOT?式進 ?調?(運?重定位,也叫做動態地址重定位)。

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

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

相關文章

python-爬蟲基礎

爬蟲本質:通過編寫程序來獲取到互聯網上的資源。 我們的程序本質上就是模擬瀏覽器 一個簡單的小爬蟲: 只需要三步: from urllib.request import urlopen #url是網址,request意思是請求 這里跑出來的中文是這樣的注意看&#…

單元化架構

目錄 ????????編輯 單元化 邏輯單元 單元化 多地多機房部署,是互聯網系統的必然發展方向,一個系統要走到這一步,也就必然要解決上面提到的問題:流量調配、數據拆分、延時等。業界有很多技術方案可以用來解決這些問題&…

【免殺】C2免殺技術(五)動態API

一、什么是動態API 在C2免殺領域中,“動態API” 主要指的是繞過靜態檢測的一種技術手段,其本質是運行時動態解析和調用Windows API函數,而不是在程序編譯階段就明確引用這些API。這種方式可以有效躲避靜態分析工具和殺軟的簽名識別。 為什么…

Python爬蟲實戰:研究JavaScript壓縮方法實現逆向解密

一、引言 在數字化信息爆炸的時代,網絡數據已成為驅動各行業發展的核心資產。Python 憑借其豐富的庫生態和簡潔的語法,成為網絡爬蟲開發的首選語言。然而,隨著互聯網安全防護機制的不斷升級,網站普遍采用 JavaScript 壓縮與混淆技術保護其核心邏輯和數據傳輸,這使得傳統爬…

HTTP 請求走私(HTTP Request Smuggling)

HTTP 請求走私(HTTP Request Smuggling)是一種通過利用前端代理(如負載均衡器、CDN)和后端服務器在 解析 HTTP 請求時存在不一致性 的漏洞,從而實現 注入惡意請求 的攻擊技術。 一、基本原理 HTTP 請求走私主要依賴兩…

【Google機器學習實踐指南(線性回歸篇)

🔍 Google機器學習實踐指南(線性回歸篇) Google機器學習實戰(3)-單變量線性回歸核心解析,掌握房價預測模型 一、建模流程全景圖 ▲ 四大核心步驟: 數據可視化→特征工程→模型訓練→預測推理 二、房價預測實戰 1. …

python打卡day16

NumPy 數組基礎 因為前天說了shap,這里涉及到數據形狀尺寸問題,所以需要在這一節說清楚,后續的神經網絡我們將要和他天天打交道。 知識點: numpy數組的創建:簡單創建、隨機創建、遍歷、運算numpy數組的索引&#xff1a…

ubuntu 20.04 更改國內鏡像源-阿里源 確保可用

鏡像源是跟linux版本一一對應的,查詢自己系統的版本號: 命令:lsb_release -a macw:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.6 LTS Release: 20.04 Codename: focal macw:~$…

基于OpenCV的SIFT特征和FLANN匹配器的指紋認證

文章目錄 引言一、概述二、代碼解析1. 圖像顯示函數2. 核心認證函數2.1 創建SIFT特征提取器2.2 檢測關鍵點和計算描述符(源圖像)2.3 檢測關鍵點和計算描述符(模板圖像)2.4 創建FLANN匹配器2.5 使用K近鄰匹配 3. 匹配點篩選4. 認證…

四品種交易策略

策略概述 策略思路: 交易品種:同時交易四個品種,每個品種使用總資金的10%。 合約選擇:使用連續合約(data0)發出交易信號,實際交易 主力合約(data1)和下一個主力合約(data2)。 資金管理:總資金用A_CurrentEquity表示,交易手數據此計算。 止損執行:盤中達到止損…

MySQL事務的一些奇奇怪怪知識

Gorm事務有error卻不返回會發生什么 Gorm包是大家比較高頻使用。正常的用法是,如果有失敗返回error,整體rollback,如果不返回error則commit。下面是Transaction的源碼: // Transaction start a transaction as a block, return …

時序數據庫、實時數據庫與實時數倉:如何為實時數據場景選擇最佳解決方案?

隨著物聯網、金融交易、在線游戲等場景對實時數據處理需求的增長,市場上涌現出多種專門針對實時數據處理的數據庫解決方案。然而,面對時序數據庫、實時數據庫和實時數據倉庫這三種看似相似的技術,許多技術決策者常常感到困惑:它們…

Spring3+Vue3項目中的知識點——JWT

全稱:JOSN Web Token 定義了一種簡潔的、自包含的格式,用于通信雙方以json數據格式的安全傳輸信息 組成: 第一部分:Header(頭),記錄令牌類型、簽名算法等。 第二部分:Payload&am…

微服務架構詳解

微服務架構詳解:從概念到實踐(附代碼案例) 目錄 微服務架構詳解:從概念到實踐(附代碼案例) 一、微服務架構概述 1.1 什么是微服務? 1.2 微服務的核心思想 二、微服務架構的優勢與挑戰 2.1 優勢 2.2 挑戰 三、微服務架構的核心組件 3.1 服務注冊與發現 示例代…

linux下編寫shell腳本一鍵編譯源碼

0 前言 進行linux應用層編程時,經常會使用重復的命令對源碼進行編譯,然后把編譯生成的可執行文件拷貝到工作目錄,操作非常繁瑣且容易出錯。本文編寫一個簡單的shell腳本一鍵編譯源碼。 1 linux下編寫shell腳本一鍵編譯源碼 shell腳本如下&…

學習!FastAPI

目錄 FastAPI簡介快速開始安裝FastApiFastAPI CLI自動化文檔 Reqeust路徑參數Enum 類用于路徑參數路徑參數和數值校驗 查詢參數查詢參數和字符串校驗 請求體多個請求體參數嵌入單個請求體參數 CookieHeader表單文件直接使用請求 ResponseResponse Model多個關聯模型 響應狀態碼…

DAY 4 缺失值的處理

\1. 打開數據 import pandas as pd data pd.read_csv(rdata.csv) data\2. 查看數據 # 打印數據集的基本信息(列名、非空值數量、數據類型等) print("data.info() - 數據集的基本信息(列名、非空值數量、數據類型等)&#…

Java面試實戰:從Spring Boot到分布式緩存的深度探索

Java面試實戰:從Spring Boot到分布式緩存的深度探索 場景介紹 在一家著名的互聯網大廠,面試官老王正對求職者“水貨程序員”明哥進行Java技術面試。明哥帶著一點緊張和自信,迎接這場技術“拷問”。 第一輪:基礎問題 老王&#…

UART、SPI、IIC復習總結

一、UART 1、UART和USART的異同? 相同點 基本功能:都是用于串行通信的數據收發設備,能夠實現數據在不同設備之間的傳輸。在異步通信模式下,二者的工作方式相似,都使用起始位、數據位、校驗位(可選&#…

PostGIS實現矢量數據轉柵格數據【ST_AsRaster】

ST_AsRaster函數應用詳解:將矢量數據轉換為柵格數據 [文章目錄] 一、函數概述 二、函數參數與分組說明 三、核心特性與注意事項 四、示例代碼 五、應用場景 六、版本依賴 七、總結 一、函數概述 ST_AsRaster是PostGIS中用于將幾何對象(如點、線…