Компилятор Mac OSX 10.6:загадочный опыт с 32-битной и 64-битной версиями

StackOverflow https://stackoverflow.com/questions/1455720

Вопрос

У меня проблемы с пониманием компилятора gcc, предоставляемого OSX 10.6 Snow Leopard, главным образом из-за отсутствия у меня опыта работы с 64-битными средами.

$ cat >foo.c
main() {}
$ gcc foo.c -o foo
$ file foo
foo: Mach-O 64-bit executable x86_64
$ lipo -detailed_info foo
input file foo is not a fat file
Non-fat file: foo is architecture: x86_64

Однако моя архитектура рассматривается как тип Intel i386 (у меня один из последних MacBook с Intel Core2 duo).

$ arch
i386

и компилятор нацелен на i686-apple-darwin10

$ gcc --version 
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5646)

Конечно, если я скомпилирую 32-битную версию, я получу 32-битный исполняемый файл.

$ gcc -m32 foo.c -o foo
$ file foo
foo: Mach-O executable i386

но я не понимаю общей картины.По умолчанию компилятор настроен на создание исполняемых файлов x86_64, даже если у меня есть сообщение Arch, говорящее, что у меня 32-битная машина (почему?Core2 — 64);даже если (я думаю) у меня 32-битное ядро;даже если у меня есть компилятор, ориентированный на платформу i686-apple-darwin.Почему?Как они могут бежать?Должен ли я скомпилировать 64 или 32?

Этот вопрос возник из-за моей попытки скомпилировать gcc 4.2.3 на Mac, но у меня возникла куча проблем с компиляцией gmp, mpfr и libiberty (в некоторых случаях) для x86_64.Должен ли я скомпилировать все x86_64?Если да, то какова цель (я думаю, не i686-apple-darwin10)?

Спасибо за помощь

Это было полезно?

Решение

Компилятором Snow Leopard по умолчанию является gcc4.2, а его архитектура по умолчанию — x86_64.Типичный способ создания программного обеспечения для Mac — создание нескольких архитектур за отдельные проходы, а затем использование Lipo для объединения результатов.(lipo только компилирует файлы с одной дугой в файл с несколькими дугами или удаляет дуги из файла с несколькими дугами.Как вы обнаружили, он не имеет никакой полезности для файлов с одной аркой.)

Разрядность компилятора тут ни при чем.Вы можете собирать 32-битные двоичные файлы с помощью 64-битного компилятора и наоборот.(То, что вы считаете «целью» компилятора, на самом деле является его исполняемым файлом, а это совсем другое.)

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

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

Другие советы

i686-apple-darwin10.0.0 содержит папку x86_64, которая не распознается большинством версий autotools.Другими словами, я бы сказал, что компилятор gcc, к сожалению, является не чем иным, как шуткой над Snow Leopard.Зачем вам объединять 32-битные и 64-битные библиотеки в i686-apple-darwin10.0.0, я не понимаю.

$ ls /usr/lib/gcc
i686-apple-darwin10 powerpc-apple-darwin10

Вам необходимо изменить все файлы конфигурации autotools для обработки поиска в *86-Дарвин каталоги, а затем ищу 64-битные библиотеки, я думаю.

Как и в вашей системе, мой Mac Mini говорит, что это i386, хотя он, очевидно, использует 64-битную платформу, что опять же является еще одной ошибкой, поскольку он распространяется с 64-битным оборудованием.

$arch
i386

Цепочки инструментов Apple поддерживают несколько архитектур.Если вы хотите создать толстый двоичный файл, содержащий код x86 и x86_64, вам необходимо передать параметры -arch i386 -arch x86_64 в gcc.Компилятор скомпилирует ваш код дважды для обеих платформ за один раз.

Добавление -arch i386 -arch x86_64 to CFLAGS может позволить вам скомпилировать gmp, mpfr и еще много чего для нескольких арок за один раз.Создание libusb таким способом сработало для меня.

Этот ответ неверен, но см. комментарии ниже.

Настоящий вопрос...как вы получили 32-битную версию OSX?Я не знал, что снежный барс имел 32-битная версия, поскольку все чипы Intel от Apple — это Core 2 или Xeon, поддерживающие архитектуру x86_64.

Да, и Snow Leopard работает только на чипах Intel.

Редактировать:Судя по всему Snow Leopard запускается в 32-битном режиме.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top