2009-12-02 3 views

답변

68

currently accepted answer은 다소 불완전합니다.

COMDAT 섹션의 목적은 "중복"섹션을 여러 개체 파일에 정의 할 수있게하는 것입니다. 일반적으로 동일한 심볼이 여러 객체 파일에 정의되어 있으면 링커에서 오류를보고합니다. 이로 인해 템플릿과 같은 일부 C++ 언어 기능에서 다른 cpp 파일의 동일한 기호를 인스턴스화 할 수있는 문제가 발생할 수 있습니다.

COMDAT 섹션은이 문제를 해결하는 데 사용됩니다. 섹션이 오브젝트 파일에서 COMDAT로 표시되면 충돌을 해결하는 방법을 나타내는 플래그도 지정합니다. "당신이 좋아하는 사람을 선택하십시오", "모든 사람들이 같은 크기인지 확인하십시오.", "모든 사람들이 똑같은 내용을 가지고 있는지 확인하십시오.", "가장 큰 것을 선택하십시오."등 여러 가지 옵션이 있습니다. 완전한 목록을위한 COFF spec.

어떤 경우 든 currently accepted answer과 달리, COMDAT 섹션의 내용이 무엇인지에 대한 요구 사항은 없습니다. 하나의 프로 시저, 많은 프로 시저, 데이터 또는 코드와 데이터의 조합을 포함 할 수 있습니다.

5

/Gy 옵션은 릴리스 빌드에 사용하는 것이 좋습니다. 왜냐하면 모든 함수가 자신의 섹션을 가지고 있기 때문에 링커는 사용되지 않는 모든 코드를 삭제할 수 있습니다. /Gy 옵션을 지정하지 않으면 다음과 같이 표시됩니다. "a.cpp"는 3 개의 함수를 정의하고 컴파일러는 컴파일 할 때 컴파일러를 하나의 코드 섹션에 넣습니다. "main.cpp"는 "a.cpp"의 함수 하나만 사용하지만 "a.cpp"의 모든 함수를 링크 할 때 (두 개는 부담으로 연결됩니다). 그리고 모든 함수가 자신의 섹션을 가지고 있다면 링커는 "main.cpp"에 필요한 함수를 포함하는 함수 하나만 선택할 수 있습니다. /Gy 옵션없이 컴파일하는 것은 디버그 빌드에 적합합니다. 클래스를 컴파일 할 때 클래스의 메소드는 모두 기본적으로 자체 섹션을 가져옵니다.

+3

이것은 오래되었지만 누구에게나 정보입니다. 링커가 작동하는 방식이 아닙니다. 참조되지 않은 함수를 제어하는 ​​완전히 다른 스위치가 있습니다 :/OPT : REF (최적화 -> 참조 : 예). 동일한 기능,/OPT : ICF를 병합하는 또 다른 기능이 있습니다. ICF는/Gy에서만 작동하지만 REF는/Gy와 함께 작동하거나 작동하지 않습니다. – SilverbackNet

관련 문제