forked from namhyung/uftrace
-
Notifications
You must be signed in to change notification settings - Fork 0
[RISC‐V 64] 2. plthook.S 구현 (진행 예정)
최기철 edited this page Aug 27, 2023
·
1 revision
- Heap은 동적으로 메모리 공간을 할당받을 때 사용되는 영역이기 때문에 런타임 시점(프로그램이 실행되고 있는 중)에 결정되며, Stack은 함수 호출시 주어지는 인자와 지역 변수가 저장되는 영역이기 때문에 컴파일 시점에 결정된다.
- 프로세스 메모리 구조 내부의 Stack은 자료구조에서 배웠던 Stack과 동일하게 동작하며, 다만 위에서 아래로 자란다는 점만 다르다.
- aarch64 아키텍처의 plthook.S 파일의 제일 맨 윗 부분의 주석을 보면
glibc/ports/sysdeps/aarch64/dl-trampoline.S
의 코드에 기반한다고 되어있고, 아래 링크에서 확인할 수 있다. - 여기서 설명할 어셈블리어 코드의 레지스터들이 어떤 레지스터인지는 2-2. aarch64 아키텍처의 레지스터 목록 를 참조한다.
-
여기서도 함수가 호출되기 전 시점에 인자를 저장하고 복원해야 하기 때문에, mcount.S에서 인자를 저장하고 복원하는 코드를 동일하게 사용한다.
- 다만, 여기서는 해당 어셈블리 코드를 별도의 함수처럼 빼서 사용하고 있다.
.macro save_args stp x8, x18, [sp, #-16]! stp x6, x7, [sp, #-16]! stp x4, x5, [sp, #-16]! stp x2, x3, [sp, #-16]! stp x0, x1, [sp, #-16]! .endm .macro restore_args ldp x0, x1, [sp], #16 ldp x2, x3, [sp], #16 ldp x4, x5, [sp], #16 ldp x6, x7, [sp], #16 ldp x8, x18, [sp], #16 .endm
-
plt_hooker는 아래와 같이 plt_hooker 어셈블리 함수가 실행되는 시점에 x16, x17 레지스터를 스택에 저장하고, 인자 레지스터에 담긴 값을 스택에 저장한다.
- save_args는 위에서 설명한 실질적인 인자 저장 어셈블리 코드가 호출됨
ENTRY(plt_hooker) /* * it gets called with: * [sp, #8] : lr * [sp, #0] : &PLTGOT[n] * x16 (ip0): &PLTGOT[2] * x17 (ip1): address of dl resolver */ stp x16, x17, [sp, #-16]! save_args /* sp -= 80 */ ......
-
plthook_entry 함수는 4개의 인자를 가지고 있으며, 아래 코드는 각 인자들을 설정해주고 plthook_entry 함수를 호출하는 부분이다
...... add x0, sp, #104 ldr x1, [sp, #96] sub x1, x1, x16 lsr x1, x1, #3 sub x1, x1, #1 ldr x2, [x16, #-8] mov x3, sp bl plthook_entry ......
초창기 코드 링크
참조 링크 (riscv의 __riscv_float_abi_soft를 이해하기 위해 필요한 지식)