"Illegal Instruction : 4"오류는 무엇이며 "-mmacosx-version-min = 10.x"로 해결되는 이유는 무엇입니까?
내가 얻을 Illegal Instruction: 4그 바이너리가 맥 OS X 10.7.x ( "사자") 및 이전 버전에서 실행되는 맥 OS X 10.8.2 ( "산 사자")에서 GCC 4.7.2로 컴파일 된 바이너리와 오류를. 바이너리는 Mac OS X 10.8.x에서 제대로 작동합니다.
나는 -mmacosx-version-min=10.5내 컴파일 플래그에 추가 했고 이것은 10.5.x, 10.6.x 및 10.7.x 클라이언트의 문제를 해결하는 데 도움이되는 것 같습니다.
내 질문에 대한 정보 :
Illegal Instruction: 4오류 는 무엇입니까 ?- 이상 클라이언트
-mmacosx-version-min=10.x에서이 특정 오류를 수정하는 이유는 무엇10.x입니까?
이 수정 사항을 메이크 파일에 적용하고 싶지만 방아쇠를 당기기 전에 어떤 작업을하는지 알고 싶습니다. (더 큰 바이너리가 있습니까? 여전히 64 비트 바이너리가 있습니까?이 접근 방식에 대해 알아야 할 문제가 있습니까? 의도하지 않은 부작용? 등)
로부터 애플 개발자 포럼 (계정 필요) :
"컴파일러와 링커는 이전 OS 버전에서 작동하지 않는 기능을 사용하고 최적화를 수행 할 수 있습니다.
-mmacosx-version-min작업해야하는 OS 버전을 도구에 알려주므로 도구가 해당 OS 버전에서 실행되지 않는 최적화를 비활성화 할 수 있습니다. 이전 OS 버전에서 실행해야하는 경우이 플래그를 사용해야합니다."단점
-mmacosx-version-min은 앱의 성능이 최신 OS 버전에서 더 나빠질 수 있다는 것입니다. 이전 버전과 호환 될 필요가 없다면 그럴 수도 있습니다. 대부분의 경우 차이는 작습니다."
"불법 지침"메시지는 바이너리에 실행하려는 OS 버전이 이해할 수없는 지침이 포함되어 있음을 나타냅니다. 정확한 의미를 4말할 수 는 없지만 그것이 Apple 내부에 있다고 생각합니다.
그렇지 않으면 이것들을보세요 ... 그들은 조금 오래되었지만 당신이 알아야 할 것을 당신에게 말할 것입니다
64 비트 코드는 OS-X 10.5에서 어떻게 작동합니까?
macosx-version-min은 무엇을 의미합니까?
다른 답변이 저에게 도움이되지 않았기 때문에 저는 이것을 염두에두고 오래된 질문에 대한이 답변을 의식적으로 쓰고 있습니다.
나는 Illegal Instruction: 4그것을 컴파일 한 동일한 시스템에서 바이너리를 실행 하는 동안 얻었 -mmacosx-version-min으므로 도움이되지 않았습니다.
Mac OS X 10.11의 Code Blocks 16에서 gcc를 사용하고있었습니다.
그러나 최적화를 위해 코드 블록의 모든 컴파일러 플래그를 끄는 것이 작동했습니다. 플래그 코드 블록 세트 모두 봐 그래서 (프로젝트를 마우스 오른쪽 버튼으로 클릭 -> "빌드 속성") 특히 당신이 당신이 필요하지 않은 모든 플래그를 해제 -s하고, -O최적화를위한 플래그. 그것은 나를 위해 해냈습니다.
내 문제가
if (leaf = NULL) {...}
있어야 할 곳이 부적절하다는 것을 알았습니다.
if (leaf == NULL){...}
컴파일러 경고를 확인하십시오!
Xcode 10으로 빌드하려고 할 때이 오류가 발생했습니다. Swift 컴파일러의 버그 인 것 같습니다. Whole Module Optimizationon으로 빌드 하면 문제 해결 : https://forums.swift.org/t/illegal-instruction-4-when-trying-to-compile-project/16118
이것은 이상적인 솔루션이 아닙니다.이 문제가 해결 될 때까지 Xcode 9.4.1을 계속 사용할 것입니다.
제 경우에는 과부하 중에 이것을 얻었습니다.
ostream & operator << (ostream &out, const MyClass &obj)
그리고 반환하는 것을 잊었습니다 out. 다른 시스템에서는 경고 만 생성되지만 macOS에서는 오류가 발생했습니다 (올바르게 인쇄되는 것처럼 보임).
올바른 반환 값을 추가하여 오류가 해결되었습니다. 제 경우에는 -mmacosx-version-min플래그를 추가해도 효과가 없었습니다.
최근에이 오류가 발생했습니다. 바이너리를 -O3로 컴파일했습니다. 구글은 이것이 "불법적 인 opcode"를 의미한다고 내게 말했다. 그런 다음 모든 최적화를 해제하고 다시 실행했습니다. 이제 오류가 segfault로 변환되었습니다. 따라서 -g를 설정하고 valgrind를 실행하여 소스를 추적하고 수정했습니다. 모든 최적화를 다시 활성화해도 더 이상 불법 명령이 나타나지 않았습니다 .4.
분명히 잘못된 코드를 최적화하면 이상한 결과가 나올 수 있습니다.
'Program Club' 카테고리의 다른 글
| rxJS의 파이프는 무엇입니까? (0) | 2020.11.28 |
|---|---|
| 왜 JPG가 아닌 PNG를 사용해야합니까? (0) | 2020.11.28 |
| dockerfile 변경시 Docker 업데이트 이미지 (0) | 2020.11.28 |
| 일부 Java 라이브러리 메서드가 거의 동일한 서명을 가진 네이티브 메서드에 위임하는 이유는 무엇입니까? (0) | 2020.11.28 |
| Entity Framework CodeFirst를 사용하여 데이터베이스를 시드하려면 어떻게해야합니까? (0) | 2020.11.28 |