Eida.cz - Nedostatečně univerzální Snow Leopard

Nedostatečně univerzální Snow Leopard

29. října 2010, 02:09 Eida

Dnešní noc opět patří mezi ty zbytečné, kdy není co rozumného dělat a zároveň se nedá z mnoha nespecifikovaných důvodů spát. Nebo tak nějak. A nebo taky ne.

Universal binary. Zní to jako nějaká magie. Ve skutečnosti to není samozřejmě nic jiného, než prachsprosté spatlání několika spustitelných kódů různých architektur do jednoho souboru. Ale na straně druhé je to geniálně jednoduché a veselé.

Navázal bych na jeden z minulých článků, konkrétně Smějeme se s assemblerem pro PowerPC, a na tamtéž uvedeném příkladě demonstroval vytvoření univerzálního spustitelného souboru.

Aby bylo krásně vidět, že oba výsledné kódy budou funkčně totožné, tak pro zopakování... a ještě zjištění aktuální architektury:

$ cat peklo.c
/* peklo.c */

int main() {
  return 5;
}
$ uname -m
x86_64

Což je velmi užitečný program, který vrací pětku. Aby to bylo zábavné, provedeme jeho přeložení stejnou cestou jako minule, tedy do jazka symbolických adres pro x86_64.

$ gcc -S -O2 -fno-PIC -o peklo-X86_64.s peklo.c

Výsledek bude pro tuhle zmršenou inteláckou věc o mnoho strašidelnější oproti krásně jednoduchému a voňavému PowerPC. Dalším krokem je vytvoření objektového souboru pomocí as, což je velmi záslužná činnost. A rovnou slinkujeme, aby se neřeklo.

$ as -o peklo-x86_64.o peklo-x86_64.s
$ ld -lcrt1.o -lSystem -o peklo-x86_64 peklo-x86_64.o

Jupí. Teď by tu měly existovat dva spustitelné kódy - jeden pro PowerPC a druhý pro x86_64. Pro přehlednost ještě přejmenovat původní PowerPC soubor:

$ mv peklo peklo-ppc

Tím se to stalo opět trochu jasnější a zbývá ony dva soubory různých architektur spojit do jedné univerzální binárky, k čemuž slouží utilitka lipo.

$ lipo -create -arch ppc peklo-ppc -arch x86_64 peklo-x86_64
output peklo
$ file peklo
peklo: Mach-O universal binary with 2 architectures
peklo (for architecture x86_64): Mach-O 64-bit executable x86_64
peklo (for architecture ppc): Mach-O executable ppc

No nevypadá to úžasně? Ale když už je tolik možností, proč zůstávat jen u dvou architektur? Jak milé by bylo vytvořit program jak pro 32, tak i pro 64bitové varianty architektur PowerPC a x86?

A tady přichází chvíle s tichým, ale výrazným wtf výrazem. Snow Leopard a jeho Xcode přichází s gcc 4.2, které už v sobě samo neobsahuje podporu pro ppc64. Dlouhá chvíle googlování, několik chvil zkoušení a nakonec vlastně vyřešeno tím, že se gcc musí předat starší než snow leopardí SDK. Takže nyní už jen v rychlosti - kompilace kódu pomocí gcc přímo do vícearchitekturového souboru.

$ gcc -O2 -Wall -force_cpusubtype_ALL -mmacosx-version-min=10.4
-isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386
-arch ppc -arch x86_64 -arch ppc64 peklo.c -o peklo-all

$ file peklo-all
peklo-all: Mach-O universal binary with 4 architectures
peklo-all (for architecture i386): Mach-O executable i386
peklo-all (for architecture ppc): Mach-O executable ppc
peklo-all (for architecture x86_64): Mach-O 64-bit executable x86_64
peklo-all (for architecture ppc64): Mach-O 64-bit executable ppc64

Tak. To bude asi všechno. Přestože je tahle multiarchitekturová vychytávka výborná a hravá, nic to nemění na tom, že se to celé zbytečně zesložitilo, sebralo spoustu místa na discích... prostě Intely smrdí. Co naděláme. Pokud někoho napadne ještě něco dalšího, dejte do komentů vědět.

Eida
Tento článek přečetlo již 246 čtenářů (0 dnes).

Komentáře

Nový komentář