gcc开关盒组件中的混淆

  • 本文关键字:组件 开关 gcc c
  • 更新时间 :
  • 英文 :


My Prog.c包含一个简单的切换用例,如下所示:

switch (x)
{
case 1:
p=2;
break;
case 2:
p=3;
break;
case 3:
p=4;
break;
case 4:
p=5;
break;
case 5:
p=6;
break;
default:
break;
}

我用编译了这个程序

gcc -g -v prog.c

并使用创建objdump

objdump -S -l a.out>dump_file

对于switchcase语句,我发现已经创建了一个间接分支(jmp *%eax(。

但是,如果我删除任何一个case语句,就不会创建任何间接分支。

gcc版本:5.4.0

我不明白为什么会发生这种事?

这是因为分支表。以避免使用进行编译

gcc -g -v -fno-jump-tables SO.c

如果使用跳转表(gcc编译器中的一个功能(进行编译,则dump_file的大小为:9965字节

但如果没有它,大小为:11493字节。

跳转表通过优化和重新定位一些跳转指令来帮助减少对象代码的大小。

最新更新