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 zby­tečné, kdy není co ro­zum­ného děl­at a zár­oveň se ne­dá z mno­ha ne­spe­cifi­kovaných dův­o­dů spát. Ne­bo tak něj­ak. A ne­bo ta­ky ne.

Univer­sal bi­na­ry. Zní to ja­ko něj­a­ká magie. Ve sku­tečnos­ti to není sa­mozřejmě nic ji­ného, než prachspros­té spatlání něko­lika spus­ti­telných kó­dů růz­ných ar­chi­tek­tur do jedno­ho sou­bo­ru. Ale na straně druhé je to geni­álně jedno­duché a ve­se­lé.

Navázal bych na je­den z mi­nu­lých člán­ků, konkrétně Směj­e­me se s as­sem­ble­rem pro PowerPC, a na tam­též uve­deném příkla­dě de­mon­stroval vy­tvo­ření univerzálního spus­ti­telného sou­bo­ru.

Aby bylo krás­ně vi­dět, že oba výsledné kó­dy bu­dou funkčně to­tožné, tak pro zopa­kování... a ješ­tě zjiš­tění ak­tuální ar­chi­tek­tu­ry:

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

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

Což je vel­mi uži­tečný pro­gram, kte­rý vra­cí pětku. Aby to bylo zábavné, pro­ve­de­me je­ho pře­ložení stejnou ces­tou ja­ko mi­nule, te­dy do jaz­ka sym­bo­lických ad­res pro x86_64.

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

Výsle­dek bu­de pro tuhle zmršenou in­te­láckou věc o mno­ho straši­delnější opro­ti krás­ně jedno­duché­mu a voňavé­mu PowerPC. Dalším krokem je vy­tvo­ření ob­jek­tového sou­bo­ru po­mo­cí as, což je vel­mi zás­lužná činnost. A rovnou slin­kuje­me, 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

Ju­pí. Teď by tu měly exis­tovat dva spus­ti­telné kó­dy - je­den pro PowerPC a druhý pro x86_64. Pro přehlednost ješ­tě přej­menovat pův­odní PowerPC sou­bor:

$ mv peklo peklo-ppc

Tím se to stalo opět tro­chu jasnější a zbývá ony dva sou­bo­ry růz­ných ar­chi­tek­tur spo­jit do jedné univerzální bi­nárky, k če­muž slou­ží uti­litka 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 ne­vy­pa­dá to úžasně? Ale když už je to­lik možnos­tí, proč zůstávat jen u dvou ar­chi­tek­tur? Jak mi­lé by bylo vy­tvo­řit pro­gram jak pro 32, tak i pro 64­bi­tové va­ri­an­ty ar­chi­tek­tur PowerPC a x86?

A ta­dy při­chází chvíle s ti­chým, ale výr­az­ným wtf výr­azem. Snow Le­opard a je­ho Xco­de při­chází s gcc 4.2, kte­ré už v so­bě sa­mo ne­ob­sahuje podpo­ru pro pp­c64. Dlouhá chvíle go­oglování, něko­lik chvil zkou­šení a na­ko­nec vlastně vy­ře­šeno tím, že se gcc mu­sí pře­dat star­ší než snow le­opar­dí SDK. Takže nyní už jen v rych­los­ti - kompi­la­ce kó­du po­mo­cí gcc pří­mo do ví­cear­chi­tek­tu­rového sou­bo­ru.

$ 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 bu­de asi všechno. Přes­tože je tahle mul­ti­ar­chi­tek­tu­rová vy­chytávka vý­b­orná a hravá, nic to ne­mění na tom, že se to ce­lé zby­tečně zesloži­ti­lo, se­bralo spous­tu mís­ta na dis­cích... pros­tě In­te­ly smr­dí. Co na­děl­á­me. Pokud něko­ho na­padne ješ­tě ně­co dalšího, dej­te do ko­men­tů vě­dět.

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

Komentáře

Nový komentář