티스토리 뷰

동적, 정적 라이브러리 차이점에 대해서 알아보기로 하자. 

정적 라이브러리는 프로그램과 같이 컴파일 & 링크 되어 실제 오브젝트 파일 내에 포함 되어서 실행 되는 라이브러리이다. 라이브러리와 프로그램이 합체되기 때문에 정적 라이브러리와 링크 하면 프로그램 용량이 늘어나는 현상을 볼 수 있다. 프로그램과 합체가 되면 속도는 빨라지지만 단점도 생기는데 라이브러리가 업데이트 되었을 때 그 라이브러리를 사용한 프로그램의 업데이트가 쉽지 않다. 이래서 DLL이라고 불리우는 동적 라이브러리가 탄생하게 되었는데 프로그램에 합체 된 정적 라이브러리를 밖으로 꺼내 놓기 시작했다. 이게 바로 동적 라이브러리이다. 이러면 아주 편하게 수정 & 배포를 할 수 있으리라 생각 했겠지만 속도가 느려지는 단점이 있다.

아래 프로그램으로 어떻게 동작하는지, 어떤 동적 라이브러리가 있는지를 들여다 보자. ㅂ면 printf는 glibc에 포함된 동적 라이브러리이다. 이 외에 전역변수도 몇 개 존재한다.

자 이제 nm명령어를 사용하여 어떤 심볼들이 쓰였는지 들여다보자.

숫자     알파벳     심볼명으로 이루어진 것을 볼 수 있다.

숫자는 가상 주소이고, 알파벳은 심볼 특징(?), 마지막은 심볼명을 의미한다.

T : Text 영역(code)
U : 정의 안된 심볼
B : 초기화 안된 데이터(BSS)
D : 초기화 된 데이터
R : Read only data

자 여기서 중요한건 U로 표시된 undefined 심볼이다. 가상 주소도 안 쓰여져 있고...  동적 라이브러리와 관련좀 있는 것으로 추정된다. 그 외에 전역 변수로 지정한 gVal~ 변수들은 B로 되어있는 것을 볼 수 있다. 여기서 gValInit은 0으로 초기화 되어있는데 0으로 초기화 된 것들도 BSS 영역으로 갑니다. 만약 gValInit 변수에 100을 넣으면 D라고 표시된다.

readelf -a 파일명 을 쳐서 더 들여다 보았을 때 Entry Point Address가 나오는데 gdb를 할 때 여기서 뜯어 보면 되겠다. 그리고 좀 더 내려서 Dynamic section 부분으로 내려오면

   Tag                   Type                           Name/Value

0x00000001  (NEEDED)                     Shared library: [libc.so.6]

이런 부분이 보이게 된다. 정적 라이브러리와 다르게 동적 라이브러리는 실행 프로그램에 포함 되는 것이 아니라고 했다. 그러면 정적 라이브러리 같이 합체 되는 것도 아닌데 어떻게 이 프로그램이 동적 라이브러리와 연관이 지어지느냐 답은 이 부분이다. 컴파일러가 "이 프로그램은 이런이런 라이브러리를 사용 합니다." 라고 NEEDED 로 실행 파일에 적어 놓는다. 로더가 "아~ 이 프로그램은 이런 라이브러리를 사용하는군..." 이라고 생각하게 되고 이 정보를 어떻게든 참고해서 프로그램 런타임시에 사용될 것이라고 생각된다.


다른 분꺼 보면서 공부할 때도 상당히 버벅 거렸는데 정리하면서도 버벅거린다... 암튼 이번 편은 여기까지 하는 걸로...

'System > PLT&GOT' 카테고리의 다른 글

GOT Overwrite - 1  (0) 2012.09.14
PLT, GOT  (0) 2012.08.30
PLT&GOT에 대해서...  (0) 2012.08.30
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함