Kompilace 32-bit MaNGOSu na 64-bit Linuxu
Opěrační systém GNU/Linux a překladač GNU/gcc umožňují běh 32-bit alikací na 64-bit systému. To se může hodit v případě, kdy daná aplikace správně nepodporuje 64-bit platformu jako je to v případě WoW emulátoru MaNGOS. Přitom rozdíl ve výkonu 32-bit a 64-bit aplikací není nijak výrazný a hlavní výhodou použití 64-bit systému zůstává možnost adresovat více než 4 GB fyzické operační paměti.
Počítačová platforma není dána pouze architekturou procesoru jako i386, i686, athlon64, c2d, atd.), ale také velikostí použitých registrů a adres (32-bit, 64-bit). Proto i v případě změny datové šířky registrů se jedná o tzv. cross compiling neboli křížové překládání. To lze popsat jako překlad aplikace pro jednu platformu na jiné.
Jak na to
Předpokládejme, že používáme 64-bit distribuci Fedora (aktuálně verze 8). Tato distribuce umožňuje běh jak 32-bit tak 64-bit aplikací a při instalaci knihoven z oficiálních balíčkových repozitářů se instalují obě verze. V systému jsou binární knihovny umístěny samostatně v adresářích /lib a /lib64 a knihovny ve zdrojové podobě v adresářích /usr/lib a /usr/lib64. Dále potřebujeme mít zdrojové kódy MaNGOSu, které lze stáhnout z SVN repozitáře.
Vycházejme z následujícího kompilačního skriptu:
#!/bin/sh cd trunk export CFLAGS="-march=athlon64 -m64 -O2 -g -pipe -msse3 -ggdb -fno-strength-reduce -fno-delete-null-pointer-checks -fno-strict-aliasing -frename-registers" export CXXFLAGS="-march=athlon64 -m64 -O2 -g -pipe -msse3 -ggdb -fno-strength-reduce -fno-delete-null-pointer-checks -fno-strict-aliasing -frename-registers" autoreconf --install --force ./configure --prefix=/opt/mangos --sysconfdir=/opt/mangos/etc --with-python --enable-cli --enable-ra --datadir=/opt/mangos #make clean make make install
Tento skript obsahuje nastavení pro překlad do 64-bit verze a plno dalších nastavení, které nás v tuto chvíli nezajímají. Pokud chceme provést překlad 32-bit verze jsou por nás podstatné tyto změny:
- Musíme změnit parametr -m64 na -m32, který přímo určuje bitovou šířku adresování paměti.
- Musíme přidat do řádku s příkazem configure cestu k umístění 32-bit knihoven a tedy doplnit na konec text LDFLAGS="-m32 -L/usr/lib".
- Je potřeba přidat před povel configure řádek export LIBS="-L/usr/lib/mysql", který určí umístění 32-bit knihoven mysql klienta.
Po provedení změn skript vypadá takto:
#!/bin/sh cd trunk export CFLAGS="-march=athlon64 -m32 -O2 -g -pipe -msse3 -ggdb -fno-strength-reduce -fno-delete-null-pointer-checks -fno-strict-aliasing -frename-registers" export CXXFLAGS="-march=athlon64 -m32 -O2 -g -pipe -msse3 -ggdb -fno-strength-reduce -fno-delete-null-pointer-checks -fno-strict-aliasing -frename-registers" export LIBS="-L/usr/lib/mysql" autoreconf --install --force ./configure --prefix=/opt/mangos --sysconfdir=/opt/mangos/etc --with-python --enable-cli --enable-ra --datadir=/opt/mangos LDFLAGS="-m32 -L/usr/lib" #make clean make make install
Přínos
Emulátor MaNGOS nepodporuje správně 64-bit platformy. Přesněji jedná se o knihovny G3D použité pro výpočty funkce Line-of-sight a práce s vmap soubory. Tato nekompatibilita způsobuje časté selhávání serveru a jeho ukončování obecnou chybou Segmentation fault. Konkrétně se jedná o chybu
VMAP::MapTree::unloadMapzjištěnou pomocí gdb (GNU Debugger).
Vypnutí vmap jako funkce je nežádoucí a tak zkompilování jako 32-bit aplikace řeší uspokojivě tento problém, čímž se v jednom případě zvýšil uptime serveru z 3-5 hodin na 20-30 hodin při špičkově až 140 hráči online.