编译链接反汇编实验

反编译与反汇编、C++编译过程,包括预编译--汇编--编译--链接 参考:C/C++程序编译流程(预处理->编译->汇编->链接) - ProLyn - 博客园 汇编:是把汇编源程序转变为目标程序(当然还不是最终的可执行的,因为还没有连接程序); 编译:就是把通过用高级语言编写的源程序通过编译器转变为目标程序; 反汇编:将可执行的文件中的二进制经过分析转变为汇编程序。 反编译:将可执行的程序经过分析转变为高级语言的源代码格式,一般完全的转换不太可能,编译器的优化等因素在里面。 反汇编得到的是汇编代码 反编译得到的是所用语言的源代码 阅读详情

一、实验题目

•  Task1:分析 Object 文件 

•  Task2:对比 Object 文件链接后生成的 out 文件与源文件的变化 

•  Task3:调用不同 C 文件中的子函数  

二、实验目的 

 

•

掌握编译和反汇编方法。

•

学会分析 Object 文件。  

 

•

学会对比 Object 文件链接后生成的 out 文件与源文件的变化。  

 

三、实验设计

3.1.  实验步骤 

• 按照TA在实验指导中所给的指令在Ubuntu环境下完成3个Task; 

•  分析每个Task的实验结果; 

• 回答问题,完成实验报告。

3.2.  实验原理 

3.2.1 程序的汇编、链接、运行过程

 

以“ 求一组数的最大值的汇编程序”max.o 为例讨论目标文件和可执行文件的格式。解释一下这个 程序的汇编、链接、运行过程:

1). 写一个汇编程序保存成文本文件max.s。 

2). 汇编器读取这个文本文件转换成目标文件max.o,目标文件由若干个Section组成,我们在汇编 程序中声明的.section会成为目标文件中的Section,此外汇编器还会自动添加一些Section(比如 符号表)。

3). 然后链接器把目标文件中的Section合并成几个Segment,生成可执行文件max。 4). 最后加载器(Loader)根据可执行文件中的Segment信息加载运行这个程序。

3.2.2 对象文件

3.2.2.1 对象文件(Object files)有三个种类: 

a) 可重定位的对象文件(Relocatable file) 

这是由汇编器汇编生成的 .o 文件。后面的链接器(link editor)拿一个或一些 Relocatable object files 作为输入,经链接处理后,生成一个可执行的对象文件 (Executable file) 或者 一个可被共享的对象文件(Shared object file)。

b) 可执行的对象文件(Executable file) 文本编辑器vi、调式用的工具gdb、播放mp3歌曲的软件mplayer等等都是Executable objectfile。在我们的 Linux 系统里面,存在两种可执行的东西。除了这里说的 Executable object file,另外一种就是可执行的脚本(如shell脚本)。注意这些脚本不是 Executable object file, 它们只是文本文件,但是执行这些脚本所用的解释器就是 Executable object file,比如 bash shell 程序。

c) 可被共享的对象文件(Shared object file) 

这些就是所谓的动态库文件,也即 .so 文件。如果拿前面的静态库来生成可执行程序,那 每个生成的可执行程序中都会有一份库代码的拷贝。如果在磁盘中存储这些可执行程序,那就会占用额外的磁盘空间;另外如果拿它们放到Linux系统上一起运行,也会浪费掉宝贵的物理内 存。如果将静态库换成动态库,那么这些问题都不会出现。

要看一个文件是属于这三种类型ELF对象文件中的哪一种,可以用file命令查看。

 

左边是从链接器的视角来看ELF文件,开头的ELF Header描述了体系结构和操作系统等基本信息,并 指出Section Header Table和Program Header Table在文件中的什么位置,Program Header Table在链接过程中用不到,所以是可有可无的,Section Header Table中保存了所有Section的描述信息, 通过Section Header Table可以找到每个Section在文件中的位置。

3.2.3 查看ELF对象文件的内容: ELF文件头被固定地放在不同类对象文件的最前面。至于它里面的内容,除了file命令所显示出来 的那些之外,更重要的是包含另外一些数据,用于描述ELF文件中ELF文件头之外的内容。我们可 以使用其中的 readelf 工具来读出整个ELF文件头的内容。  

 

 

3.2.4 分析ELF对象文件

用readelf工具读出目标文件max.o的ELF Header和Section Header Table,然后我们逐段 分析。

a) ELF Header


 

ELF Header中描述了操作系统是UNIX,体系结构是80386。Section Header Table中有8个Section Header,从文件地址200(0xc8)开始,每个Section Header占40字节,共320字节,到文件地址 0x207结束。这个目标文件没有Program Header。文件地址是这样定义的:文件开头第一个字节的 地址是0,然后每个字节占一个地址。  

b) Section Header

 

从Section Header中读出各Section的描述信息,其中.text和.data是我们在汇编程序中声明的 Section,而其它Section是汇编器自动添加的。Addr是这些段加载到内存中的地址(我们讲过程序 中的地址都是虚拟地址),加载地址要在链接时填写,现在空缺,所以是全0。Off和Size列指出了 各Section的起始文件地址和长度。比如.text段从文件地址0x34开始,一共98个字节,.data段从 文件地址0xcc开始,大小为0个字节,此段为空,.bss也同样为空。根据以上信息可以描绘出整个 目标文件的布局。


 

c) 符号表

 

.symtab是符号表。Ndx列是每个符号所在的Section编号,例如符号data_items在第3个Section里(也 就是.data段),各Section的编号见Section Header Table。Value列是每个符号所代表的地址,在 目标文件中,符号地址都是相对于该符号所在Section的相对地址,比如data_items位于.data段的 开头,所以地址是0,_start位于.text段的开头,所以地址也是0,但是start_loop和loop_exit相 对于.text段的地址就不是0了。从Bind这一列可以看出_start这个符号是GLOBAL的,而其它符号是 LOCAL的,GLOBAL符号是在汇编程序中用.globl指示声明过的符号。

² 各段解释总汇: 

基本: 代码段, 数据段和BSS段 

代码段 .text (code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。 这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读.

数据段 .data 通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态 内存分配。

BSS段 .bss 未初始化的全局变量和局部静态变量,一般在初始化时bss 段部分将会清零(bss 段属于静态内存分配,即程序一开始就将其清零了)BSS段属于静态内存分配。初 始化为0的全局变量也会被放在.bss因为被优化掉了,放在.bss可以节省磁盘空间

(.bss不占磁盘空间)。  

其余段:

 

段的参数:段长( Size ),段所在位置 (File Offset)可以在每段的CONTENTS, ALLOC中找到各段属性, CONTENT表示该段在文件中存在,有专门的命令”size”可以用来查看ELF文件的代码段,数据段和 BSS段的长度。


3.2.5 连接前后生成文件变化 

使用 arm-elf-ld.real -o max2.out max.o对源文件进行链接。

四、实验结果

4.1 Task1 生成 Object 文件,并分析

4.1.1

gcc objdump反汇编 Linux 内核panic调试oops信息及栈回溯一、gcc编译反汇编 一、gcc编译 1、gcc编译过程:预处理->编译->汇编->链接 一步编译、连接 gcc无需加选项,直接生成可执行文件,如果是Linux内核中,可能要用交叉编译工具链的gcc。如/opt/toolchains/crosstools-arm-gcc-5.5-linux-4.1-glibc-2.26-binutils-2.28.1/usr/bin/arm-buildroot-linux-gnueabi- 对应gcc代码: 阅读详情

相关推荐

微机系统实验一

实验报告(提示:具体安装步骤可参考讲义的附录文件:实验环境安装指引)Ubuntu系统gcc命令。

qq_53636327的博客 801

ESP32-CAM与Thonny的完美搭配:从烧录到通信的完整流程

本文详细介绍了如何将ESP32-CAM与Thonny IDE完美结合,从固件烧录到通信测试的完整流程。通过硬件连接、MicroPython固件烧录、Thonny环境配置以及摄像头功能开发等步骤,帮助开发者快速搭建高效的物联网开发环境,实现图像采集与无线通信功能。

tomato的博客 1122

​苹果开发者账号推送证书配置详细指南​

推送证书的配置是iOS应用实现消息推送的核心步骤。通过生成证书、配置描述文件、集成到服务器三大环节,开发者可快速为App启用APNs服务。建议优先使用更灵活的APNs Auth Key替代传统证书,以减少维护成本。确保拥有有效的苹果开发者账号(个人/公司账号),年费已缴纳。

2324

深度解析:如何通过NodeRed实现私有485协议VRF中央空调与HomeAssistant的无缝对接

本文详细介绍了如何利用NodeRed的灵活流程化编程,破解并处理VRF中央空调的私有485协议,实现与HomeAssistant的无缝本地化集成。文章从协议分析、硬件准备到NodeRed核心流程搭建、数据映射及双向通信控制,提供了一套完整的实战方案,帮助用户将非标设备深度融入智能家居生态,摆脱对厂家云服务的依赖。

weixin_29173777的博客 406

PotPlayer播放4K HDR电影时,如何正确设置LAV解码器与MadVR渲染器避免色彩失真?

本文详细介绍了如何在PotPlayer中正确配置LAV解码器与MadVR渲染器,以解决播放4K HDR电影时的色彩失真问题。从组件安装、参数设置到显卡协同配置,提供了一套完整的端到端解决方案,帮助影音爱好者获得最佳的视觉体验。

weixin_28732953的博客 438

基于AT32F421的紧凑型FOC电机驱动板设计

磁场定向控制(FOC)是永磁同步电机(PMSM)与无刷直流电机(BLDC)实现高精度转矩控制和高效运行的核心技术,其本质是通过Clarke/Park坐标变换解耦定子电流,实现d轴磁链与q轴转矩的独立调节。该技术依赖实时性严苛的电流采样、高精度位置反馈及确定性PWM生成,广泛应用于机器人关节、智能装备等中小功率伺服场景。国产Cortex-M4微控制器(如AT32F421)凭借集成ADC、高级定时器与DSP指令集,已成为低成本、高可靠FOC嵌入式实现的理想平台。本文围绕一款工程化FOC驱动板展开,涵盖低侧电流采

weixin_42510243的博客 699

保姆级教程:用NILMTK和REDD数据集,5分钟跑通你的第一个负荷分解模型

本文提供了一份详细的NILMTK和REDD数据集负荷分解模型教程,适合零基础用户快速上手。从环境准备、数据获取到模型构建和评估,全程仅需5分钟即可完成。特别适合希望快速入门非侵入式负荷分解(NILM)的开发者,涵盖数据预处理、模型训练及结果可视化等关键步骤。

weixin_30493401的博客 441

[SystemC]SystemC中的模块和程序

SystemC 中的层次结构是使用类 sc_module 创建的。sc_module 可以直接使用,也可以使用宏 SC_MODULE “隐藏”。上面的示例 SC_MODULE 创建了一个名为 nand2 的 sc_module 类对象。它的输出纯粹是输入值的函数。因此,模型可以使用最简单的 SystemC 进程,即 SC_METHOD。摘要:本节包含一个完整的简单设计,用于演示 SystemC 中模块和流程的使用。同样,重要的是要注意这不是典型的设计风格 - 但它很好而且易于理解。为什么要看模块和流程?

元直的博客 1867

华为OD机试真题 新系统 2026-04-26 Python&JS 实现【最大化游戏试玩资格分发】

新研发了一台游戏设备可以面向用户接受试玩。现有 n 个试玩申请,每个试玩有开始时间和结束时间。作为协调员,为了能让更多人体验到游戏,你需要对试玩申请进行选择,使得:

MISAYAONE的博客 289

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

上一篇: 编译和链接
下一篇: Visual C++ 开发(一) 入门
ForestRound
博客等级 码龄12年 30粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值