最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C/C++程序鏈接與反匯編工具objdump的使用介紹

 更新時(shí)間:2023年02月03日 15:36:04   作者:水火汪  
這篇文章主要介紹了C/C++程序鏈接與反匯編工具objdump的使用,程序構(gòu)建過程的第二個(gè)階段就是鏈接,鏈接過程輸入的是目標(biāo)文件的集合。每個(gè)目標(biāo)文件可以被看作單個(gè)源代碼文件的二進(jìn)制存儲(chǔ)版本

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

鏈接階段

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

1.重定位

鏈接過程的第一個(gè)階段僅僅進(jìn)行拼接,其過程是將分散在單獨(dú)目標(biāo)文件中不同類型的節(jié)拼接到程序內(nèi)存映射節(jié)中。

如圖,為了完成任務(wù),需要將之前預(yù)留的空間,也就是節(jié)中從0開始的地址范圍轉(zhuǎn)換成最終程序內(nèi)存映射中更具體的地址范圍。

2.解析引用

現(xiàn)在我們來看鏈接過程中最難的部分,將節(jié)的地址范圍線性地轉(zhuǎn)換成程序內(nèi)存映射地址范圍。相比來說,更艱巨的任務(wù)在于為不同的部分的代碼建立關(guān)聯(lián),使得程序成為一個(gè)整體。

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ù),這兩個(gè)函數(shù)在同一個(gè)源代碼文件中,這種情況下,函數(shù)add的內(nèi)存映射地址是一個(gè)已知量,會(huì)被擴(kuò)展成其對(duì)與function.o中代碼節(jié)起始地址的相對(duì)偏移。
  • main函數(shù)會(huì)調(diào)用add_and_multiply函數(shù),并同時(shí)引用外部變量nCompletionStatus,這個(gè)時(shí)候問題就出現(xiàn)了--我們不知道它們的實(shí)際程序內(nèi)存地址,實(shí)際上編譯器會(huì)假定這些符號(hào)未來會(huì)在進(jìn)程內(nèi)存映射中存在,但是,直到生成完整內(nèi)存映射之前,這兩個(gè)引用會(huì)一直被當(dāng)成未解析引用。

該問題如圖描述:

function.o

main.o

為了解決這類問題,我們需要在鏈接階段就對(duì)這些引用進(jìn)行解析,此時(shí)鏈接器需要:

  • 檢查拼接到程序內(nèi)存映射中的節(jié)
  • 找出那些部分代碼產(chǎn)生了外部調(diào)用
  • 計(jì)算該引用的精確地址(在內(nèi)存映射中的地址)
  • 最后,將機(jī)器指令中的偽地址替換成程序內(nèi)存映射的實(shí)際地址,這樣就完成了引用的解析。

3.鏈接示例

程序內(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的使用介紹的文章就介紹到這了,更多相關(guān)C++程序鏈接內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++計(jì)算每個(gè)字符出現(xiàn)的次數(shù)

    C++計(jì)算每個(gè)字符出現(xiàn)的次數(shù)

    這篇文章主要介紹了C++計(jì)算每個(gè)字符出現(xiàn)的次數(shù)的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • C++聚合關(guān)系類的構(gòu)造函數(shù)的調(diào)用順序詳解

    C++聚合關(guān)系類的構(gòu)造函數(shù)的調(diào)用順序詳解

    下面小編就為大家?guī)硪黄狢++聚合關(guān)系類的構(gòu)造函數(shù)的調(diào)用順序詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考,一起跟隨小編過來看看吧
    2016-05-05
  • C語言合并排序及實(shí)例代碼

    C語言合并排序及實(shí)例代碼

    本篇文章主要介紹C語言合并排序算法,這里對(duì)合并排序通過實(shí)例代碼進(jìn)行了詳細(xì)講解,希望能幫助到大家學(xué)習(xí)
    2016-07-07
  • c++將數(shù)組名作為函數(shù)參數(shù)對(duì)數(shù)組元素進(jìn)行相應(yīng)的運(yùn)算

    c++將數(shù)組名作為函數(shù)參數(shù)對(duì)數(shù)組元素進(jìn)行相應(yīng)的運(yùn)算

    這篇文章主要介紹了c++將數(shù)組名作為函數(shù)參數(shù)對(duì)數(shù)組元素進(jìn)行相應(yīng)的運(yùn)算,需要的朋友可以參考下
    2014-05-05
  • C++ Boost Bind庫(kù)示例分析使用

    C++ Boost Bind庫(kù)示例分析使用

    Boost是為C++語言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱
    2022-11-11
  • 深入理解c語言數(shù)組

    深入理解c語言數(shù)組

    這篇文章主要介紹了c語言數(shù)組,有需要的朋友可以參考一下
    2013-12-12
  • C++中的拷貝構(gòu)造詳解

    C++中的拷貝構(gòu)造詳解

    這篇文章主要為大家介紹了C++中的拷貝構(gòu)造,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C語言員工業(yè)績(jī)銷售源代碼

    C語言員工業(yè)績(jī)銷售源代碼

    這篇文章主要為大家詳細(xì)介紹了C語言員工業(yè)績(jī)銷售源代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • C語言通過gets和gets_s分別實(shí)現(xiàn)讀取含空格的字符串

    C語言通過gets和gets_s分別實(shí)現(xiàn)讀取含空格的字符串

    在遇到包含空格的字符串輸入時(shí)該如何讀取呢?如果使用scanf以%s格式去讀取輸入的字符串,遇到空格就讀取結(jié)束了,顯然這樣是讀取不了的。本文就將介紹兩個(gè)可以對(duì)含空格字符串讀取的庫(kù)函數(shù)------gets和gets_s函數(shù),感興趣的可以了解一下
    2021-12-12
  • c++ 面向?qū)ο笤O(shè)計(jì)五大原則

    c++ 面向?qū)ο笤O(shè)計(jì)五大原則

    這篇文章主要介紹了c++ 面向?qū)ο笤O(shè)計(jì)五大原則,幫助大家更好的理解和學(xué)習(xí)c++面向?qū)ο笤O(shè)計(jì),感興趣的朋友可以了解下
    2020-08-08

最新評(píng)論

高碑店市| 庆安县| 广宗县| 凤冈县| 西城区| 乌鲁木齐市| 都匀市| 哈密市| 同心县| 五寨县| 平湖市| 怀安县| 八宿县| 雅江县| 长沙县| 新民市| 马关县| 廉江市| 舞阳县| 汽车| 陇西县| 民乐县| 华坪县| 岳阳县| 依安县| 灵寿县| 黄石市| 昌江| 栾川县| 安多县| 桂东县| 永寿县| 杭锦后旗| 革吉县| 葵青区| 黄浦区| 沙坪坝区| 封开县| 包头市| 双城市| 山东省|