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

use*_*173 0 c compiler-construction x86 assembly

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

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
...
Run Code Online (Sandbox Code Playgroud)

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

Igo*_*sky 5

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

.section .rdata,"dr"
Run Code Online (Sandbox Code Playgroud)

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

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