티스토리 뷰
PLT (Procedure Linkage Table) : 외부 라이브러리를 연결해주는 테이블이다. PLT를 통해 다른 라이브러리를 호출해 사용할 수 있다.
GOT (Global Offset Table) : PLT가 참조하는 테이블이다. PLT가 참조하는 주소가 들어있다.
LInker란?
C언어로 짜여진 소스는 컴파일러에 의해 어셈블리로 바뀌고 이것은 어셈블러를 거쳐 object 파일 형태로 변하게 된다. 즉, 이렇게 만들어진 object 파일을 실행파일로 만드는 것이 바로 링커이다. 링커의 작업 과정을 링킹이라고 한다.
링킹 과정을 통해 이처럼 라이브러리 등 필요한 오브젝트 파일들을 연결 시킨다.
링크 방식에는 정적,동적방식이 있다.
먼저 정적 방식은 실행 파일 안에 모든 코드가 포함되기 때문에 라이브러리 연동 과정이 따로 필요 없고, 한 번 생성한 파일에 대해서 필요한 라이브러리를 따로 관리하지 않아도 되기 때문에 편하다는 장점이 있다. 하지만 파일 크기가 커지는 단점이 있고 동일한 라이브러리를 사용하더라도 해당 라이브러리를 사용하는 모든 프로그램들은 라이브러리의 내용을 메모리에 매핑 시켜야 한다.
장점 -> 과정이 간단함.
단점 -> 동적에 비해 경제성이 떨어짐.
동적 방식은 공유라이브러리를 사용한다. 여기서 공유라이브러리란? 라이브러리를 하나의 메모리 공간에 매핑 하고 여러 프로그램에서 공유하여 사용하는 것이다. 실행파일 안에 라이브러리 코드를 포함하지 않으므로, 정적 방식을 사용해 컴파일 했을 때에 비해 파일 크기가 훨씬 작아진다. 실행시에도 상대적으로 적은 메모리를 차지한다. 또한 라이브러리를 따로 업데이트 할 수 있다. 하지만 실행파일이 라이브러리에 의존해야 하기 때문에 라이브러리가 없으면 실행할 수 없다.
장점 -> 경제성이 높음.
단점 -> 라이브러리 의존도가 높음.
Dynamic Link 방식으로 컴파일 하면 라이브러리가 프로그램 외부에 있기 때문에 함수의 주소를 알아오는 과정이 필요한 것입니다. 따라서 plt got를 사용하는것이다.
동적 링크 방식일 때, 함수를 호출 할 때 PLT를 참조하게 된다. PLT에서는 GOT로 점프를 하는데, GOT에 라이브러리에 존재하는 실제 함수의 주소가 쓰여있어서 이 함수를 호출하게 된다. 그런데 이 때, 첫 호출이냐 아니냐에 따라 동작 과정이 조금 달라진다. 두 번째 호출이라면 GOT에 실제 함수의 주소가 쓰여있지만, 첫 번째 호출이라면 GOT에 실제 함수의 주소가 쓰여있지 않다. 그래서 첫 호출 시에는 Linker가 dl_resolve라는 함수를 사용해 필요한 함수의 주소를 알아오고, GOT에 그 주소를 써준 후 해당 함수를 호출한다
.
'Layer 7 과제' 카테고리의 다른 글
ftz level5 풀이 (0) | 2018.06.15 |
---|---|
ftz level4 풀이 (0) | 2018.06.15 |
ftz level3 풀이 (0) | 2018.06.15 |
ftz level2 풀이 (0) | 2018.06.15 |
ftz level1 풀이 (0) | 2018.06.14 |