2013-07-27 7 views
5

마지막 이미지를 만들기 전에 개체 파일의 재배치를 해결하는 동안 링커에서 정확히 수행 한 단계는 무엇입니까? 보다 구체적으로 말하면 링커는 재배치 사이트에 이미 저장된 값을 어떻게 처리합니까? 최종 VA/RVA에 항상 추가합니까, 때로는 무시됩니까 (예 : 특정 재배치 유형)? "COFF 개체 (이미지가 아님) 파일에서 재배치가 수행되는 방법

는 MS COFF 사양에
  1. , 장 5.6.2 :

    나는 MS PE/COFF Specfication에 대한 명확한 설명을 찾을 수 없습니다, 그리고 인터넷 검색을 잠시 동안 실험 한 후, 모두가 내가 알 수있는 것은이 있었다 기본 재배치 타입 "이라면"기본 재배치는 모든 32 비트의 차이를 오프셋의 32 비트 필드에 적용합니다 "라고 말합니다. 재배치는 이미 지정된 오프셋에 저장된 모든 주소를 고려해야한다는 것을 의미합니다 . 그러나 5.6 장 (.reloc 섹션)은 이미지 파일에만 관련되며 오브젝트 파일에는 해당되지 않습니다.

  2. 재배치 테이블을 인쇄 할 때 dumpbin 유틸리티는 "Applied To"라는 열을 추가합니다.이 열은 재배치 사이트에 저장된 값을 항상 포함하는 것으로 보입니다.
  3. Relocation Directives chapter in the DJGPP COFF Specification에는 현재 위치에 저장된 값을 재배치 테이블 항목이 가리키는 심볼의 주소에 추가해야한다는 내용이 명확하게 명시되어 있습니다.

링커에서 재배치를 처리하는 방법을 설명하는 문서를 참조 할 수 있습니까?

+0

개체 파일 4.2 "COFF Relocations"에 해당하는 섹션이 아니고 이미지 파일 전용 5.6.2 섹션이 아닙니까? – legalize

+0

재배치 사이트가 0에 저장된 값과 다른 값을 가지면 실제로 수행해야 할 작업은 4.2 절에 설명되어 있지 않습니다. 실제로는 매우 일반적이며 dumpbin을 사용하여 쉽게 볼 수 있습니다. – user2625389

답변

5

"이미지 파일"에 사용 된 재배치 섹션은 "개체 파일"에있는 재배치 정보와 약간 다른 목적을 가지고 있습니다.

Linux 공유 라이브러리와 달리 Windows DLL은 일반적으로 위치 독립적 코드를 사용하지 않습니다. 대신 고정 주소를 기준으로 정의됩니다. 그러나 Windows 로더는 충돌이 발생할 경우 DLL을 재배치 할 수 있습니다. 이를 지원하기 위해 DLL 이미지에는 이미지를 재배치 할 때 수정해야 할 데이터를 지정하는 재배치 섹션이 있습니다. 많은 인트라 dll 기호 참조는 "eip"(또는 rip) 상대 주소 지정을 사용하므로 DLL 재배치시 수정하지 않아도됩니다.

이미지 파일 재배치는 항상 실행 가능 이미지의 기본 주소를 기준으로 지정됩니다. 객체 파일 재배치는 기호 테이블의 기호에 대한 주소 (이미지 내에서 이미지 기반 기본 주소 사용)를 기준으로 지정됩니다. 이미지 파일에는 심볼 테이블이 없습니다 (IAT가 있지만 심볼 테이블이 아닙니다). 오브젝트 파일에서 지원되는 재배치 세트는 이미지 파일에서 지원되는 세트보다 풍부합니다.

자세한 내용은 PE/COFF 사양의 "COFF Relocations (Object Only)"섹션에서 자세히 설명합니다 (입력시 버전 3이 나옵니다).