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


这篇文章主要介绍“C/C++程序链接与反汇编工具objdump如何使用”,在日常操作中,相信很多人在C/C++程序链接与反汇编工具objdump如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C/C++程序链接与反汇编工具objdump如何使用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!程序构建过程的第二个阶段就是链接,链接过程输入的是目标文件的集合。每个目标文件可以被看作单个源代码文件的二进制存储版本,需要为程序内存映射提供各种各样的节(代码.text 初始化数据.data 未初始化数据.bss 和只读数据.rdata),链接器的最终任务是将独立的节组合成最终的程序内存映射节,与此同时解析所有的引用。链接过程包括一系列阶段(重定位、解析引用),接下来我们介绍这些阶段免费云主机域名。链接过程的第一个阶段仅仅进行拼接,其过程是将分散在单独目标文件中不同类型的节拼接到程序内存映射节中。如图,为了完成任务,需要将之前预留的空间,也就是节中从0开始的地址范围转换成最终程序内存映射中更具体的地址范围。现在我们来看链接过程中最难的部分,将节的地址范围线性地转换成程序内存映射地址范围。相比来说,更艰巨的任务在于为不同的部分的代码建立关联,使得程序成为一个整体。function.h代码:function.cmain.c在上例代码中add_and_multiply 函数调用add函数,这两个函数在同一个源代码文件中,这种情况下,函数add的内存映射地址是一个已知量,会被扩展成其对与function.o中代码节起始地址的相对偏移。main函数会调用add_and_multiply函数,并同时引用外部变量nCompletionStatus,这个时候问题就出现了–我们不知道它们的实际程序内存地址,实际上编译器会假定这些符号未来会在进程内存映射中存在,但是,直到生成完整内存映射之前,这两个引用会一直被当成未解析引用。该问题如图描述:function.omain.o为了解决这类问题,我们需要在链接阶段就对这些引用进行解析,此时链接器需要:检查拼接到程序内存映射中的节找出那些部分代码产生了外部调用计算该引用的精确地址(在内存映射中的地址)最后,将机器指令中的伪地址替换成程序内存映射的实际地址,这样就完成了引用的解析。程序内存映射图gcc -c function.c main.c
gcc function.o main.o -o demoApp反汇编main.o文件objdump -D -M intel main.o划红线的是跳转自身,是因为链接器不知道函数的地址。先用伪地址代替。反汇编demoAppobjdump -D -M intel demoApp画红线的位置分别是add_and_multiply 地址为11aa 和nCompletionStatus的地址。执行下面命令查看,看到nCompletionStatus地址为4014.objdump -x -j .bss demoapp到此,关于“C/C++程序链接与反汇编工具objdump如何使用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注百云主机网站,小编会继续努力为大家带来更多实用的文章!

相关推荐: vue引入公共样式的方法有哪些

本文小编为大家详细介绍“vue引入公共样式的方法有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue引入公共样式的方法有哪些”免费云主机域名文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在vue中引入公共样式的方法有以下几种1…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 02/28 20:57
下一篇 02/28 20:58

相关推荐