링커가 모든 심볼을 해석하고 나면, 심볼 참조는 오직 하나의 심볼 정의만을 가지게 된다. 그 때, 링커는 아래 두 스텝으로 구성된 재배치 작업을 하게 된다.

 - 섹션과 심볼정의들을 재배치 한다. 링커는 같은 타입의 모든 섹션들을 새로운 하나의 섹션으로 통합한다. 예로 들면, 링커는 입력으로 받은 모든 재배치 가능한 오브젝트 파일들의 .data 섹션을 합쳐 하나의 .data 섹션을 만든다. 같은 과정이 .code에 대해서도 행해진다. 그런 후에 링커는 병합된 새로운 섹션과, 병합된 새로운 색션내의 각 색션, 그리고 모든 심볼들에 대해 런-타임 메모리 주소를 할당한다. 이러한 작업 후에는 프로그램의 모든 코드와 전역 변수들은 고유한 로드-타임 주소를 가지게 된다.

 - 섹션들안에 있는 심볼의 참조를 재배치 한다. 이 과정에서,  링커는 코드와 데이터 섹션에 있는 모든 심볼 참조를 수정하여, 그것들이 올바른 로드-타임 주소를 가지게 한다.


 어셈블러가 해석 안 된 심볼들을 만날 때마다, 어셈블러는 오브젝트 파일의 .rel.text / .rel.data 섹션에 해석 안 된 심볼들을 위한 재배치 항목을 생성한다. 이러한 재배치 항목은 해석 안된 심볼들이 어떻게 해석되어야 하는지에 대한 정보들을 담고 있다. 전형적인 ELF 재배치 항목은 다음과 같은 멤버들로 구성된다.

 -  옵셋, 재배치 되어질 필요가 있는 심볼 참조의 섹션내에서의 옵셋을 나타내며, 혹은 디스크의 저장공간이 오브젝트 파일 내에서 재배치 되어질 필요가 있을 시, 이 값은 재배치 될 필요가 있는 디스크의 섹션의 처음부터 바이트 단위로 얼마만큼 떨어져 있는가를 나타낸다.

 -  심볼, 이것은 심볼 테이블에서의 인덱스로서, 아직 해석 안 된 심볼이 심볼 테이블에서 몇 번째 위치에 있는가를 나타낸다.

 -  타입, 재배치 타입, 일반적으로 R_386_PC32는 S+A-P로 계산하며, R_386_32는 S+A로 계산한다. 이 계산에서, S는 재배치 항목의 심볼 항목에 들어있는 값을 가리키며, P는 섹션 옵셋 혹은 재배치 되는 저장장치의 주소를 나타낸다. 그리고 A는 재배치 가능한 필드를 계산하는데 필요한 주소이다.

출 처 :  http://wiki.kldp.org/wiki.php/DocbookSgml/LinkerLoader-TRANS 


+ Recent posts