출처 : http://www.lurklurk.org/linkers/linkers.html
c/c++ programmer 가 알아두면 좋을 linker 의 동작이다.
자세한 이야기는 "출처" 를 읽어보자.
staic library의 linking 하는 방법
undefined reference 가 있으면, 이 undefined reference 의 definition 이 있는 object 를 찾아서 executable 에 더하게 된다. 만약 추가한 object 에 또 undefined reference 가 있다면, 또 object 를 찾아서 executable 에 추가한다. 만약 lib.a 가 있는데, 이 library 는 a.o/b.o/c.o 3개의 object 로 이뤄져 있다고 해보자. lib.a 를 link 시킬 때 이 3개의 object 들이 모두 executable 안에 포함되는 것이 아니고, executable 에서 필요한(사용되는) definition 이 있는 object 만 포함되게 된다.
shared library의 linking(.so / dll / .dylib)
undefined reference 의 definition 을 shared library 가 가지고 있다면, linker 는 "symbol 의 이름"과 "어떤 library 가 definition 을 가졌는지"를 executable 에 기록한다. 그러면 이 부분에 대한 linking 작업과 나머지 linking 과 관련된 일들은 executable 이 실행되는 동안에 OS 가 대신 해 준다. 즉 library 에서 관련된 code 를 가져와 준다.( 이것은 마지막 연결(final link) 만 지연(defer) 시키는 것이라서 dynamic linking 과는 다르다.)
static library 는 undefined symbol 을 가진 object 만 program 의 address 로 가져오는데 반해, shared library 의 특정 symbol 이 사용되면(예를 들어 printf 같은), 이 symbol 을 갖고 있는 shared library 를 전부 program 의 address 에 mapping 시킨다.
shared library 의 code segment 는 여러 process 에게 공유된다.
data/bss segment 는 아니다.
그러기 위해서는 whole library 는 하나의 memory 에 mapping 되어야 한다.
댓글 없음:
댓글 쓰기