문제

나는 항상 링커의 작동 방식에 대해 혼란 스러웠으며 검색하기가 어려운 주제입니다.

내 질문을 보여주고 답을위한 프레임 워크를 제공하기 위해, 나는 지금까지 내가 알고있는 것을 내려 놓을 것입니다. 나는 매우 잘못 될 수 있습니다. :)

먼저, 각 .cpp 파일은 중간 파일 (posix/elf의 경우 .o, win/pe의 경우 .obj)에 내장되어 있습니다. 이 중간 파일에는 .CPP로 정의 된 모든 기호가 포함되어 있으며 제대로 해결 해야하는 외부 링크에 대한 지침이 있습니다. 이에 대한 확장으로 Posix 시스템을 사용하면 .o 파일을 .A 파일로 결합 할 수 있습니다 (결합하는 것 이상의 작업을 수행하지 않는 것 같습니까? 어떤 명령을합니까?). .lib win/pe는 posix .A 파일과 동일합니까?

다음으로, 중간 파일은 함께 연결되고 외부 종속성이 해결되며 실행 파일이 있습니다. 단계를 놓치고 있습니까?

감사!

도움이 되었습니까?

해결책

퍼즐 몇 가지가 있습니다.

  • AR (1)은 .A 파일을 작성하는 데 사용됩니다. tar (1) 또는 zip 파일과 유사합니다 (아마도 상징 이름별로 개체 파일을 찾을 수있는 색인이있을 수 있음).
  • 링커는 객체 파일 (텍스트, 데이터, BSS)의 섹션을 함께 복사합니다. GNU LD의 경우 섹션의 정확한 복사는 링커 스크립트로 제어 할 수 있습니다 (예 : 이름에 "텍스트"가 포함 된 .O 파일의 모든 섹션을 단일 텍스트 섹션으로 복사).
  • 링커는 또한 재배치를 수행합니다. 기호의 값이 알려지면 각 대상 주소와 함께 패치 지침 (점프 및 데이터로드)을 수행합니다. 경우에 따라 링크 시간에이를 수행 할 수 없으므로 링커는 .o 파일에서 재배치 레코드를 최종 실행 파일로 복사/조정합니다.
  • Windows .lib는 두 가지 목적을 제공합니다. 정적 라이브러리 (.lib)는 .a 라이브러리와 유사합니다. 가져 오기 라이브러리 (.lib)에는 실제 코드가 없지만 심볼 목록 만 포함되어 있습니다. 링커는 가져 오기 라이브러리에서 기호를 해결할 수 있지만 해당 .dll을 실행 파일에 참조해야한다는 것을 알고 있습니다. UNIX/ELF에서 .SO 파일에는 코드와 기호 테이블이 모두 있습니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top