arm-linux程序的链接地址和原先地址
程序在运行时通过连接器脚本跳转到指定的位置执行,那么原先的地址还有意义吗,为什么通过adr和b,bl等这些指令还是根据原本地址来跳转的,在程序运行时候,PC指针指向的是原...
程序在运行时通过连接器脚本跳转到指定的位置执行,那么原先的地址还有意义吗,为什么通过adr和b,bl等这些指令还是根据原本地址来跳转的,在程序运行时候,PC指针指向的是原本地址还是链接地址?
展开
1个回答
展开全部
连接器脚本xxx.lds文件中指定的地址,就是链接地址,程序运行时必须位于它的链接地址处,汇编文件中的各个标号或者c文件中的各个函数名(函数的入口地址)对应的链接地址就是由链接脚本中的起始链接地址和各个目标文件(.s或.c文件编译但还为链接的文件)的排放顺序有关。这些链接地址可以通过查看可执行文件的反汇编文件即xxx.dis文件来获得.
如果你不使用全局变量或者静态变量,访问这些变量时要使用到链接地址,重定位完成之前不能使用这些类型的变量,adr、b和bl指令都是属于相对跳转指令,即在当前pc值的基础上加减一个偏移值,跳转去执行。如果只使用adr、b或者bl指令,并且不访问全局变量或者静态变量,这类代码被称为“位置无关码”,即代码的存储位置可以不在其链接地址处。如果当使用全局跳转指令ldr时就只能使用链接地址了,如ldr pc,_reset。程序运行时,pc指针的内容是不区分原本地址(存储地址)或链接地址的,只要是”位置无关码“,存储地址可以与链接地址不同,不是位置无关码就要使用到链接地址,即存储地址与链接地址必须相同。即使用之前必须完成代码的重定位。
ps:望采纳!
如果你不使用全局变量或者静态变量,访问这些变量时要使用到链接地址,重定位完成之前不能使用这些类型的变量,adr、b和bl指令都是属于相对跳转指令,即在当前pc值的基础上加减一个偏移值,跳转去执行。如果只使用adr、b或者bl指令,并且不访问全局变量或者静态变量,这类代码被称为“位置无关码”,即代码的存储位置可以不在其链接地址处。如果当使用全局跳转指令ldr时就只能使用链接地址了,如ldr pc,_reset。程序运行时,pc指针的内容是不区分原本地址(存储地址)或链接地址的,只要是”位置无关码“,存储地址可以与链接地址不同,不是位置无关码就要使用到链接地址,即存储地址与链接地址必须相同。即使用之前必须完成代码的重定位。
ps:望采纳!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询