Mac OSX 10.6 do compilador: uma experiência intrigante com 32 vs 64 bit
-
12-09-2019 - |
Pergunta
Eu tenho dificuldade para entender o compilador gcc fornecidos pela OSX 10.6 Snow Leopard, principalmente por causa da minha falta de experiência com ambientes de 64 bits.
$ 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
No entanto, minha arquitetura é visto como um tipo de intel i386 (eu tenho um dos mais recentes processadores Intel Core2 Duo MacBook)
$ arch
i386
e as metas do compilador i686-apple-darwin10
$ gcc --version
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5646)
Claro que, se eu compilar 32 bits eu recebo um executável de 32 bits.
$ gcc -m32 foo.c -o foo
$ file foo
foo: Mach-O executable i386
mas eu não obter a imagem grande. A configuração padrão para o compilador é produzir x86_64 executáveis, mesmo que eu tenha arco dizendo que tenho uma máquina de 32 bits (por Core2 é 64?); mesmo que (eu acho) Estou executando um kernel de 32 bits; mesmo se eu tiver um compilador como alvo a plataforma i686-maçã-darwin. Por quê? Como eles podem executar? Devo compilar 64 ou 32?
Esta questão é devido a minha tentativa de compilar gcc 4.2.3 no Mac, mas eu estou tendo um monte de problemas com gmp, mpfr e libiberty recebendo (em alguns casos) compilado para x86_64. Devo compilar tudo x86_64? Se assim for, qual é o alvo (não i686-apple-darwin10 eu acho)?
Obrigado pela ajuda
Solução
O compilador padrão no Snow Leopard é gcc4.2, e sua arquitetura padrão é x86_64. A forma habitual de construir software Mac é construir múltiplas arquiteturas em passagens separadas, então use lipo para combinar os resultados. (Lipo única compila arquivos single-arco em um arquivo de múltipla arco, ou tiras de arcos para fora de um arquivo multi-arco. Não tem nenhuma utilidade em arquivos individuais de arco, como você descobriu.)
O número de bits do compilador não tem nada a ver com nada. Pode construir binários de 32 bits com um compilador de 64 bits, e vice-versa. (O que você acha que é o "alvo" do compilador é realmente seu executável, que é diferente.)
O número de bits do kernel tem nada a ver com nada. Você pode construir e executar binários de 64 bits quando inicializado em um kernel de 32 bits, e vice-versa.
O que importa é quando você ligar, se você tem as arquiteturas apropriadas para a ligação. Não é possível ligar de 32 bits constrói contra binários de 64 bits ou vice-versa. Então, o importante é ver o que as arquiteturas de suas bibliotecas de ligação são, certifique-se que eles são coerentes, em seguida, construir o seu binário da mesma arquitetura para que você possa ligar com as bibliotecas que você tem.
Outras dicas
i686-apple-darwin10.0.0 contém uma pasta x86_64 que não é compreendido pela maioria das versões do autotools. Em outras palavras, eu diria que o compilador gcc é, infelizmente, nada menos do que uma piada no Snow Leopard. Por que você iria agrupar bibliotecas de 32 bits e 64 bits em i686-apple-darwin10.0.0 está além de mim.
$ ls /usr/lib/gcc
i686-apple-darwin10 powerpc-apple-darwin10
Você precisa mudar todos os seus arquivos do configure autotools para lidar olhando * 86- darwin diretórios e, em seguida, olhando para as bibliotecas de 64 bits eu imagino.
Tal como acontece com o seu sistema, o meu Mac mini diz que seu i386, embora o seu obviamente usando uma plataforma de 64 bits, novamente outro erro desde a sua distribuído com hardware de 64 bits.
$arch
i386
toolchains da Apple suportar múltiplas arquiteturas. Se você quiser criar um binário de gordura que contém x86 e x86_64 código, então você tem que passar o -arch i386 -arch x86_64
parâmetros para gcc. O compilador irá compilar o código duas vezes para ambas as plataformas de uma só vez.
Adicionando -arch i386 -arch x86_64
para CFLAGS pode permitir que você para compilar gmp, mpfr, e outros enfeites para vários arcos de uma só vez. Construir libusb dessa forma funcionou para mim.
Esta resposta está errada, mas ver comentários abaixo
A verdadeira questão é ... como você conseguiu uma versão do OSX 32-bit? Eu não estava ciente de que o Snow Leopard estiveste a versão de 32 bits, como todos os chips da Intel da Apple são Core 2 ou Xeon, que suportam a arquitetura x86_64.
Ah, e Snow Leopard só funciona em chips da Intel.
Edit:. Aparentemente Snow Leopard é iniciado no modo de 32 bits