反汇编出来的地址是运行地址还是编译地址?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反汇编出来的地址是运行地址还是编译地址?相关的知识,希望对你有一定的参考价值。

0c100000 <_start>:
比如这个地址到底是指什么地址?

winhex是文件地址,也就是你称的编译地址吧
OD和IDA的都是运行地址,也就是运行时地址
参考技术A OD
IDA出来的都是运行地址
参考技术B 你是怎么反汇编的?od动态附加?

SDRAM和重定位---链接地址和运行地址

在了解重定位之前,必须先区分开链接地址和运行地址,位置有关代码和位置无关代码
=========================================================
链接地址和运行地址:
  • 链接地址:指在链接时指定的地址,是我们设想的将来程序要运行的地址。程序中所有标号的地址在链接后便确定了,不管程序在哪运行,都不会改变。使用arm-linux-objdump反汇编查看的就是链接地址
  • 运行地址:指程序在板子中实际运行的地址
从上面的定义可以看出,链接地址和运行地址可以相同,也可以不同。
=========================================================
位置有关代码和位置无关代码:
  • 位置有关代码:从字面意思看就是该指令的执行是与内存地址有关的;如果运行地址和链接地址不相等,那么执行到此种指令的时候将会出现程序跑飞的情况。
  • 位置无关代码(PIC):从字面意思看就是该指令的执行是与内存地址无关的;无论运行地址和链接地址相等或者不相等,此种指令都能正常运行
举几个例子:
  • b/bl label:属于位置无关代码,因为 b/bl 指令找到 label 的方法是根据当前 pc 的值结合偏移量来找到label
  • adr r0, label伪指令:属于位置无关代码,因为adr伪指令在汇编过程中会被替代成 add/sub pc, 偏移量的形式,可见也是基于当前pc和偏移量来找到 label
  • ldr r0,=label伪指令:属于位置有关代码,因为此伪指令将会被替代成 ldr r0, [pc, 偏移量]的形式,pc+偏移量中的内容将会是 label 的值,也就是链接时确定的地址。
=======================================================
重定位:
  重定位就是将代码搬移到链接地址处去运行的动作。
 
uboot之所以要进行代码重定位:
  是因为uboot的镜像太大了,不可能在iRAM中放得下,所以必须要放在 sdram 中运行,而BL1又必须在iRAM中运行,所以就需要进行代码重定位。

以上是关于反汇编出来的地址是运行地址还是编译地址?的主要内容,如果未能解决你的问题,请参考以下文章

dll文件如何反汇编成源码,C++语言编写

什么软件能将C语言的执行文件反汇编为汇编源代码

反汇编查找内存地址

arm汇编b指令是绝对地址还是相对地址跳转?

反汇编 Visual Studio

C++反汇编第二讲,反汇编中识别虚表指针,以及指向的虚函数地址