2017-09-08 11 views
5

Windows에서 MinGW를 사용하여 Clang을 대상 삼중 x86_64-w64-windows-gnu로 빌드했습니다. 실행 파일 clang.exe와 clang ++. exe는 릴리스 모드에서 컴파일하면 (오류없이 프로그램을 컴파일 할 때) 예상대로 작동하지만, 디버그 모드로 빌드 할 때 나는 실행할 수없고 this error을 얻을 수 없습니다. - "이 응용 프로그램은 PC ". clang-check.exe와 같은 빌드의 다른 실행 파일은이 오류를 표시하지 않고 올바르게 실행합니다.Windows 10에서 MinGW로 빌드 된 Clang의 디버그 빌드를 실행할 수 없습니다.

clang.exe 및 clang ++. exe 파일 크기가> 2GB인데 반해 다른 실행 파일은 더 작지만 파일 크기 제한은 64KB입니다. -bit Windows는 4GB입니다.

비슷한 문제가있는 사람이 있습니까? 파일 크기가 문제라면, 실행 파일의 크기를 줄이기 위해 LLVM에 디버그 기호를 별도의 파일로 저장하도록 할 수 있습니까?

EDIT : LLVM을 빌드 할 때 -gsplit-dwarf 플래그를 사용하여 디버그 기호를 별도의 파일로 덤프하여 실행 파일 크기를 줄이려고했지만 아무런 효과가 없습니다.

답변

4

예, 파일 크기가이 문제를 발생시키는 데 도움이됩니다. IMAGE_OPTIONAL_HEADER64.SizeOfImage field은 최대 4GB 크기를 제안하는 DWORD입니다. 그러나 OS 로더는 전체 .exe 또는 .dll 파일을 메모리 매핑 파일로 메모리에 매핑합니다. MMF의보기는 2GB보다 클 수 없습니다. 이는 기술적 인 기술적 인 제한 사항이며 x64에도 적용됩니다. this post에서이 문제에 대해 자세히 알아보십시오.

디버그 정보가 의심 할 여지없이 이미지 파일이 너무 심하게 폭발하는 이유입니다. 비교를 위해 VS2017에 포함 된 clang 빌드에는 프런트 엔드의 경우 27MB, x64 백 엔드의 경우 32MB가 필요합니다.

분열은 GCC 4.7에서 구현되며, objcopy의 및 금 링커의 최신 버전에서 지원이 필요합니다 -gsplit - 난쟁이가 해결할 수없는 이유는 문제는 this project page에서 볼 수 있습니다.

MinGW는 금 링커를 제공 할 수 없습니다. ELF 이미지 만 생성 할 수 있으므로 포팅을 시도하지 않았습니다. 냉담한 사실, 당신이 MinGW에 의존하는 한 당신은 좋은 외륜이없는 작은 산의 위입니다.

과감한 뭔가가 필요합니다. 나는 주저없이 Cygwin을 언급 할 것이다. Clang을 사용하여 Clang을 빌드하는 것과 같은 다른 컴파일러를 고려하십시오. 또는 MSVC++. 커뮤니티 에디션은 무료로 다운로드 할 수 있습니다. 또한 Clang port을 살펴보아야하며 ABI와 호환되도록 많은 작업을 수행했습니다.

+0

감사합니다. 제한 사항은 파일 크기 때문이며 다른 내용이 아님을 알아두면 좋습니다. LLD 링커가 디버그 기호를 별도의 파일로 분리 할 수 ​​있는지 알고 있습니까? 불행히도 오픈 소스 헤더를 사용해야 할 때 처음에는 MinGW를 사용하여 Clang을 구축했지만, -DCMAKE_LINKER 플래그를 사용하여 디버그 기호로 Clang을 빌드 할 때 LLD를 사용하여 링크 할 수 있어야합니다. – ed95