Компилятор Mac OSX 10.6: удивительный опыт с 32 против 64 бит - PullRequest
9 голосов
/ 21 сентября 2009

У меня проблемы с пониманием компилятора 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 (у меня один из новейших Intel Core2 Duo MacBook)

$ 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, я думаю)?

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

Ответы [ 4 ]

15 голосов
/ 21 сентября 2009

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

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

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

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

2 голосов
/ 28 октября 2009

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

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

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

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

$arch
i386
1 голос
/ 27 августа 2013

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

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

0 голосов
/ 21 сентября 2009

Этот ответ неправильный, но см. Комментарии ниже

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

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

...