15

У меня есть приложение, которое существует только в 32-битной версии. Чтобы использовать его, я обычно нажимал 2 и 3 перед загрузкой Mac, чтобы он работал в 32-битном режиме. Однако некоторые приложения (64-битная версия, установленная ранее) всегда будут аварийно завершать работу в этом режиме.

Мне довелось увидеть решение, которое запускает 32-битное приложение в 64-битной системе:

arch -i386 theApp.app

Но я попытался с помощью arch: /Applications/theApp.app isn't executable ошибкой исполняемого файла . Я проверил разрешение файла, и он показал drwxrwxr-x , он должен быть исполняемым, а?
РЕДАКТИРОВАТЬ: Как сказал @ gd1, App.app - это папка (я думаю, в OSX она называется bundle), и поэтому она не является исполняемой.

Но мне все еще нужен обходной путь:
Как правильно запустить 32-разрядное приложение в моей 64-разрядной системе?


РЕДАКТИРОВАТЬ: я могу открыть приложение с arch сейчас с помощью команды (спасибо @GordonDavisson):

arch -i386 /Applications/theApp.app/Contents/MacOS/theApp

Тем не менее, приложение запускается с ошибкой Components lost , журнал показан ниже:

Kjuly@MacBook-Pro:/Applications$ arch -i386 闪讯.app/Contents/MacOS/闪讯 
2012-01-08 16:17:53.381 闪讯[472:1107] isActive: ioctl to kernel socket error 2 ,No such file or directory
2012-01-08 16:17:53.436 闪讯[472:1107] The AppPath = /Applications/闪讯.app
2012-01-08 16:17:53.437 闪讯[472:1107] The src path = /Applications/Èó™ËÆØ.app/xlpppoe.kext
2012-01-08 16:17:58.892 闪讯[472:1107] Set Driver Ok...
/tmp/xlpppoe.kext failed to load - (libkern/kext) requested architecture/executable not found; check the system/kernel logs for errors or try kextutil(8).

Кстати, 闪讯.app(я ненавижу это !! Но мне это нужно ..) используется для подключения к сети в моем университете в Китае.


РЕДАКТИРОВАТЬ:

Kjuly@MacBook-Pro:~$ file /Applications/闪讯.app/Contents/MacOS/闪讯
/Applications/闪讯.app/Contents/MacOS/闪讯: Mach-O executable i386

а также

Kjuly@MacBook-Pro:~$ file /Applications/闪讯.app/xlpppoe.kext/Contents/MacOS/xlpppoe
/Applications/闪讯.app/xlpppoe.kext/Contents/MacOS/xlpppoe: Mach-O object i386

Кажется, это только 32-разрядная версия и зависит от 32-разрядного ядра. О, я ооочень грустный. :(


Вот некоторые сведения, которые я получил с помощью @GordonDavisson, возможно, кому-то еще это понадобится.

DOC показывает некоторые методы для временного запуска с 32-разрядным ядром, чтобы использовать более старые расширения ядра для стороннего программного или аппаратного обеспечения.

И речь идет о «Совместимости с 64-битным ядром»:

Программное обеспечение сторонних производителей (например, механизм виртуализации) или аппаратное обеспечение (например, карта PCIe), использующее расширение ядра, совместимое с Mac OS X Server v10.5, может не работать на компьютерах Mac, использующих 64-разрядное ядро в Mac OS X v10.6. Обратитесь к поставщику программного или аппаратного обеспечения за обновленным расширением ядра, которое работает с 64-разрядным ядром в Mac OS X Server v10.6.

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

1 ответ1

19

OS X не имеет общего 64/32 битного режима; он запускает отдельные программы в любом режиме, который кажется "лучшим" при запуске. Удержание 3 и 2 при загрузке компьютера заставит его ядро работать в 32-битном режиме, но это не имеет никакого отношения к тому, в каком режиме работают программы. OS X может успешно запускать программы в 32-битном режиме под 64-битным ядром или программы в 64-битном режиме под 32-битным ядром.

Если ваша программа содержит только 32-битный код, она будет работать в 32-битном режиме без необходимости делать что-то особенное. Вы можете проверить это, запустив команду file на исполняемом файле (обычно в AppName.app/Contents/MacOS/AppName. Вот несколько примеров:

$ file /Applications/Chess.app/Contents/MacOS/Chess
/Applications/Chess.app/Contents/MacOS/Chess: Mach-O universal binary with 2 architectures
/Applications/Chess.app/Contents/MacOS/Chess (for architecture x86_64): Mach-O 64-bit executable x86_64
/Applications/Chess.app/Contents/MacOS/Chess (for architecture i386):   Mach-O executable i386
$ file /Applications/VLC.app/Contents/MacOS/VLC
/Applications/VLC.app/Contents/MacOS/VLC: Mach-O universal binary with 2 architectures
/Applications/VLC.app/Contents/MacOS/VLC (for architecture i386):   Mach-O executable i386
/Applications/VLC.app/Contents/MacOS/VLC (for architecture ppc):    Mach-O executable ppc
$ file /Applications/Adobe\ Reader\ 9/Adobe\ Reader.app/Contents/MacOS/AdobeReader 
/Applications/Adobe Reader 9/Adobe Reader.app/Contents/MacOS/AdobeReader: Mach-O executable i386

... который говорит мне, что Chess.app включает в себя 32-битный и 64-битный код Intel ("i386" и "x86_64" соответственно), VLC.app включает в себя 32-битный Intel и 32-битный PowerPC ("ppc") код, а Adobe Reader включает только 32-разрядный код Intel.

Вы также можете получить часть этой информации (хотя и не так подробно) из системного отчета о Системной информации (в разделе «Программное обеспечение -> Приложения»).

Если приложение имеет как 32-, так и 64-битный код, вы можете выбрать, какой из них использовать в окне «Информация» в приложении Finder (будет установлен флажок «Открыть в 32-битном режиме»), или с помощью команда arch на исполняемом файле (например, arch -i386 /Applications/theApp.app/Contents/MacOS/theApp). Но обычно вам не нужно этого делать, ОС хорошо выбирает лучший режим.

(Один из случаев, когда вам нужно было бы вручную переопределить выбор режима, это совместимость с плагином или библиотекой. Если у вас есть 32- и 64-разрядное приложение, но оно должно быть в состоянии загрузить только 32-разрядный плагин или библиотеку, вам придется принудительно запустить программу в 32-разрядном режиме.)

Если у вас есть 64-битные программы, которые не работают прямо под 32-битным ядром, у них либо есть какая-то странная ошибка, либо происходит что-то еще более странное. Если вы укажете конкретные детали, мы сможем выяснить, что на самом деле идет не так.

РЕДАКТИРОВАТЬ: похоже, что приложение является только 32-разрядным, и устанавливает только 32-разрядное расширение ядра (kext). Хотя 32-битная часть приложения может работать в любом режиме ядра, 32-битные kexts могут загружаться только в 32-битное ядро (это как плагин для ядра). Вы можете запустить ядро в 32-битном режиме, удерживая 3 и 2 при запуске, или постоянно с помощью команды sudo systemsetup -setkernelbootarchitecture i386 (см. Apple KB # HT3773).

Обратите внимание, что не нужно делать ничего особенного, чтобы открыть приложение в 32-битном режиме; поскольку это единственный включенный формат, он будет работать в этом режиме независимо от того, как он запускается (в частности, команда arch не нужна).

Если у вас есть 64-битные приложения, которые не работают должным образом под 32-битным ядром, это отдельная проблема, и я бы рекомендовал опубликовать еще один вопрос об этом.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .