例如,这是一个带跳转表的程序集
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这样的编译器是否可以将跳转表放在函数的末尾而不是函数的中间?
答案 0 :(得分:5)
该表不会在函数中间结束。如果仔细观察,可能会注意到这一行:
.section .rdata,"dr"
它告诉汇编器将以下数据放入名为“.rdata”的部分。
以下.text
告诉汇编程序切换回.text部分。因此,功能代码实际上将被连续放置(在.text
中),并且跳转表将单独存储(在.rdata
中)。