编译器会将跳转表放在函数的末尾吗?

时间:2013-11-07 22:17:59

标签: c assembly compiler-construction x86

例如,这是一个带跳转表的程序集

movl    $5, -4(%ebp)
cmpl    $10, -4(%ebp)
ja  L13
movl    -4(%ebp), %eax
sall    $2, %eax
movl    L14(%eax), %eax
jmp *%eax
.section .rdata,"dr"
.align 4
L14:
.long   L13
.long   L3
.long   L4
.long   L5
.long   L6
.long   L7
.long   L8
.long   L9
.long   L10
.long   L11
.long   L12
.text
L3:
movl    $LC0, (%esp)
call    _printf
jmp L2
...

我的问题是,像GCC或ICC这样的编译器是否可以将跳转表放在函数的末尾而不是函数的中间?

1 个答案:

答案 0 :(得分:5)

该表不会在函数中间结束。如果仔细观察,可能会注意到这一行:

.section .rdata,"dr"

它告诉汇编器将以下数据放入名为“.rdata”的部分。

以下.text告诉汇编程序切换回.text部分。因此,功能代码实际上将被连续放置(在.text中),并且跳转表将单独存储(在.rdata中)。