Не удается загрузить 32-разрядный dylib из 64-разрядного процесса и наоборот в OSX?

#objective-c #c #macos #cocoa #dylib

#objective-c #c #macos #какао #dylib

Вопрос:

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

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

Нужно ли мне иметь 32-разрядный и 64-разрядный dylib для 32-разрядного и 64-разрядного двоичных файлов соответственно? Есть ли какие-либо обходные пути?

Ответ №1:

Да, вам нужны 32-разрядные библиотеки для 32-разрядных процессов и 64-разрядные библиотеки для 64-разрядных процессов. Обходного пути нет.

Комментарии:

1. Строго говоря, существует «обходной путь» создания 32-разрядного процесса для передачи вызовов в библиотеку через какую-либо форму IPC, но я бы не стал этого делать, если бы это не было действительно абсолютно необходимо.

2. Есть лучший «обходной путь»: создайте все библиотеки как двоичные файлы fat (мультиархитектуры), чтобы их можно было использовать как из 32-, так и из 64-разрядных процессов.

Ответ №2:

  1. Вы можете создавать 32-разрядные двоичные файлы с помощью 64-разрядного компилятора и наоборот.
  2. Вы можете создавать и запускать 64-разрядные двоичные файлы при загрузке на 32-разрядном ядре и наоборот.
  3. Вы не можете связать 32-разрядные сборки с 64-разрядными двоичными файлами или наоборот.

Комментарии:

1. Пункт 2 неверен. Обычно вы не можете запускать 64-разрядный код на 32-разрядной ОС (без учета виртуализации) на x86.

2. Пункт 2 верен для OS X — он может нормально запускать 64-разрядные процессы под 32-разрядным ядром. Фактически, это было возможно с версии 10.4, хотя она не включала 64-разрядное ядро до 10.6 (и обычно не использовала 64-разрядное ядро до 10.7).