programmatūra · 6 min · 27.07.2026

Binutils 2.47: linkera -O 0 izslēdz sekciju sapludināšanu, fails iznāk lielāks

Nick Clifton 26. jūlijā paziņoja par GNU Binutils 2.47. Linkera optimizācijas līmenis -O 0 tagad izslēdz sapludināmo sekciju apvienošanu. Saistīšana notiek ātrāk, gatavais fails iznāk lielāks.

Binutils ir asamblētājs, linkeris un binārā koda apskates rīku kopa, ko izmanto katrs GCC izsaukums uz Linux. Jauni laidieni iznāk apmēram reizi pusgadā. Pirmkodu var ņemt no ftp.gnu.org vai Sourceware spoguļa.

-O 0 nodod izvēli izstrādātājam

Līdz šim ld sapludināmās sekcijas apvienoja vienmēr. Praksē tas nozīmē izlasīt katras ievades sekcijas saturu, salīdzināt ar jau redzēto un izmest dublikātus. Tur parasti ir virkņu literāļi un atkļūdošanas dati, tāpēc ietaupījums failā ir reāls. Samaksa ir laiks.

Ar -O 0 šis solis pazūd. Lielā C++ projektā, kur pilna saistīšana atkārtojas desmitiem reižu dienā, tas ir jūtams izstrādes ciklā. Ražošanas būvējumam līmeni var atstāt noklusējumā, jo tur svarīgāks ir izmērs. Līdz šim šo izvēli linkerī izdarīt nevarēja. Sapludināmās sekcijas atzīmē asamblētājs. ld tās apvienoja bez izņēmuma.

Otrs jaunums linkerī ir --start-lib un --end-lib. Objektu failu grupu starp šiem karodziņiem ld apstrādā tā, kā tas apstrādātu arhīva biedrus: ņem tikai tos failus, kuros ir kāds vajadzīgs simbols. Tas pats efekts, kas ar .a arhīvu, bez arhīva veidošanas soļa. Būvsistēmām, kas objektu failus ģenerē un uzreiz saista, viens solis atkrīt. Tāda pati loģika pieejama ar LIB priekšrakstu linkera skriptā.

Klāt nākuši arī --link-mapless un --no-link-mapless. Tie nosaka, ko ld dara ar arhīvu, kuram nav simbolu indeksa. Tādi arhīvi rodas, kad kāds izlaiž ranlib soli vai kad arhīvu veido cita rīku ķēde. Agrāk saistīšana šādā vietā vienkārši apstājās. Tagad ar formātiem, kas to pieļauj, arhīvu var izlasīt bez indeksa.

objdump rāda, kur dzīvo globālie mainīgie

Jaunais karodziņš --map-global-vars liek objdump izdrukāt globālo mainīgo izvietojumu un tipus. Agrāk to nācās salikt kopā no atkļūdošanas informācijas ar atsevišķiem rīkiem vai skriptiem. Kam jāsaprot, cik daudz statisko datu programma ievelk .data un .bss sekcijās, tam tagad pietiek ar vienu komandu.

Objdump un readelf ieguva arī --debug-dir=DIR. Ar to norāda mapi, kurā meklēt atdalītos atkļūdošanas failus. Distribūcijās, kas debuginfo tur atsevišķās pakotnēs, tas atrisina bieži sastopamu situāciju, kad rīks bināro failu atrod, bet simbolus tam nepiekārto.

Disasamblētājs nosauc simbolu pie nesaprastas instrukcijas

AArch64 disasamblētājs pieņem -M annotate. Ja vietā, kur gaidāma instrukcija, patiesībā ir dati, rīks blakus izdrukā simbolu, kas šai adresei piesaistīts. x86 un x86-64 disasamblētājam ir radniecīgs -M annotate-immediates, kas nosauc simbolus pie tūlītējām vērtībām.

Abi karodziņi palīdz lasīt izvadi tur, kur kods un dati atrodas vienā sekcijā. Programmaparatūras, sāknētāju un iegultā koda analīzē tā ir ikdiena. Līdz šim šādu vietu nācās atšifrēt ar roku: paņemt adresi no disasamblētāja izvades, tad pameklēt to readelf -s sarakstā. Ar -M annotate abas darbības saplūst vienā izvadē.

RISC-V sarakstā vairāk nekā 15 jaunu paplašinājumu

Asamblētājs saprot jaunas standarta specifikācijas: zalasr 1.0, svrsw60t59b 1.0, zvabd 1.0 un smpmpmt 1.0. Klāt nākuši vektoru skalārā reizinājuma paplašinājumi zvqwdota8i, zvqwdota16i un zvfwdota16bf. FOSS Force saskaita vairāk nekā 15 jaunus standarta paplašinājumus vienā laidienā. Instrumenti šeit iet pa priekšu dzelzij: atbalsts asamblētājā parādās ilgi pirms mikroshēmām, kas šīs instrukcijas izpilda.

Asamblētājam ir arī jauns karodziņš --reloc-section-sym=[all|internal|none]. Tas nosaka, vai relokācijas, kas atsaucas uz lokāli saistītiem simboliem, tiek pārrakstītas uz sekcijas simboliem. Rīkiem, kas objektu failus pēc tam paši apstrādā, šī uzvedība mēdz būt svarīga. Līdz šim to mainīt nevarēja. Trīs vērtības ļauj izvēlēties visas relokācijas, tikai iekšējās vai nevienu.

gold pirmkoda arhīvā nav, 32 bitu s390 novecojis

Binutils 2.47 arhīvā gold linkera pirmkoda nav. Iemesls ir laidiena numurs. Tā Klifton to formulē paziņojumā:

the sources for the GOLD linker are not included

Kārtību ieviesa 2.44 laidiens 2025. gada februārī: pāra numuru laidieniem ir divi arhīvi, viens ar gold un viens bez tā, nepāra numuru laidieniem tikai viens.

gold ir pasludināts par novecojušu un tiks izņemts pavisam, ja neatradīsies izstrādātāji, kas to uztur. Kam gold vajag, tas to joprojām var paņemt no pēdējā pāra numura laidiena arhīva.

Atbalsts 32 bitu s390 mērķim ar šo laidienu pasludināts par novecojušu. 64 bitu s390x paliek un tiek uzturēts.

Pirmkods jau ir GNU spoguļos. Linuxiac norāda, ka rolling laidienu distribūcijas jauno binutils saņem pēc pārbūves pārbaudēm, jo asamblētāja vai linkera maiņa uzreiz ietekmē visu pakotņu koku. Distribūcijām ar iesaldētu instrumentu kopu 2.47 pienāks nākamajā laidienā.

Vēl viena praktiska maiņa attiecas uz pašiem arhīviem: tie veidoti reproducējami. Faili sakārtoti noteiktā secībā, laika zīmogi vienādoti. Kas grib pārliecināties, ka publicētais arhīvs atbilst repozitorijam, var pats izveidot tādu pašu arhīvu un salīdzināt kontrolsummu.

Avoti

komentārisaruna

Komentāri

Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.

Pievieno komentāru

Tavs e-pasts netiks publicēts. Obligātie lauki atzīmēti.

vēl no programmatūrasaistītie