[1] PLT & GOT
PLT = Procedure Linkage Table
PLT로 말그대로 프로시져 ( 여러가지의 함수들? & 외부 라이브러리? ) 들을 연결한 테이블이라고 이해하면 된다.
우리가 함수를 호출할때, 함수는 바로 호출되지않고 PLT를 통해 GOT를 참조하고, GOT에서 함수의 실제주소에 접근하여 함수가 실행된다.
GOT = Global Offset Table
프로시져의 실제 주소를 가지고있다. PLT가 참조하는 테이블이다.
그림으로 보자. printf함수를 실행한다고 했을때, 일단 PLT로 간다.
여기서 두가지의 경우로 나누어지는데 첫번째경우는 printf함수가 첫번째로 실행되었을 경우이다.
이때는
PLT > GOT > PLT > _dl_runtime_resolve > printf 호출 ㄴ이과정에서 GOT에 다음에 쓸 printf함수 주소 저장
의 순서대로 실행된다.
두번째경우는 printf함수가 위와같은 과정을 거치고 두번째로 실행되었을 경우이다.
이때는
PLT > GOT > printf 호출
의 순서대로 실행된다.
GOT에 이미 printf 함수의 주소가 적혀있기때문에 전보다 간결한 과정으로 함수를 호출한다.
[2] PLT & GOT의 활용
https://sunrinjuntae.tistory.com/27 라이트업도 열심히 써놨으니 읽어보시면 이해하실수 있을거에요.