ELF 의 PLT, GOT 그리고 동적라이브러리에대한 질문
안녕하세요
요즘들어 제가 알고있는 리눅스 동적라이브러리에 대해 혼란이 생겨 질문드립니다
잘못 알고있는 부분 있으면 지적과 정정 부탁드립니다
1. 정적라이브러리를 사용하는 바이너리
gcc 에서 -static 옵션으로 컴파일한 ELF 바이너리로서 사용하는 라이브러리의 코드가
파일상에 박혀있고 로더에 의해 메모리에 로드될때 고정된 가상메모리 위치에 전부 매핑된다.
PLT, GOT 가 필요없다(근데 readelf 로 보면 섹션이 나오는데 왜있는지 모르겠다)
장점 : 라이브러리 의존성등의 문제가 단순해짐. 라이브러리 사용속도가 빠름
단점 : 파일사이즈가 커짐. 메모리상에 올라갔을때도 다른 코드들과 라이브러리 공유를 못함. 라이브러리 수정하려면 재컴파일해야됨
2. 동적라이브러리를 사용하는 바이너리
gcc 에서 기본적으로 컴파일한 ELF 바이너리.
파일상에 라이브러리 코드가 없고, 로더에 의해서 메모리에 프로그램이 적재되어도
메모리상에 라이브러리 코드가 없음. 라이브러리 호출하는 함수들은 모두 PLT 로 점프하게 되어있음
최초로 라이브러리 함수를 호출하면 그때 동적링커함수를 호출하면서 동적링커에게
자신이 호출하고싶은 라이브러리 함수가 뭔지를 알려주면(어떻게 알려주는지느 잘모름... 궁금함) 동적링커함수가
그제서야 파일시스템 상에서 해당 라이브러리파일을 메모리에 매핑시키고 GOT 상에
주소를 채워넣음.
장단점 -> 정적라이브러리 쓰는경우와 반대
3. 궁금한점.
libc.so 같은경우 그 속에 1000개의 라이브러리 함수가 있다고 가정합시다.
그런데 프로램은 단지 그중에 1개의 함수만 사용하려한다면 libc.so 의 모든 1000개의 함수들을
가상메모리에 매핑시키는건 비효율적인거 아닐까요?
실제로 리눅스에서는 libc 라이브러리 내의 어떠한 함수에 대한 참조라도 이루어지면
그시점에서 1000개의 함수가 모두 메모리에 매핑되나요?
4. ASLR 은 동적라이브러리들을 프로그램이 실행될때마다 다른 위치에 매핑하는 기법입니다
그런데 이것이 libc 파일 전체를 매핑하는 위치가 랜덤인건가요? 아니면 libc 내의 모든
함수 하나하나의 위치가 제각각 랜덤인건가요?
ASLR 을 위해서 사용되는 randomness 는 어떻게 얻어지나요?
/dev/urandom 을 이용할까요?
좋은답변 기대해봅니다~
댓글 달기