Symbol을 읽을 때, 동작하는 Binary가 compile된 주소에 잘 load되어 있다면, LDR instruction을 통해서 Symbol의 위치를 얻어 올 수 있다. 하지만 Binary가 해당 주소에 적재가 안되었을 때에는 LDR instruction을 통해서 symbol의 주소에 접근하면 잘못 된 값을 가져올 수도 있다.
따라서, ARM은 adrp instruction을 통해 PC-relative addressing mechanism을 제공해준다.
예를 들어 foo라는 심볼의 주소를 register x0에 넣으려면 아래와 같이 foo[63:12]를 adrp 명령어를 통해 pc기준 상대 주소로 가져온 후 foo[11:0]의 주소는 #:lo12:foo를 통해서 얻어 올 수 있다:
adrp x0, :pg_hi21:foo
add x0, x0, #:lo12:foo
만약 foo라는 심볼의 주소를 얻어 오기 보다는 해당 심볼에 바로 접근하여 심볼로 부터 값을 읽어 오려고 한다면 아래와 같이 ldr 명령어를 통해 얻어 올 수 있다.
adrp x0, :pg_hi21:foo
ldr x0, [x0, #:lo12:foo]
Referrence: https://sourceware.org/binutils/docs/as/AArch64_002dRelocations.html
'전공공부 > ARM' 카테고리의 다른 글
[ARM] Alignment가 무엇인가?! (0) | 2019.02.17 |
---|---|
[링커스크립트] 지시어 ENTRY (0) | 2019.02.12 |
GICv3 LPI, ITS (0) | 2018.07.18 |
interrupt status - level sensitive (0) | 2018.07.17 |
ARMv8 HPPIR/IAR, AHPPIR/AIAR (0) | 2018.03.27 |