Kompilátor GCC
Bez kompilátoru by život programátora byl procházkou peklem. Vždyť kdo by dokázal psát své programy přímo ve strojovém kódu toho kterého procesoru? Naštěstí se takto trápit nemusíme. Stačí si vybrat spravný kompilátor, který podporuje cílovou platformu, a můžeme zvesela programovat. Což ovšem přináší nutnost, umět kompilátor správně používat a nastavit. V této části textu se proto zaměříme na oblast používání kompilátoru často opomíjenou, ale pro nás ”embedďáky” zvláště důležitou. Budeme totiž zjišťovat, kde kompilátor při překladu naší aplikace hledá hlavičkové soubory a systémové knihovny. Mimo to se však ještě seznámíme s oblíbeným křížovým kompilátorem gcc od firmy CodeSourcery a představíme si nejčastěji používané binární utility jako je linker apod.
Možná si teď říkáte, proč je pro programátora aplikací pro embedded zařízení tak důležité vědět, kde kompilátor hledá hlavičkové soubory standardních systémových knihoven. A proč by měl vědět, kde kompilátor hledá systémové knihovny jako libc apod., které vytvářejí standardní běhové (run-time) prostředí pro aplikace psané v jazyce C/C++?
Je to kvůli tomu, že programátor ”embedďák” potřebuje mít jistotu, že se jeho aplikace kompiluje a linkuje se standardními systémovými knihovnami (a jejich hlavičkovými soubory), které budou použity v cílovém zařízení. Rozhraní, tj. hlavičkové soubory, a funkcionalita standardních knihoven použitých v cílovém zařízení se totiž může od knihoven v jeho počítači značně lišit (srovnej např. libc a uClibc).
Odlišnost v rozhraní a funkcionalitě standardních systémových knihoven v pracovním počítači a v cílovém zařízení je třeba vzít v úvahu už ve fázi psaní zdrojového kódu. Nicméně je velmi frustrující při první kompilaci zjistit, že váš kód nejde přeložit prostě jen proto, že váš kompilátor používá špatné hlavičkové soubory knihoven nebo linkuje špatné knihovny.
V následujícím textu si proto na nativním kompilátoru gcc (součást distribuce Debian 6.0 Squeeze) předvedeme, jak zjistit, kde kompilátor hledá hlavičkové soubory a knihovny.
Pak si nainstalujeme křížový kompilátor Sourcery G++ Lite, ukážeme si, jak jej správně nastavit pro cílové zařízení, a s využitím znalostí získaných při hrátkách s nativním kompilátorem zkusíme i v případě křížového kompilátoru zjistit, kde hledá hlavičkové soubory a knihovny.
A konečně, jak už jsem v úvodu slíbil, na závěr si představíme ty nejběžněji používané binární utility distribuované společně s kompilátorem - ld (linker), strip, objcopy atd.
Co nás čeká ...
Nativní kompilátor
Kompilátor a další vývojové nástroje v současnosti nejsnáze získáme jako součást standardní linuxové distribuce v podobě nějakého instalačního balíčku. Je to pohodlné a rychlé, ale díky tomu často nevíme, jak je kompilátor nastaven, kde hledá hlavičkové soubory standardních systémových knihoven a kde hledá samotné knihovny. Vývojáři distribuce za nás vše sladili v jeden bezvadně fungující celek a my se prostě nemusíme o nic starat.
Křížový kompilátor
Dnešní doba vývojářům aplikací pro embedded zařízení vysloveně přeje. Svědčí o tom i to, že křížové nástroje (cross-tools) se pomalu ale jistě stávají nedílnou součástí standardních linuxových distribucí v podobě instalačních balíčků. Na druhou stranu stálicí mezi volně dostupnými křížovými nástroji třetích stran je vývojové prostředí Sourcery G++ Lite. A právě o tomhle prostředí, resp o nástrojích, které nabízí, budou následující odstavce.
Binární utility
Nejen kompilátorem živ je člověk - během své práce jistě využijeme služeb alespoň některé z tzv. binárních utilit, zkráceně binutils. Tyto utility umožňují provádět další doplňkové činnosti s objektovými soubory, resp. s výsledným spustitelným souborem naší aplikace.