2013-07-17 2 views
3

정적 라이브러리에 연결하고있어 llvm/Clang에서 죽은 코드를 제거하는 방법을 알아야합니다. 나는 Clang이 -Wl, --gc-section 또는 -dead_strip과 같은 것을 가지고 있음을 암시하는 어떠한 문서도 찾을 수 없다.정적 연결 중 죽은 코드를 제거하는 Clang (-Wl, --gc-sections에 해당하는 gcc와 동일)

더 높은 최적화 수준에서 일부 데드 코드 제거가 자동으로 수행된다고 가정하지만 gcc에서도 마찬가지입니다. 맞습니까? 그러나 gcc는 위에서 언급 한 플래그를 통해 이에 대한 명시적인 제어를 제공합니다. Clang이 그걸 제공하지 않습니까, 아니면 제가 빠진 것이 있습니까?

(시스템이 OSX이다)

답변

5

데드 스트리핑 링커 기능하지 컴파일러 기능이다. 결과적으로 gcc 나 clang도 그걸 가지고 있지 않습니다. 그래서 -Wl을 사용해야합니다.이 플래그를 링커에 전달하고 있습니다. Mac OS X 링커는 -dead_strip을 사용합니다. clang 호출에 플래그를 직접 전달할 수 있으며 자동으로 전달됩니다.

+0

'-fdce'는 아마도 컴파일러에 의해 각 함수 내에서 수행되는 유사한 최적화를 가리킬 것입니다. 컴파일러가 개별 기본 블록이 작동하지 않는다는 것을 증명할 수있는 것은 매우 일반적인 일입니다. – zwol

+0

예, 분명히 밝혀지지 않아서 죄송합니다. 필자의 "최적화 수준 인수"는 -fdce를 가리키며 링커가 아니라 컴파일러가 실행한다고 생각했습니다. 하지만 답장을 보내 주셔서 감사합니다. dead_strip은 링커에 전달하는 명령이며 실제로 바이너리의 크기를 줄였습니다 (gcc의 맨 페이지에 문서화되어 있지만 clang이 아니라고 생각합니다.) ld의 맨 페이지에서는 컴파일러 매뉴얼에 플래그를 보낼 수있는 것을 포함하기보다는 받아 들인 플래그를 얻을 수 있습니다 :)). – kamjagin