clang:使用非平坦的x86堆栈模型进行编译

时间:2015-01-18 13:23:28

标签: c x86 llvm-clang

如果我理解clang假设x86的堆栈段是平的(有0个碱基)。例如,使用以下命令行进行编译时:

clang -cc1 -S -mllvm --x86-asm-syntax=intel -o - -triple i986-unknown-unknown -mrelocation-model static xxx.c

xxx.c:

void f()
{
    int a = 5;
    int *ap = &a;
    int b = *ap;
}

生成以下程序集:

f:
    sub     ESP, 12
    lea     EAX, DWORD PTR [ESP + 8]
    mov     DWORD PTR [ESP + 8], 5
    mov     DWORD PTR [ESP + 4], EAX
    mov     EAX, DWORD PTR [ESP + 4]
    mov     EAX, DWORD PTR [EAX]
    mov     DWORD PTR [ESP], EAX
    add     ESP, 12
    ret

如果堆栈是平的,这可能只是正确的,因为EAX包含SS基础的偏移量。

是否可以使用任意基础编译SS的C代码?

1 个答案:

答案 0 :(得分:1)

在保护模式下执行时,段寄存器不包含您可以使用的偏移。相反,每个细分都独立于其他细分。据我所知,目前使用的操作系统都没有使用指针包含段信息的ABI,因为你可以获取任何局部变量的地址(放在堆栈上),这是必要的。我不认为clang(或gcc)可以为这样的模型编译代码。