Как работает 64-битный код на OS-X 10.5? - PullRequest
0 голосов
/ 20 марта 2010

Сначала я думал, что 64-разрядные инструкции не будут работать на OS-X 10.5.

Я написал небольшую тестовую программу и скомпилировал ее с GCC -m64. Я использовал long long для моих 64-битных целых чисел.

Используемые инструкции по сборке выглядят как 64-битные. например. imultq и movq 8(%rbp),%rax.

Кажется, я работаю.

Я использую printf только для отображения 64-битных значений, используя %lld.

  1. Это ожидаемое поведение?
  2. Есть ли какие-нибудь gotcha's, которые могли бы привести к сбою?
  3. Могу ли я задать несколько вопросов в вопросе?
  4. Работает ли это на других ОС?

Ответы [ 3 ]

2 голосов
/ 22 марта 2010

Просто чтобы прояснить это, вот ситуация для 32- и 64-разрядных исполняемых файлов в OS X:

  • И 32-, и 64-разрядные исполняемые файлы пользовательского пространства могут быть запущены как на 32-, так и на 64-разрядных ядрах в OS X 10.6 без эмуляции. На 10.4 и 10.5 как 32-, так и 64-разрядные исполняемые файлы могут работать в 32-разрядном ядре. (Это не так в Windows)

  • Системные библиотеки и платформы пользовательского пространства построены с 32/64-битной версией 10,5 и 10,6. Вы можете ссылаться на них как обычно, независимо от того, используете ли вы 32-битную, 64-битную или обе версии. Несколько библиотек (в основном слой POSIX) также построены с 32/64-битной версией 10.4, но многие из них - нет.

  • На 10.6 инструменты сборки по умолчанию создают 64-битные исполняемые файлы. В версии 10.5 и более ранних по умолчанию используется 32-разрядная версия.

  • На 10.6 исполняемые файлы, которые построены жирными, по умолчанию будут работать на 64-битной стороне. На 10.5 и более ранних 32-битная сторона выполняется по умолчанию.

  • Вы всегда можете вручную указать, какой фрагмент толстого исполняемого файла использовать, используя команду arch. например. arch -arch i386 someCommandToRunThatIWantToRunIn32BitMode. Для пакетов приложений вы можете либо запустить их из командной строки, либо есть предпочтение, если вы «получаете информацию» о приложении.

  • OS X и Linux используют модель LP64 для 64-битных исполняемых файлов. Указатели и long имеют ширину 64 бита, int - все еще 32 бита, а long long - все еще 64 бита. (Вместо этого в Windows используется модель LLP64 - long имеет ширину 32 бита в 64-битной Windows).

2 голосов
/ 20 марта 2010

Mac OS X 10.5 хорошо поддерживает 64-битные пользовательские приложения. Фактически Xcode работает в 64-битной версии 10.5 на совместимой архитектуре.

Это только встроенные приложения (Finder, Safari, фреймворки, демоны и т. Д.) Также имеют 64-битную версию в 10.6.

0 голосов
/ 22 марта 2010

Meta: мне не нравится, когда ответы удаляются. Я думаю, это где-то обсуждалось.

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

  1. Похоже, что это ожидаемое поведение на Mac, и даже кажется, что оно работает и на 32-битной Linux (хотя я не тестировал экстенсивно)

  2. Да. GCC ведет себя по-разному (по крайней мере, в моем ограниченном наблюдении) для 32 (-m32) и 64 (-m64) битовых режимов. В 32-битном я смог получить доступ к переменным аргументам, используя массив. В 64-битном режиме это просто не работает.

Я узнал, что вы ДОЛЖНЫ получить доступ к переменным параметрам, используя va_list, как определено в stdarg.h, потому что он работает в обоих режимах.

Теперь у меня есть программа командной строки, которая запускает и проходит все мои тесты в 32-битном и 64-битном режимах на Mac OS-X.

В программе реализован сборщик мусора из связанного списка, сметающий 16-байтовые выровненные объекты, распределенные по malloc, из глобального списка, а также из машинных регистров и стека - на самом деле в 64-битном режиме есть дополнительные регистры, поэтому у меня все еще есть немного работы, чтобы сделать.

Объекты - это набор из 32- или 64-битных слов, которые соединяются вместе, образуя структуры данных, подобные LISP / Scheme.

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

  1. Если вы зададите несколько вопросов, вы не получите всех ответов, которые вам могут понадобиться.

  2. Кажется, он работает, как я писал, в Linux.

Опять же, спасибо, что помогли мне с этим.

...