Řekněme, že můj uživatelský prostor (balíčky) jsou zkompilovány pomocí gcc 4.7
a libc6 2.13
(Debian Wheezy)
Mohu zkompilovat linuxové jádro v jiném vývojovém prostředí, jako je gcc 6.3
a libc6 2.24
(tj. pod Debian Stretch) ?
Vím, že na rozdíl od balíčků není jádro spojeno s žádnými dynamickými knihovnami. Teoreticky by tedy neměl být rozdíl, který gcc
a libc
byl zkompilován pod.
Je to pravda?
Mohl bych se dostat do problémů, když to udělám?
Mohly by být nějaké nekompatibility způsobené různými gcc
verze?
Na druhou stranu novější gcc
má některé zajímavé funkce, lepší zabezpečení. Možná by tedy jádro mělo být zkompilováno s nejnovějším gcc
?
Přijatá odpověď:
Jak jste zdůraznili, použitá knihovna C nemá žádný dopad na jádro, jádro nepoužívá knihovnu C. (Je to nepřímý dopad, protože se používá k vytváření nástrojů, které jádro používá během procesu sestavování, ale je extrémně nepravděpodobné, že to ovlivní konečný výsledek.)
Jádro lze sestavit s řadou různých verzí kompilátoru; podle své dokumentace potřebuje pouze GCC 3.2 nebo novější. Zjistíte také, že může chvíli trvat, než jádro oficiálně podpoří nejnovější verze GCC, a ještě déle, než je použije distribuční jádro. Například balíček Debian Linux kernel používá GCC 6 a dokonce má vyhrazené balíčky, které poskytují správnou verzi kompilátoru (linux-compiler-gcc-6-x86
na amd64
a i386
). Neexistuje žádné spojení mezi kompilátorem používaným pro jádro a kompilátorem používaným pro uživatelský prostor (ani není nezbytně nutné používat stejný kompilátor pro celý uživatelský prostor — staré programy sestavené s GCC 3 nebo dokonce 2 stále fungují na moderních systémech).
Novější verze kompilátoru poskytují více bezpečnostních funkcí, ale GCC 6 je dost dobrý pro většinu, ne-li pro všechny bezpečnostní funkce používané v jádře.