Il 4 agosto si è svolta la pubblicazione Wild 0.10 — di un linker libero, scritto in Rust e progettato principalmente per la rapida compilazione di programmi su Linux. Il linker esegue l'ultima fase della compilazione: unisce file oggetto e librerie in un file eseguibile pronto o in una libreria condivisa. Wild può essere utilizzato come sostituto di GNU ld, LLD e Mold, anche se l'obiettivo finale dichiarato dagli sviluppatori - la linkazione incrementale - non è ancora stato realizzato.
Una delle principali novità è stata il supporto per i parametri —gdb-index e —no-gdb-index. Attivando questa funzionalità, Wild crea nel file di uscita la sezione .gdb_index con l'indice delle informazioni di debug. Grazie a questo, GDB può trovare più velocemente i simboli necessari in programmi di grandi dimensioni, senza dover formare l'indice separatamente dopo la compilazione. L'implementazione supporta la nona versione del formato GDB Index; le operazioni di scansione, unione e scrittura dell'indice sono state parallelizzate.
Significativamente ampliato il lavoro con gli script del linker. Aggiunto il supporto per:
- sezioni /DISCARD/ per escludere sezioni di input non necessarie;
- intestazioni di programmi PHDRS personalizzate;
- funzioni SIZEOF_HEADERS, DEFINED e SEGMENT_START;
- la parola chiave AT e la funzione LOADADDR;
- espressioni condizionali con l'operatore ternario;
- i comandi SORT, SORT_BY_NAME e SORT_BY_ALIGNMENT;
- il simbolo __bss_start;
- modelli di riempimento delle sezioni di uscita;
- i comandi OUTPUT_FORMAT e OUTPUT_ARCH;
- diversi contatori relativi all'indirizzo corrente.
La piena compatibilità con GNU ld non è ancora stata raggiunta. Ad esempio, parte delle funzionalità del comando MEMORY, le sezioni OVERLAY e alcuni metodi di posizionamento delle sezioni rimangono incompleti. Gli sviluppatori tengono separatamente un elenco delle funzionalità necessarie per il linking del kernel Linux.
Migliorata la prestazione nel posizionamento dei risultati di compilazione su Btrfs e VFAT. Wild ora utilizza automaticamente la modalità —no-mmap-output-file e non mappa il file di output in memoria tramite mmap. In un test condotto dagli sviluppatori, la compilazione di Zed su Btrfs ha portato a una riduzione del tempo da circa 2,6–2,8 a 1,5–1,8 secondi. Tuttavia, l'autore della modifica avverte che, anche dopo l'ottimizzazione, Btrfs in questo scenario rimane significativamente più lento di tmpfs; per Ext4 e XFS, al contrario, l'uso di mmap si è rivelato più vantaggioso.
Continua il trasferimento di Wild su altri formati e piattaforme. La versione sperimentale per WebAssembly è già in grado di compilare diversi programmi, mentre il porto per Mach-O supporta file eseguibili semplici. È stata avviata la lavoro su piattaforme a 32 bit, il che dovrebbe semplificare l'uso di Wild nello sviluppo di sistemi embedded. È stata anche aggiunta la prima elaborazione dei file oggetto PowerPC64 ELFv2 e proseguito lo sviluppo del supporto Mach-O, comprese le librerie oggetto universali e la compilazione diretta con librerie dinamiche. Questi porting non devono ancora essere considerati pronti per l'uso quotidiano.
La versione della libreria del linker libwild ora può ricevere file di input e salvare il risultato direttamente in memoria. Questo consente ad altri programmi di integrare Wild senza dover creare file intermedi sul disco. Inoltre, la libreria non sovrascrive più il pool globale di thread Rayon e il supporto per la compressione Zstandard può essere disattivato durante la compilazione.
Il rilascio include numerose correzioni per x86-64, AArch64, RISC-V e LoongArch64. Sono stati risolti problemi di gestione TLS, PLT, LTO, informazioni di debug compresse, grandi allineamenti e spostamenti nei file PIE e negli oggetti condivisi. Sono state corrette potenziali chiusure anomale durante l'analisi degli script del linker e errori nella formazione delle sezioni .tbss, .strtab e .eh_frame.
Wild supporta Linux su architetture x86-64, AArch64 e RISC-V; il supporto per LoongArch64 e PowerPC64LE è attualmente indicato come iniziale. È possibile installare il linker da archivi già pronti, tramite cargo-binstall, Homebrew, Nix o con il comando cargo install —locked wild-linker. Il codice sorgente è distribuito a scelta dell'utente sotto licenze Apache 2.0 o MIT.
Fonte: linux.org.ru
