Binutils 2.47: linker umí stupeň optimalizace nula, 32bitový s390 chce přepínač navíc
GNU Binutils 2.47 vyšlo 26. července. Linkeru ld přibyl stupeň optimalizace nula: vypne slučování shodného obsahu v sekcích, takže linkování je rychlejší a výsledný soubor větší. Podpora 32bitového s390 je označená za zastaralou a bez zvláštního přepínače se sada pro tento cíl vůbec nenakonfiguruje.

gas ze sady Binutils dělá dnes touž práci pro desítky architektur. Foto: Michael Holley, Wikimedia Commons (volné dílo)GNU Binutils je sada, bez které se na Linuxu nepřeloží skoro nic: assembler gas, linker ld a nástroje na čtení objektových souborů, mezi nimi objdump a readelf. Vydání 2.47 oznámil 26. července Nick Clifton, hlavní správce projektu. Balíky na ftp.gnu.org nesou totéž datum.
Linkování se dá zrychlit tím, že se práce ubere
Nejnápadnější změna je v linkeru. Překladač označuje některé sekce jako slučitelné: typicky tam leží řetězcové konstanty a podobná data, u kterých nevadí, když se dvě shodné kopie sloučí v jednu. Linker takové sekce prochází, hledá v nich duplicity a výsledek tím zmenšuje. Stojí ho to čas.
Binutils 2.47 dovoluje tuhle práci vypnout. Nový stupeň optimalizace -O 0 u linkeru BFD podle poznámek k vydání linkeru zastaví slučování obsahu slučitelných sekcí, což „může výrazně zrychlit proces linkování za cenu větších binárek“ (přeloženo z angličtiny). O kolik, projekt neuvádí, a závisí to na tom, kolik takových dat program má.
Komu se to hodí, je vidět z povahy věci: při vývoji se linkuje pořád dokola a na velikosti výsledku většinou nezáleží. To už je naše hodnocení, v poznámkách žádné doporučení není.
Hromada objektových souborů, která se tváří jako archiv
Druhá novinka linkeru jsou volby --start-lib a --end-lib plus příkaz LIB ve skriptu linkeru. Objektové soubory mezi nimi se berou jako členové umělého archivu, tedy jako soubor .a, který nikdy nevznikl. Rozdíl proti obyčejnému výčtu souborů je v tom, že z archivu linker vytáhne jen to, na co se někdo odkazuje.
Není to nápad z tohoto vydání. Tytéž volby zná linker lld z LLVM, v jehož manuálové stránce stojí, že jde o skupinu objektů, se kterou se zachází, jako by byly společně v archivu. Binutils si tím doplňuje kus rozhraní, na který jsou překladové systémy zvyklé odjinud.
K archivům patří ještě jedna změna: ld nově zpracuje i archiv bez rejstříku symbolů, a to ve všech formátech, ne jen v XCOFF. Chování je ve výchozím stavu zapnuté a vypíná se volbou --no-link-mapless.
Assembler: RISC-V přibývá, Arm dvě rozšíření stahuje
Assembler dostal volbu --reloc-section-sym se třemi hodnotami (all, internal, none). Řídí, jestli se relokace odkazující na lokální symboly přepíšou na symboly sekcí.
Delší je seznam nových rozšíření RISC-V. Ze standardních přibyla zalasr, svrsw60t59b, zvabd a smpmpmt ve verzi 1.0 a k tomu řada vektorových rozšíření se jmény začínajícími na zvqw, zvfw a zvfb; z dodavatelských pak xsmtvdot a xsmtvdotii od firmy SpacemiT. Úplný výčet je v poznámkách assembleru.
Opačným směrem jde Arm. Rozšíření TME a MPAMv2_VID se podle týchž poznámek nikdy neobjevila v žádném výrobku a Arm je z architektury stáhl; assembler na jejich instrukce a systémové registry nově upozorní varováním a podvolba +mpamv2 zmizela. Za zastaralé jsou označené i direktivy .vtable_entry a .vtable_inherit, které byly potřeba pro překladače GCC starší než 3.0.
Objdump ukáže, kde jsou globální proměnné
Nástroj objdump umí nově volbu --map-global-vars, která vypíše umístění a typ globálních proměnných v objektovém souboru. Poznámky k vydání u ní jmenují autora, Guillauma Vacheriase.
Spolu s readelf přijal objdump také volbu --debug-dir, kterou se dá říct, kde hledat oddělené soubory s ladicími informacemi. Rozklad instrukcí pro AArch64 zná navíc -M annotate, který u nedefinovaných instrukcí ukáže odpovídající symbol; na x86 a x86-64 dělá totéž u přímých operandů -M annotate-immediates.
Pro 32bitový s390 už překlad sám od sebe neproběhne
Podpora 32bitového cíle s390 je označená za zastaralou a počítá se s jejím odstraněním. Konfigurační skript na takový cíl hlásí chybu, kterou lze přebít volbou --enable-obsolete. Šedesátičtyřbitový s390x zůstává podporovaný beze změny.
Binutils v tom nejdou první. Podle týchž poznámek odstranilo jádro Linuxu 6.19 podporu 32bitové kompatibility s390 a knihovna glibc 2.43 i GCC 16.1 tenhle cíl označily za zastaralý s úmyslem ho v budoucnu vypustit. Ve stejném duchu se u rodiny H8 mění výchozí architektura z H8/300 na H8/300H, protože podpora té starší zmizela z GCC už v roce 2020.
Liché číslo znamená bez GOLDu
Oznámení připomíná pravidlo, které nováčka zaskočí: protože jde o liché vydání, zdrojové texty linkeru GOLD v balíku nejsou. Kdo je potřebuje, musí sáhnout po sudé verzi nebo přímo do repozitáře.
Archivy se zdrojovými texty jsou přitom sestavené tak, aby šly sestavit znovu se stejným výsledkem: skript src-release.sh soubory seřadí a předá taru pevné datum, které se bere z posledního commitu souboru bfd/version.m4. Kdo si chce ověřit, že stažený archiv odpovídá zdrojovému stromu, má tím pádem z čeho vyjít.
K běžnému uživateli se novinky dostanou přes distribuce, které si sadu přebalují samy; na vydání samotné je vázaný jen ten, kdo si toolchain překládá. O vydání psal také Phoronix, který si všímá, že týž víkend vyšla i knihovna GNU C Library 2.44.