最近追查一个崩溃问题,反汇编根据调用栈一层层查找,到了某一函数后竞找不到对应代码行,后进入其调用的某一个函数才将其调用顺序串起来。由此做了一个小实验,从汇编层面看看编译器如何处理。
C代码:
#include <stdio.h>
static void myfunc(void)
{
printf("myfunc in\n");
printf("myfunc out\n");
}
int main(int argc, char *argv[])
{
printf("main in\n");
myfunc();
printf("main out\n");
return 0;
}
用 arm-none-linux-gnueabi-gcc main.c 编译,再用arm-none-linux-gnueabi-objdump -d a.out 反汇编输出,从下面汇编片段,可以看出main函数对myfunc的调用: bl 842c <myfunc>
0000842c <myfunc>:
842c: e92d4800 push {fp, lr}
8430: e28db004 add fp, sp, #4
8434: e59f000c ldr r0, [pc, #12] ; 8448 <myfunc+0x1c>
8438: ebffffcd bl 8374 <_init+0x44>
843c: e59f0008 ldr r0, [pc, #8] ; 844c <myfunc+0x20>
8440: ebffffcb bl 8374 <_init+0x44>
8444: e8bd8800 pop {fp, pc}
8448:

本文通过实验揭示了C代码在不同优化级别下,编译器如何调整myfunc函数的调用方式,从嵌入到独立函数。展示了汇编级别的细节变化和优化策略。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



