关闭

arm中r12(IP)的用途

标签: subroutinelinker汇编文档branchlibrary
15750人阅读 评论(2) 收藏 举报
分类:
  1. arm中r12的用途
    第一篇博客。就写一个最近遇到的bug吧。算是为光秃秃的博客填点东西吧。
    近来在维护一个年久失修的程序, 包括应用,库文件以及一个linux device driver.很久以前程序是用arm-linux-gcc 3.4.3编译的。而最近当换用arm-linux-gcc 4.1.1进行编译的时候发现程序神奇的无法运行了。经过尝试,发现当我们使用shared library形式编译程序后,它便无法正常运行。而如果将库和应用static linking在一起后就能得出正确结果。
    苦思良久不得其法。几个人只好痛苦的开始研究arm的文档试图找到答案。也算功夫不负有心人。终于在一份arm公司的文档中找到了答案。原来曾经被视为general register的r12, 现在已不再仅仅是通用寄存器了。在新的规范中,它被称为Intra-Procedure-call scratch register。以下摘录一些文档的内容:
     
    Register r12 (IP) may be used by a linker as a scratch register between a routine and any subroutine it calls (for details, see §5.3.1.1, Use of IP by the linker). It can also be used within a routine to hold intermediate values between subroutine calls
     
    Both the ARM- and Thumb-state BL instructions are unable to address the full 32-bit address space, so it may be necessary for the linker to insert a veneer between the calling routine and the called subroutine. Veneers may also be needed to support ARM-Thumb inter-working or dynamic linking. Any veneer inserted must preserve the contents of all registers except IP (r12) and the condition code flags; a conforming program must assume that a veneer that alters IP may be inserted at any branch instruction that is exposed to a relocation that supports inter-working or long branches.
     
    即是说。现在如果汇编代码中存在bl指令,而r12又被用来作为通用寄存器,那么r12的值就很有可能会被链接器插入的veneer程序修改掉了。当然如果源代码是纯粹的c代码,那arm-linux-gcc 4.1.1 本身并不会犯这样的错误。但由于我维护的程序中有部分汇编代码,而早年写的汇编代码又没有估计到这个因素。所以才引发了这个稀奇古怪的问题。
     
    哦, 对了。还是发一下文档的引用。
    [1] "Procedure Call Standard for the ARM Architecture", 19th January, 2007, Richard Earnshaw.
     
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2591860次
    • 积分:33166
    • 等级:
    • 排名:第153名
    • 原创:444篇
    • 转载:410篇
    • 译文:7篇
    • 评论:2892条
    最新评论
    gooogleman最喜欢去的论坛