Что такое ошибка "Недопустимая инструкция: 4" и почему "-mmacosx-version-min=10.x" исправляет ее?
Я получил Illegal Instruction: 4
ошибки с двоичными файлами, скомпилированными с GCC 4.7.2 под Mac OS X 10.8.2 ("Mountain Lion"), когда эти двоичные файлы работают под Mac OS X 10.7.x ("Lion") и более ранними версиями. Двоичные файлы работают правильно в 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
а большие клиенты?
Я хотел бы применить это исправление к моим make-файлам, но хотел бы знать, что он делает, прежде чем я нажму на курок. (Будут ли у меня большие двоичные файлы? У меня все еще есть 64-разрядные двоичные файлы? Есть ли какие-либо проблемы с этим подходом, о котором я должен знать? Непреднамеренные побочные эффекты? И т.д.)
6 ответов
На форуме разработчиков Apple (требуется учетная запись):
"Компилятор и компоновщик способны использовать функции и выполнять оптимизации, которые не работают на старых версиях ОС.
-mmacosx-version-min
сообщает инструментам, с какими версиями ОС вам нужно работать, чтобы инструменты могли отключить оптимизации, которые не будут работать на этих версиях ОС. Если вам нужно работать на более старых версиях ОС, используйте этот флаг."Недостаток
-mmacosx-version-min
в том, что производительность приложения на более новых версиях ОС может быть хуже, чем если бы не требовалась обратная совместимость. В большинстве случаев различия невелики ".
Сообщение "недопустимая инструкция" просто говорит вам, что ваши двоичные файлы содержат инструкции, которые не понимает версия ОС, под которой вы пытаетесь их запустить. Я не могу дать вам точное значение 4
но я ожидаю, что это внутреннее для Apple.
В противном случае взгляните на эти... они немного старые, но, вероятно, скажут вам, что вам нужно знать
Как работает 64-битный код на OS-X 10.5?
что означает macosx-version-min?
Я сознательно пишу этот ответ на старый вопрос с учетом этого, потому что другие ответы не помогли мне.
Я получил Illegal Instruction: 4
во время работы двоичного файла в той же системе, на которой я его скомпилировал, так -mmacosx-version-min
не помогло
Я использовал gcc в Code Blocks 16 на Mac OS X 10.11.
Однако отключение всех флагов компилятора Code Blocks для оптимизации работало. Так что посмотрите на все установленные флаги Code Blocks (щелкните правой кнопкой мыши на Project -> "Build Properties") и отключите все флаги, которые вам точно не нужны, особенно -s
и -O
флаги для оптимизации. Это сделало это для меня.
Я обнаружил, что моя проблема была неправильной if (leaf = NULL) {...}
где это должно было быть if (leaf == NULL){...}
Проверьте эти предупреждения компилятора!
Я получил эту ошибку при попытке собрать с Xcode 10. Похоже, это ошибка в компиляторе Swift. Здание с Whole Module Optimization
, решает проблему: 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. Google сказал мне, что это означает "незаконный код операции", который показался мне подозрительным. Затем я отключил все оптимизации и перезапустил. Теперь ошибка преобразуется в segfault. Следовательно, установив -g и запустив valgrind, я отследил источник и исправил его. Повторное включение всех оптимизаций больше не показывало незаконных инструкций 4.
По-видимому, оптимизация неправильного кода может привести к странным результатам.