Kompilace 32-bit MaNGOSu na 64-bit Linuxu

Z WoWResource Wiki
Verze z 9. 3. 2008, 10:45, kterou vytvořil Chronos (diskuse | příspěvky) (Nová stránka: 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-...)
(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)
Přejít na: navigace, hledání

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::unloadMap
zjiš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.

Externí odkazy

Související diskuse na fóru mangosproject.org