iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C/C++程序链接与反汇编工具objdump如何使用
  • 732
分享到

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

2023-07-05 02:07:06 732人浏览 泡泡鱼
摘要

这篇文章主要介绍“C/C++程序链接与反汇编工具objdump如何使用”,在日常操作中,相信很多人在C/c++程序链接与反汇编工具objdump如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C/C++

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

在上例代码中

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

--结束END--

本文标题: C/C++程序链接与反汇编工具objdump如何使用

本文链接: https://www.lsjlt.com/news/349075.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C/C++程序链接与反汇编工具objdump如何使用
    这篇文章主要介绍“C/C++程序链接与反汇编工具objdump如何使用”,在日常操作中,相信很多人在C/C++程序链接与反汇编工具objdump如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C/C++...
    99+
    2023-07-05
  • C/C++程序链接与反汇编工具objdump的使用介绍
    目录链接阶段1.重定位2.解析引用3.链接示例程序构建过程的第二个阶段就是链接,链接过程输入的是目标文件的集合。每个目标文件可以被看作单个源代码文件的二进制存储版本,需要为程序内存映...
    99+
    2023-02-03
    C++程序链接 C++ objdump C++反汇编
  • Linux下如何使用objdump进行反汇编
    小编给大家分享一下Linux下如何使用objdump进行反汇编,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!objdump命令是Linux下的反汇编目标文件或者可执行文件的命令,它以一种可阅读的格式让你更多地了解二进制文件...
    99+
    2023-06-27
  • C++图形编程工具链选择与使用指南
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-15
  • 如何使用工具和库来优化C++程序?
    现代 c++++ 开发中,利用工具和库进行优化至关重要。valgrind、perf 和 lldb 等工具可识别瓶颈、测量性能并进行调试。eigen、boost 和 opencv 等库可提...
    99+
    2024-05-08
    工具 优化 c++ linux
  • 如何分析C++中的编译与链接
    如何分析C++中的编译与链接,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言:C++有个最大的特点,那便是编译型语言,相比于Python这种解释型语言,C++在编译阶段就...
    99+
    2023-06-21
  • 如何使用C++中的C++Test工具
    如何使用C++中的C++Test工具,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。C++Test工具允许你定制白盒测试用例的生成,和在什么层次上(项目、文件、类或方法)执行测试...
    99+
    2023-06-17
  • 如何使用Dev C++编写C语言程序
    本篇内容介绍了“如何使用Dev C++编写C语言程序”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C语言是什么C语言是一门面向过程的、抽象化...
    99+
    2023-06-08
  • 如何用汇编和C语言写流水灯程序
    本篇内容介绍了“如何用汇编和C语言写流水灯程序”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!现在可能很少看到汇编程序了,但单片机的启动文件、...
    99+
    2023-06-15
  • C/C++编程中const如何使用
    这篇文章主要介绍“C/C++编程中const如何使用”,在日常操作中,相信很多人在C/C++编程中const如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C/C++编程中const如何使用”的疑惑有所...
    99+
    2023-06-29
  • GOLang IO接口与工具如何使用
    这篇文章主要介绍“GOLang IO接口与工具如何使用”,在日常操作中,相信很多人在GOLang IO接口与工具如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”GOLang ...
    99+
    2023-07-05
  • C语言如何与ARM汇编语言混合编程示例详解
    目录一、ARM汇编语言简介二、C语言调用汇编语言1.无参数调用2.有参数调用三、汇编语言调用C语言四、总结五、参考文献主要使用软件:keiL μVision5 一、ARM汇编语言简介...
    99+
    2024-04-02
  • C#中如何使用反射和动态加载程序集
    C#中如何使用反射和动态加载程序集引言:在C#中,反射(Reflection)是一种强大的机制,它允许我们在运行时获取和操作程序的元数据,包括类型信息、成员信息等。而动态加载程序集则是通过反射来实现的一种常见应用,并且在一些特定场景中非常有...
    99+
    2023-10-22
    C# 反射 动态加载
  • C#中如何使用远程调试和远程部署工具
    标题:C#中远程调试和远程部署工具的使用技巧摘要:本文将介绍如何在C#开发中使用远程调试和远程部署工具。通过远程调试,您可以在另一台计算机上调试代码,而无需在本地机器上运行整个应用程序。远程部署工具则可以帮助您将应用程序部署到远程服务器上。...
    99+
    2023-10-22
    远程调试 C#编程 远程部署
  • C语言直接插入排序与希尔排序如何使用
    这篇文章主要讲解了“C语言直接插入排序与希尔排序如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言直接插入排序与希尔排序如何使用”吧!一.直接插入排序1.1直接插入排序引入排序是我...
    99+
    2023-06-30
  • C#多线程编程Task如何使用
    这篇“C#多线程编程Task如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#多线程编程Task如何使用”文章吧。一...
    99+
    2023-06-29
  • C++编译器和链接器工作原理及使用方法完全指南
    目录正文编译器链接器编译器和链接器的工作流程总结正文 C++是一种强类型语言,它的编译和链接是程序开发过程中不可或缺的两个环节。编译器和链接器是两个非常重要的概念。本文将详细介绍C+...
    99+
    2023-05-20
    C++编译器链接器 C++ 编译链接
  • C++如何实现结束应用进程小工具
    这篇文章给大家分享的是有关C++如何实现结束应用进程小工具的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。C++实现结束应用进程小工具(windows)说明:在电脑上一些软件或系统有时可能会将程序偷偷运行在后台,占...
    99+
    2023-06-15
  • c# wpf如何使用Blend工具绘制Control样式
    目录实现效果实现方式实现步骤Blend绘制Path绘制Path绘制直线绘制曲线改变曲线形状移除Path上的线段移除Path上的点Path添加点绘制自由的形状本文通过设计一个Radio...
    99+
    2024-04-02
  • C#数字信号处理工具包如何使用
    这篇文章主要介绍“C#数字信号处理工具包如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#数字信号处理工具包如何使用”文章能帮助大家解决问题。JXI C# DSP Tools, Spectr...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作