Подтвердить что ты не робот

Что такое ошибка "Неверная инструкция: 4" и почему "-mmacosx-version-min = 10.x" исправить?

Я получаю ошибки Illegal Instruction: 4 с двоичными файлами, скомпилированными с GCC 4.7.2 в Mac OS X 10.8.2 ( "Горный лев" ), когда эти двоичные файлы запускаются под 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-битные бинарные файлы? Есть ли ошибки с таким подходом, о котором я должен знать? Непреднамеренные побочные эффекты и т.д.)

4b9b3361

Ответ 1

Из Apple Developer Forum (требуется учетная запись):

"Компилятор и компоновщик способны использовать функции и выполнять оптимизации, которые не работают на более старых версиях ОС. -mmacosx-version-min сообщает инструментам, какие версии ОС вам нужно для работы, поэтому инструменты могут отключать оптимизации, которые не будут запускайте эти версии ОС. Если вам нужно запускать более старые версии ОС, вы должны использовать этот флаг.

" Недостатком -mmacosx-version-min является то, что производительность приложения может быть хуже на более новых версиях ОС, чем это могло бы быть, если бы не требовалось быть обратно совместимым. В большинстве случаев различия незначительны".

Ответ 2

Сообщение "незаконная инструкция" просто сообщает вам, что ваши двоичные файлы содержат инструкции, которые версия ОС, которую вы пытаетесь запустить, не понимает. Я не могу дать точный смысл 4, но я ожидаю, что это будет внутренним для Apple.

В противном случае взгляните на них... они немного старые, но, вероятно, расскажут вам, что вам нужно знать

Как работает 64-битный код на OS-X 10.5?
что подразумевается в macosx-version-min?

Ответ 3

Я сознательно пишу этот ответ на старый вопрос с этим в виду, потому что другие ответы мне не помогли.

Я получил Illegal Instruction: 4 при запуске двоичного файла в той же системе, на которой я ее скомпилировал, поэтому -mmacosx-version-min не помогло.

Я использовал gcc в Code Blocks 16 в Mac OS X 10.11.

Однако при отключении всех флагов компилятора Code Blocks для оптимизации. Посмотрите на все флаги, установленные в блоке Code Block (щелкните правой кнопкой мыши Project → "Build Properties" ) и отключите все флаги, которые вам абсолютно не нужны, особенно -s и флаги -O для оптимизации, Это сделало это для меня.

Ответ 4

Я обнаружил, что моя проблема была неправильной if (leaf = NULL) {...}
где он должен был быть if (leaf == NULL){...}

Проверьте эти предупреждения компилятора!

Ответ 5

Я получил эту ошибку при попытке собрать с Xcode 10. Кажется, это ошибка в компиляторе Swift. Whole Module Optimization, решает проблему: https://forums.swift.org/t/illegal-instruction-4-when-try-to-compile-project/16118.

Это не идеальное решение, я буду продолжать использовать Xcode 9.4.1, пока эта проблема не будет решена.

Ответ 6

Недавно я получил эту ошибку. Я скомпилировал двоичный код с -O3. Google сказал мне, что это означает "незаконный код операции", который казался мне подозрительным. Затем я отключил все оптимизации и повторил. Теперь ошибка превратилась в segfault. Следовательно, установив -g и запустив valgrind, я отследил источник и зафиксировал его. Повторное использование всех оптимизаций не показало никаких дальнейших проявлений незаконной инструкции 4.

По-видимому, оптимизация неправильного кода может дать странные результаты.

Ответ 7

В моем случае я получил это при перегрузке

ostream & operator << (ostream &out, const MyClass &obj)

и забыл вернуться out. В других системах это просто генерирует предупреждение, но в macos также выдает ошибку (хотя, похоже, она печатается правильно).

Ошибка была устранена путем добавления правильного возвращаемого значения. В моем случае добавление -mmacosx-version-min не -mmacosx-version-min эффекта.