Skip to content

[RISC‐V 64] 2. plthook.S 구현 (진행 예정)

최기철 edited this page Aug 27, 2023 · 1 revision

1. plthook.S를 구현 및 분석 하기 전 필요한 지식

1-1. ??????????????????????????????????????

  • Heap은 동적으로 메모리 공간을 할당받을 때 사용되는 영역이기 때문에 런타임 시점(프로그램이 실행되고 있는 중)에 결정되며, Stack은 함수 호출시 주어지는 인자와 지역 변수가 저장되는 영역이기 때문에 컴파일 시점에 결정된다.
  • 프로세스 메모리 구조 내부의 Stack은 자료구조에서 배웠던 Stack과 동일하게 동작하며, 다만 위에서 아래로 자란다는 점만 다르다.

2. aarch64의 plthook.S 분석

2-1. 인자 저장 및 복원 어셈블리 코드

  • 여기서도 함수가 호출되기 전 시점에 인자를 저장하고 복원해야 하기 때문에, 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

2-2. plt_hooker의 첫 시작 부분

  • 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 */
    
      ......

2-3. plthook_entry 호출 부분

  • 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를 이해하기 위해 필요한 지식)