91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C/C++程序鏈接與反匯編工具objdump如何使用

發布時間:2023-02-07 09:47:48 來源:億速云 閱讀:148 作者:iii 欄目:開發技術

這篇文章主要介紹“C/C++程序鏈接與反匯編工具objdump如何使用”,在日常操作中,相信很多人在C/C++程序鏈接與反匯編工具objdump如何使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C/C++程序鏈接與反匯編工具objdump如何使用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

程序構建過程的第二個階段就是鏈接,鏈接過程輸入的是目標文件的集合。每個目標文件可以被看作單個源代碼文件的二進制存儲版本,需要為程序內存映射提供各種各樣的節(代碼.text 初始化數據.data 未初始化數據.bss 和只讀數據.rdata),鏈接器的最終任務是將獨立的節組合成最終的程序內存映射節,與此同時解析所有的引用。

鏈接階段

鏈接過程包括一系列階段(重定位、解析引用),接下來我們介紹這些階段。

1.重定位

鏈接過程的第一個階段僅僅進行拼接,其過程是將分散在單獨目標文件中不同類型的節拼接到程序內存映射節中。

如圖,為了完成任務,需要將之前預留的空間,也就是節中從0開始的地址范圍轉換成最終程序內存映射中更具體的地址范圍。

C/C++程序鏈接與反匯編工具objdump如何使用

2.解析引用

現在我們來看鏈接過程中最難的部分,將節的地址范圍線性地轉換成程序內存映射地址范圍。相比來說,更艱巨的任務在于為不同的部分的代碼建立關聯,使得程序成為一個整體。

function.h代碼:

#pragma once
#define FIRST_OPTION
#ifdef FIRST_OPTION
#define MULTIPLIER (3.0)
#else
#define MULTIPLIER (2.0)#endif
float add_and_multiply(float x,float y);

function.c

//#include "function.h"
int nCompletionStatus = 0;
float add(float x,float y)
{
   float z = x + y;
   return z;
}
float add_and_multiply(float x,float y)
{
   float z = add(x,y);
   z *= 3;
   return z;
}

main.c

#include "function.h"
extern int nCompletionStatus;
int main(int argc,char* argv[])
{
    float x = 1.0;
    float y = 5.0;
    float z;
    z= add_and_multiply(x,y);
    nCompletionStatus =1;
    return 0;
}

在上例代碼中

  • add_and_multiply 函數調用add函數,這兩個函數在同一個源代碼文件中,這種情況下,函數add的內存映射地址是一個已知量,會被擴展成其對與function.o中代碼節起始地址的相對偏移。

  • main函數會調用add_and_multiply函數,并同時引用外部變量nCompletionStatus,這個時候問題就出現了--我們不知道它們的實際程序內存地址,實際上編譯器會假定這些符號未來會在進程內存映射中存在,但是,直到生成完整內存映射之前,這兩個引用會一直被當成未解析引用。

該問題如圖描述:

function.o

C/C++程序鏈接與反匯編工具objdump如何使用

main.o

C/C++程序鏈接與反匯編工具objdump如何使用

為了解決這類問題,我們需要在鏈接階段就對這些引用進行解析,此時鏈接器需要:

  • 檢查拼接到程序內存映射中的節

  • 找出那些部分代碼產生了外部調用

  • 計算該引用的精確地址(在內存映射中的地址)

  • 最后,將機器指令中的偽地址替換成程序內存映射的實際地址,這樣就完成了引用的解析。

3.鏈接示例

程序內存映射圖

C/C++程序鏈接與反匯編工具objdump如何使用

gcc -c function.c main.c
gcc function.o main.o -o demoApp

反匯編main.o文件

objdump -D -M intel main.o

劃紅線的是跳轉自身,是因為鏈接器不知道函數的地址。先用偽地址代替。

C/C++程序鏈接與反匯編工具objdump如何使用

反匯編demoApp

objdump -D -M intel demoApp

畫紅線的位置分別是add_and_multiply 地址為11aa 和nCompletionStatus的地址。

C/C++程序鏈接與反匯編工具objdump如何使用

C/C++程序鏈接與反匯編工具objdump如何使用

執行下面命令查看,看到nCompletionStatus地址為4014.

objdump -x -j .bss demoapp

C/C++程序鏈接與反匯編工具objdump如何使用

到此,關于“C/C++程序鏈接與反匯編工具objdump如何使用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

马边| 修武县| 吴江市| 定结县| 裕民县| 贺兰县| 兴文县| 卢氏县| 鄂托克前旗| 伊川县| 平山县| 成都市| 仙游县| 进贤县| 张北县| 宜君县| 黄石市| 旬邑县| 抚顺县| 临清市| 苍溪县| 福泉市| 周至县| 峨边| 邢台县| 白山市| 临邑县| 临颍县| 修水县| 诸暨市| 承德县| 普陀区| 伽师县| 永顺县| 巨野县| 侯马市| 资阳市| 安阳县| 靖州| 五莲县| 金塔县|