我有一个静态库档案,我试图理解。

首先,我使用'ar'提取目标文件。
目标文件为“ ELF可重定位的32位LSB,ARM,EABI5版本1(SYSV),未剥离”
/>然后我用'objdump -D'来获得汇编指令。

现在我正在观察汇编清单并找到一些对我来说很好奇的指令。
显然具有链接(bl)的分支,R0被移入R3,下一条指令将R3移至R0。

23c:    e1a00003        mov     r0, r3
240:    ebfffffe        bl      0 <atoi>
244:    e1a03000        mov     r3, r0
248:    e1a00003        mov     r0, r3


在归档中的不同对象文件中多次发生。

最后,从分支返回时,R0和R3都被设置为R0的值。
对此行为有什么好的解释?

评论

嗨,欢迎来到RE.SE!您能否显示您提供的代码的周围环境?也许之前和之后还有四行...

外部库函数的接口需要r0包含要处理的数据,并且它的结果也返回到r0。编译器不知道(或不在乎),因此它设置了调用,调用了库函数,然后还原了寄存器以恢复其正在执行的操作。这只是一些未优化的东西。

#1 楼

这很可能是未经优化而编译的代码(-O0)。在此类代码中,冗余操作非常常见,因为编译器会忠实地将单个语句转换为机器代码,但不会尝试执行优化来删除或简化冗余代码。