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

+ Recent posts