Přeskočit na obsah
Magazín Chatujme.cz
Programování · čtení na 3 min

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.

Vytištěný výpis programu v assembleru pro procesor Motorola 6800
Výpis v assembleru pro osmibitový procesor Motorola 6800. Assembler 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 objdumpreadelf. 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--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, zvabdsmpmpmt ve verzi 1.0 a k tomu řada vektorových rozšíření se jmény začínajícími na zvqw, zvfwzvfb; z dodavatelských pak xsmtvdotxsmtvdotii 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.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.

Diskuse

Zatím tu nikdo nediskutuje. Můžete být první.

Napsat příspěvek

Diskutovat můžete i bez účtu. S registrací se ale příspěvek zveřejní hned a nemusíte pokaždé vyplňovat jméno. Účet už máte? Přihlaste se.

Nezveřejňujeme ho, slouží jen redakci.

Podporuje zápis Texy: **tučně**, *kurzíva*, odrážky, odkazy.

Dál k tématu

Programování

Překladač Rustu zrychlil za osm měsíců o 5,6 %. Polovinu z toho udělal jediný nástroj

Nicholas Nethercote měří rychlost překladače Rustu deset let a jednou za čas sepíše, co se změnilo. Poslední shrnutí vyšlo 31. července: průměrné zkrácení doby překladu 5,59 %, z toho zhruba polovina připadá na dokumentační nástroj. Zajímavější než ta čísla jsou ale dva jednotlivé případy – jeden o prázdných voláních, druhý o osmi bajtech navíc.

Programování

Turso přepsal SQLite do Rustu, nad stejným jádrem teď staví Postgres. Zatím jen ze zdroje

Databázový projekt Turso, který vznikl jako přepis SQLite do jazyka Rust, oznámil 16. července, že nad stejným jádrem staví i Postgres. Autoři to popisují jako „LLVM databází“: jedno jádro a víc jazykových rozhraní nad ním. Hotová databáze to zatím není – balíčky ke stažení neexistují a oznámení samo mluví o základu, ne o hotovém produktu.