C/C++程序链接与反汇编工具objdump如何使用

发布时间:2023-02-07 09:47:48 作者:iii
来源:亿速云 阅读:142

这篇文章主要介绍“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;
}

在上例代码中

该问题如图描述:

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如何使用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

推荐阅读:
  1. C++中怎么定义JsonCpp库
  2. C/C++获取文件大小的方法有哪些

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++ objdump

上一篇:python如何判断列表为空

下一篇:怎么使用Android基准配置文件Baseline Profile方案提升启动速度

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》