2016-10-09 8 views
1

Aleph One에서 "재미와 이익을위한 스택 분쇄"를 망쳤으며 64 비트 용 코드를 컴파일하는 동안 프로세서, 스택 메모리는 일반적인 "sub $ VALUE, % REG"을 사용하여 할당되지 않습니다. Aleph One 기사에서 작업 할 때 64 비트 시스템에서 스택 할당이 없음

함수의 소스 코드입니다

void function() { 
    char buffer1[5]; 
    char buffer2[10]; 
    int *ret; 

    ret = buffer1 + 32; 
    (*ret) +=8; 
} 

그리고 이것은 컴파일 된 버전입니다

function: 
.LFB0: 
.cfi_startproc 
pushq %rbp 
.cfi_def_cfa_offset 16 
.cfi_offset 6, -16 
movq %rsp, %rbp 
.cfi_def_cfa_register 6 
movl $1868654947, -16(%rbp) 
movb $0, -12(%rbp) 
leaq -16(%rbp), %rax 
addq $32, %rax 
movq %rax, -8(%rbp) 
movq -8(%rbp), %rax 
movl (%rax), %eax 
leal 8(%rax), %edx 
movq -8(%rbp), %rax 
movl %edx, (%rax) 
nop 
popq %rbp 
.cfi_def_cfa 7, 8 
ret 
.cfi_endproc 

내가 GCC와 -m32 옵션을 사용하는 경우이 나타나는 동안 왜 표준 스택 할당이없는 ?

답변

1

amd64 SysV ABI에는 red zone이라는 개념이 있습니다. 빨간색 영역은 스택 포인터 바로 아래 128 바이트 영역입니다. 함수가 스택 포인터를 감소시키면서 소량의 스택을 할당 할 수있게하는 것이 목적입니다. 그래서 스택 포인터가 감소하는 것을 보지 못합니다.

-mno-red-zone으로 컴파일하여이 기능을 해제하십시오.

+0

감사합니다. – last

+0

@last 답변을 수락 된 것으로 표시하여 다른 사람들이 귀하를 도왔다는 것을 알도록하십시오. – fuz