5.2. Toolchain Technical Notes

Tato část vysvětluje některé technické detaily o kompilaci. Není důležíté, abyste ihned rozuměli této části. Hodně z těchto informací bude jasnějších po kompilaci. K této sekci se můžete vrátit kdykoliv během kompilace.

Cílem Chapter 5 je nabídnout dočasné prostředí, do kterého se budete moct chrootovat a zkompilovat v něm čistý a bezproblémový systém LFS v Chapter 6. Nový systém oddělíme od hostitele co nejdřívě a zkompilujeme nástroje. Kompilační proces byl nastaven z ohledem na minimalizaci rizik pro nové čtenáře a zároveň nabízí maximalní výukovou hodnodu.

[Important]

Important

Předtím než budete pokračovat, si uvědomte jméno pracovní platformy, na kterou je nejčastěji odkazováno jako na výslednou trojci. Nejčastěji je výsledná trojice i686-pc-linux-gnu. Jednoduše to zjistíte, pomocí skriptu config.guess, který je u zdrojů mnoha balíčků. Rozbalte Binutils, spusťte ./config.guess a všimněte si výstupu.

Také si všimněte jména dynamického linkeru, na který je často odkazováno jako dynamický loader (nenechte se zmást standardním linkerem ld, který je součástí Binutils). Dynamický linker je částí Glibc. Hledá a načítá sdílené knihovny, které programy potřebují, přípravuje spuštění programu a spouští jej. Dynamický linker se obvykle jmenuje ld-linux.so.2. Na menšínových platformách se může jmenovat ld.so.1, a na nových 64 bitových platformách ještě nějak jinak. Jméno dynamického linkeru můžete zjistit ve složce /lib hostitelského systému. Jistá cesta ke zjištění je spuštění readelf -l <name of binary> | grep interpreter a zaznamenání výstupu. Hlavní reference zachycující všechny platformy je v souboru shlib-versions v hlavním adresáři zdrojů Glibc.

Některé technické poznámky jak v Chapter 5 pracují kompilace:

Binutils jsou nainstalované nejdříve, protože skript configure z balíčků GCC a Glibc spouští hodně testů na assembleru a linkeru, aby zjistil, které možnosti má povolit nebo zakázat. Toto je důležitější, než si můžete myslet. Špatně nakonfiguravaná GCC nebo Glibc může vyústit až v chybné nástroje, kde se chyba může ukázat až před koncem kompilace celé distribuce. Tuto chybu můžou ukázat špatné testy, ještě předím, než uděláte hodně práce.

Binutils instalují assembler a linker do dvou míst,/tools/bin a /tools/$TARGET_TRIPLET/bin. Nástroje v jednom místě jsou tvrdě nalinkovány na druhé místo. Důležitá stránka linkeru je vyhledávací pořadí jeho knihovny. Detailní informace můžete získat z ld s příznakem --verbose. Na příklad ld --verbose | grep SEARCH ukazuje nynější vyhledávací cestu a její pořadí. Toto ukazuje které soubory jsou linkovány ld pomocí kompilace testovacího programu a přidáním parametrum --verbose k linkeru. Na příklad gcc dummy.c -Wl,--verbose 2>&1 | grep succeeded ukáže všechny soubory otvírané během linkování.

Další instalovaný balíček je GCC. Behěm skriptu configure můžete vidět:

checking what assembler to use... 
        /tools/i686-pc-linux-gnu/bin/as
checking what linker to use... /tools/i686-pc-linux-gnu/bin/ld

To je důležité z důvodů zmíněných výše. Také se ukazuje, že konfigurační skript GCC nehledá adresáře v PATH, aby našel, které nástroje má použít. Jakkoli behěm aktuální operace gcc, není nutná stejná vyhledávací cesta. Abyste zjistili, který standardní linker program gcc použije, spusťte : gcc -print-prog-name=ld.

Detailnější informaci můžete získat z programu gcc přidáním volby -v při kompilaci testového programu. Např gcc -v dummy.c ukáže detailní informaci o preprocesoru, kompilátoru a stavu assembleru včetně zahrnuté cesty a jejího pořadí v programu gcc.

Další instalovaný balíček je Glibc. Nejdůležitější pro kompilaci jsou kompiler, binární nástroje a hlavičky jádra. Kompiler nepředstavuje problém, protože Glibc vždycky použije gcc z adresáře v proměnné PATH. Binární nástroje a hlavičky jádra mohou být komplikovanější. Proto také neriskujte a použijte dostupné konfigurační volby, abyste zajistili správný výběr. Po spuštění configure zkontrolujte obsah souboru config.make ve složce glibc-build. Použijte parametr CC="gcc -B/tools/bin/" ke kontrole, které binární nástroje jsou použity a také použijte parametry -nostdinc a -isystem, ke kontrole vyhledávací cesty kompilátoru. Tyto věci vyzdvihují důležitý aspekt balíčku Glibc — je velmi samostatný v kompilaci a většinou není závislý na výchozím nastavení nástrojů.

Po instalaci Glibc udělejte nějaké úpravy, abyste se ujistili, že vyhledávání a linkování pracuje pouze uvnitř adresáře /tools. Nainstalujte upravené ld, které má napevno zapsanou vyhledávací cestu omezenou na adresář /tools/lib. Po té připojte specs soubor programu gcc, aby ukazoval na nový dynamický linker v adresáři /tools/lib. Tento poslední krok je životně důležitý pro celý proces. Jak bylo poznamenáno dříve, napevno zakódovaná vyhledávací cesta k dynamickému linkeru je vložena do sdíleného spustitelného souboru Executable and Link Format (ELF). Toto můžete zkontrolovat spuštěním readelf -l <name of binary> | grep interpreter. Přidání gcc spec souboru zajišťuje, že každý program, který bude nyní až do konce kapitoly zkompilován použije nový dynamický linker v adresáři /tools/lib.

Potřeba použití nového dynamického linkeru je také důvod, proč je Specs patch aplikován pro druhý průchod GCC. Pokud byste jej neaplikovali, GCC programy by měly v sobě zapsané jméno dynamického linkeru z hostitelského systému z adresáře /lib, což by vedlo daleko od cíle, aby nebyly závislé na hostitelském systému.

Během druhého průchodu Binutils, můžete pomocí přepínače --with-lib-path kontrolovat vyhledávací cestu knihovny ld. Dále již bude jádro nástrojů nezavislé na hostiteli. Zbytek balíčků z Chapter 5 bude již zkompilováno na nové Glibc v adresáři /tools.

Po vstupu do chrootového prostředí v Chapter 6, první nainstalovaný balíček bude Glibc díky jeho vlastnosti zmíněné dříve. Až bude Glibc nainstalovaná do adresáře /usr, rychle připravíme změnu výchozího nastavení nástrojů a poté budeme pokračovat ve zbytku výsledného systému LFS.