您好,登錄后才能下訂單哦!
這篇文章主要介紹“C/C++程序鏈接與反匯編工具objdump如何使用”,在日常操作中,相信很多人在C/C++程序鏈接與反匯編工具objdump如何使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C/C++程序鏈接與反匯編工具objdump如何使用”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
程序構(gòu)建過程的第二個階段就是鏈接,鏈接過程輸入的是目標(biāo)文件的集合。每個目標(biāo)文件可以被看作單個源代碼文件的二進(jìn)制存儲版本,需要為程序內(nèi)存映射提供各種各樣的節(jié)(代碼.text 初始化數(shù)據(jù).data 未初始化數(shù)據(jù).bss 和只讀數(shù)據(jù).rdata),鏈接器的最終任務(wù)是將獨(dú)立的節(jié)組合成最終的程序內(nèi)存映射節(jié),與此同時解析所有的引用。
鏈接過程包括一系列階段(重定位、解析引用),接下來我們介紹這些階段。
鏈接過程的第一個階段僅僅進(jìn)行拼接,其過程是將分散在單獨(dú)目標(biāo)文件中不同類型的節(jié)拼接到程序內(nèi)存映射節(jié)中。
如圖,為了完成任務(wù),需要將之前預(yù)留的空間,也就是節(jié)中從0開始的地址范圍轉(zhuǎn)換成最終程序內(nèi)存映射中更具體的地址范圍。
現(xiàn)在我們來看鏈接過程中最難的部分,將節(jié)的地址范圍線性地轉(zhuǎn)換成程序內(nèi)存映射地址范圍。相比來說,更艱巨的任務(wù)在于為不同的部分的代碼建立關(guān)聯(lián),使得程序成為一個整體。
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 函數(shù)調(diào)用add函數(shù),這兩個函數(shù)在同一個源代碼文件中,這種情況下,函數(shù)add的內(nèi)存映射地址是一個已知量,會被擴(kuò)展成其對與function.o中代碼節(jié)起始地址的相對偏移。
main函數(shù)會調(diào)用add_and_multiply函數(shù),并同時引用外部變量nCompletionStatus,這個時候問題就出現(xiàn)了--我們不知道它們的實(shí)際程序內(nèi)存地址,實(shí)際上編譯器會假定這些符號未來會在進(jìn)程內(nèi)存映射中存在,但是,直到生成完整內(nèi)存映射之前,這兩個引用會一直被當(dāng)成未解析引用。
該問題如圖描述:
function.o
main.o
為了解決這類問題,我們需要在鏈接階段就對這些引用進(jìn)行解析,此時鏈接器需要:
檢查拼接到程序內(nèi)存映射中的節(jié)
找出那些部分代碼產(chǎn)生了外部調(diào)用
計(jì)算該引用的精確地址(在內(nèi)存映射中的地址)
最后,將機(jī)器指令中的偽地址替換成程序內(nèi)存映射的實(shí)際地址,這樣就完成了引用的解析。
程序內(nèi)存映射圖
gcc -c function.c main.c
gcc function.o main.o -o demoApp
反匯編main.o文件
objdump -D -M intel main.o
劃紅線的是跳轉(zhuǎn)自身,是因?yàn)殒溄悠鞑恢篮瘮?shù)的地址。先用偽地址代替。
反匯編demoApp
objdump -D -M intel demoApp
畫紅線的位置分別是add_and_multiply 地址為11aa 和nCompletionStatus的地址。
執(zhí)行下面命令查看,看到nCompletionStatus地址為4014.
objdump -x -j .bss demoapp
到此,關(guān)于“C/C++程序鏈接與反匯編工具objdump如何使用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。