aarch64의 함수 호출 패턴
2024년 12월 12일
https://mariokartwii.com/armv8/
호출규약 #
호출규약 #
레지스터 역할 #
- x0 ~ x7 : caller-saved 레지스터
- x19 ~ x28 : callee-saved 레지스터
- x8 :
- x29: FP(스택베이스), x30: LR(링크레지스터)
함수 프롤로그 #
일반적인 함수 #
- 스택 할당 후 이전 레지스터 스택에 백업
- 전달받은 인자들을 저장
1; 이 Stack 의 의미는 함수 호출 전 (sub로 스택 확장 전) sp를 의미한다.
2Stack[-0x10]:8 local_10 ; 이전 sp 기준으로 -0x10 위치가 local_10 으로 네이밍됐다.
3Stack[-0x20]:8 local_20
4Stack[-0x30]:8 local_30
5Stack[-0x40]:8 local_40
6Stack[-0x48]:8 local_48
7
8; 스택 공간 0x80 바이트 할당 (로컬변수 + 이전 레지스터 백업 공간)
901e36650 sub sp, sp, #0x80
10; x29(fp), x30(lr) 을 이전 sp 기준 -0x40 에 백업한다. (== 현재sp + 0x40)
1101e36654 stp x29, x30, [sp, #local_40]
12; x29 = fp = sp + 0x40. 스택프레임 세팅.
1301e36658 add x29, sp, #0x40
14; x23도 이전sp - 0x30 (==현재sp + 0x50) 위치에 백업
1501e3665c str x23, [sp, #local_30]
1601e36660 stp x22, x21, [sp, #local_20]
1701e36664 stp x20, x19, [sp, #local_10]
18; x23에 TLS 의 베이스 주소 저장
1901e36668 mrs x23, tpidr_el0
20 ...
21; canary 값을 현재sp + 0x38 위치에 저장한다.
2201e36670 ldr x8, [x23, #0x28]
23 ...
2401e36680 stur x8, [x29, #local_48]