2010-12-09 4 views

답변

5

그들은 실제로 특별히 오래된 링커와 매우 다르다.

.o 만 (또는 .OBJ) 파일은 컴파일러 생성 된 코드의 출력을 포함하고, 오브젝트 파일이다. 그것은 여전히 ​​중간 형식입니다. 예를 들어, 대부분의 참조는 아직 해결되지 않았습니다. 일반적으로 소스 파일과 오브젝트 파일간에 일대일 매핑이 있습니다.

.A (또는 .LIB) 파일은 라이브러리로 알려진 아카이브, 그리고 오브젝트 파일의 집합입니다.

모든 운영 체제에는 개체 파일을 라이브러리 파일에 추가/제거/나열 할 수있는 도구가 있습니다.

또 다른 차이점은 특히 이전 링커의 경우 파일을 연결할 때 파일을 처리하는 방법이 다르다는 점입니다. 일부 링크는 라이브러리 파일에서 유용한 정보 만 추출하는 동안 실제로 사용되는 것과 관계없이 완전한 개체 파일을 최종 이진 파일에 배치합니다.

요즘 대부분의 링커는 사용되지 않는 모든 것을 제거 할만큼 똑똑합니다.

+1

마지막 문장은 크게 거짓입니다. –

+0

마지막 두 단락은 false입니다. 이런 일이 표준화되기 전에 1960 년 이전의 링커에 대해 이야기하지 않는 한. –

9

개념적으로 컴파일 단위 (소스 파일/오브젝트 파일의 코드의 단위)의 전부 또는 전혀 연결되어 하나. 컴파일러와 링커간에 상당한 수준의 협업이 구현 된 링크는 링크시 오브젝트 파일에서 사용되지 않는 코드를 제거 할 수 있지만 프로그램에서 충돌하는 심볼 이름을 가진 2 개의 컴파일 단위를 포함하는 문제는 변경되지 않습니다. 오류.

실용적인 예로, 라이브러리에 두 개의 함수 foobar이 있고 그것들이 함께 오브젝트 파일에 있다고 가정합니다. bar을 사용하고 싶지만 내 프로그램에 이미 foo이라는 외부 심볼이 있으면 오류가 발생합니다. 구현이 나를 위해이 문제를 해결할 수있을지라도 코드는 여전히 올바르지 않습니다. 나는 두 개의 별도의 오브젝트 파일, foo 하나와 bar와 다른를 포함하는 라이브러리 파일이있는 경우 반면에

은, bar를 포함하는 단지 하나 내 프로그램에 들어갔습니다 얻을 것이다.

라이브러리를 작성할 때, 당신은 그들이 함께 사용하는 것이 필수적하지 않는 한 동일한 개체 파일에 여러 기능을 포함하지 않도록해야합니다. 그렇게하면 라이브러리를 링크 (정적으로)하고 심볼 충돌의 가능성을 높이는 응용 프로그램을 부풀게 만듭니다. 의심이있을 때 개인적으로는 별도의 파일의 측면에 죄를 범 선호 - 후자는 당기는 피할 수 foo_free를 호출 할 필요가 없습니다 그래서 짧은 일회성 프로그램 사소하지 않은 경우는 별도의 파일에 foo_createfoo_free을 넣어에도 유용 깊은 해방을위한 코드 (심지어는 free 자체의 구현을 피하는 것조차도).

관련 문제