文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-07-05 02:14

关注

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯