什麼是重定位?為什麼需要重定位?【轉】

来源:https://www.cnblogs.com/linhaostudy/archive/2018/05/31/9115480.html
-Advertisement-
Play Games

一、必須知道的幾個概念。 1、鏈接地址和運行地址。 ①運行地址,顧名思義就是程式運行的時候的地址,也就是你用工具將代碼下載到RAM的那個地址,也叫載入地址。 ②鏈接地址,由鏈接腳本指定的地址。為什麼需要鏈接腳本指定地址呢?你想一下,在c語言編程中,當我們需要調用一個A函數的時候,編譯器是怎麼找到這個 ...


一、必須知道的幾個概念。

1、鏈接地址和運行地址。

①運行地址,顧名思義就是程式運行的時候的地址,也就是你用工具將代碼下載到RAM的那個地址,也叫載入地址。

②鏈接地址,由鏈接腳本指定的地址。為什麼需要鏈接腳本指定地址呢?你想一下,在c語言編程中,當我們需要調用一個A函數的時候,編譯器是怎麼找到這個A函數?編譯器肯定是知道它被放在哪裡才可以找到它。那就是鏈接腳本的作用,鏈接腳本其實在程式被執行之前都已經指定A函數一個地址編號,以後所有的函數調用我們都會去這個地址編號那裡尋找A函數。有點類似於c語言的指針變數。

2、位置有關碼與位置無關碼。

①位置有關碼,就是這句代碼的執行正確與否還需要取決於當前的地址,也就是說跟地址已經綁定了的,例如:ldr PC, _main,就是PC指針必須跳轉到_main(函數名就是一個地址)這個地址去,代碼執行成功與否就相當於受到了這個地址的約束,假如這個地址的內容不存放_main這個函數,就會出錯了。

②位置無關碼,就是這句代碼在哪裡運行都可以的,跟所處的地址無關,跟位置有關碼相反。

二、重定位需要理解的一些問題。

1、鏈接地址跟運行地址不同的情況下會出現什麼情況?

答:以上面舉的函數A為例,當鏈接地址跟運行地址不同的時候,假如鏈接地址是0x1000,運行地址(載入地址)是0x0000,鏈接腳本指定函數A將來是要存放到(基地址+偏移量)=0x1000+0x0001=0x1001地址的,但是程式在下載的時候卻把這個程式下載到0x0000,所以函數A的地址實際上是存放在(基地址+偏移量)=0x0000+0x0001=0x0001這個地址的。當程式運行到一行位置有關碼例如:ldr PC, A ,編譯器首先就會按照鏈接腳本指定的A的那個地址0x1001尋找A函數,但是因為載入地址跟鏈接地址不同的原因,實際上A函數已經被放到了0x0001,所以執行就會出錯。所以,當這兩個地址不同的時候,執行一段位置有關碼的時候就會發生不可預估的錯誤。

2、為什麼會出現鏈接地址跟運行地址不同的情況?

答:當一塊晶元啟動的時候,依靠內部的SRAM,可以運行一小段代碼,而因為DDR還沒初始化,註定了開始的運行地址是在內部SRAM中的。當我們需要運行一個操作系統,那麼點的記憶體怎麼夠運行呢?所以這時候就需要初始化DDR才可,而因為我們知道這代碼將來都是在DDR上面運行的,所以鏈接腳本指定的鏈接地址肯定是DDR上面的地址,所以這就出現了鏈接地址跟運行地址不同的情況了。

3、什麼是重定位?

答:由於出現1這樣的問題,就需要使用重定位這種方式解決上面的問題了。那什麼是重定位呢?重定位就是在鏈接地址跟運行地址不同的情況下,執行一段位置無關碼,這段位置無關碼的作用就是將原來的那份代碼全部複製到鏈接地址那裡去,然後自己再長跳轉到新的那份代碼的剛剛執行的那個位置。這樣就實現了鏈接地址跟運行地址一致的情況了。

4、為什麼需要重定位?

答:就是鏈接地址跟運行地址不同,在這個情況下我們可以有兩種方案:
①全部使用位置無關碼。
②進行重定位讓這兩個地址相同。
我們知道,如果是一個小代碼,使用①時可以的,但是一個大的代碼文件很難保證全部都使用位置無關碼的,這也是不現實的,所以必須使用重定位解決這個問題。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、註冊控制項:regsvr32 C:\Windows\System32\mstscax.dll。 2、添加RDP Control控制項到工具箱中。我選擇的RDP Client Control (redistributable) - version 9 3、在VS項目中引用C:\Windows\Syst ...
  • 今天辦公室里來了一個程式員妹子飛鳥,小魚是給她分配的導師,初次見面~ 午飯時間 Linux目錄結構 resolv.conf文件 nameserver 唯一的必選關鍵字。表明DNS 伺服器的IP 地址,可以有很多行的nameserver ,每一個帶一個I P 地址。在查詢時就按nameserver 在 ...
  • 輸出特效格式控制: \033[0m 關閉所有屬性 \033[1m 設置高亮度 \03[4m 下劃線 \033[5m 閃爍 \033[7m 反顯 \033[8m 消隱 \033[30m -- \033[37m 設置前景色 \033[40m -- \033[47m 設置背景色 游標位置等的格式控制: \... ...
  • Consul 是一個支持多數據中心分散式高可用的服務發現和配置共用的服務軟體, 由 HashiCorp 公司用 Go 語言開發, 基於 Mozilla Public License 2.0 的協議進行開源。 下載 官網下載:https://www.consul.io/downloads.html 在 ...
  • 1.重定位 在完成空間與地址的分配步驟之後,鏈接器就進入了符號解析與重定位的步驟,這也就是靜態鏈接的核心作用; 在分析符號解析和重定位之前,首先讓我們來看看“a.o”裡面是怎麼使用這兩個外部符號,也就是說我們在“a.c”源程式裡面使用了“shared”變數和“swap”函數,那麼編譯器在將“a.c” ...
  • 寫在前面 Mac系統中有幾個比較特殊的功能鍵,和Win系統的區別也主要在這裡比如在Win系統中我們常用的Ctrl鍵,在Mac系統中對應的不是長得比較像的Cnotrol,而是Command鍵,貌似也是Mac系統中最常用的一個鍵。 在Mac系統中,每個按鍵都有與之對應的特殊符號,在系統中叫技術符號比如⌘ ...
  • 今天使用CentOS 7,發現未安裝vim,所以重新安裝 執行命令: yum -y install vim* 然後就可以使用了 ...
  • CentOS 7 中 安裝 postgresql 和 postgis ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...