4 sierpnia odbyła się premiera Wild 0.10 — wolno stojącego linkera, napisanego w Rust, przeznaczonego przede wszystkim do szybkiego budowania programów w Linuxie. Linker wykonuje końcowy etap budowy: łączy pliki obiektowe i biblioteki w gotowy plik wykonywalny lub bibliotekę dzieloną. Wild może być używany jako zamiennik GNU ld, LLD i Mold, chociaż zadeklarowanym celem twórców jest — inkrementalna linkacja — na razie nie została zrealizowana.
Jedną z głównych nowości jest wsparcie dla opcji —gdb-index i —no-gdb-index. Po włączeniu tej funkcji Wild tworzy w pliku wyjściowym sekcję .gdb_index z indeksem informacji debugowania. Dzięki temu GDB może szybciej znajdować potrzebne symbole w dużych programach, bez tworzenia indeksu osobno po kompilacji. Implementacja obsługuje dziewiątą wersję formatu GDB Index; operacje skanowania, łączenia i zapisywania indeksu zostały zrównoleglenie.
Znacznie rozszerzono działanie z skryptami linkera. Dodano wsparcie dla:
- sekcji /DISCARD/ do wykluczania niepotrzebnych sekcji wejściowych;
- użytkowych nagłówków programów PHDRS;
- funkcji SIZEOF_HEADERS, DEFINED i SEGMENT_START;
- słowa kluczowego AT i funkcji LOADADDR;
- wyrażeń warunkowych z operatorem ternarnym;
- komend SORT, SORT_BY_NAME i SORT_BY_ALIGNMENT;
- symbolu __bss_start;
- wzorców wypełniania sekcji wyjściowych;
- komend OUTPUT_FORMAT i OUTPUT_ARCH;
- kilku względnych liczników bieżącego adresu.
Pełna zgodność z GNU ld nie została jeszcze osiągnięta. Na przykład część funkcjonalności komendy MEMORY, sekcje OVERLAY i niektóre sposoby rozmieszczania sekcji pozostają nieukończone. Twórcy prowadzą osobno tabelę funkcjonalności potrzebnych do linkowania jądra Linux.
Poprawiono wydajność przy umieszczaniu wyników budowy na Btrfs i VFAT. Wild teraz automatycznie używa trybu —no-mmap-output-file i nie mapuje pliku wyjściowego w pamięci przez mmap. W przeprowadzonym przez twórcę teście linkowania Zed na Btrfs czas skrócił się z około 2,6–2,8 do 1,5–1,8 sekundy. Przy tym autor zmiany przestrzega, że nawet po optymalizacji Btrfs w tym scenariuszu pozostaje znacznie wolniejsze od tmpfs; dla Ext4 i XFS wykorzystanie mmap okazało się natomiast korzystniejsze.
Trwa przenoszenie Wild na inne formaty i platformy. Wersja eksperymentalna dla WebAssembly jest już w stanie kompilować szereg programów, a port dla Mach-O — najprostsze pliki wykonywalne. Rozpoczęto prace nad 32-bitowymi platformami docelowymi, co w przyszłości powinno ułatwić zastosowanie Wild w rozwoju systemów wbudowanych. Dodano również wstępne przetwarzanie plików obiektowych PowerPC64 ELFv2 i kontynuowane są prace nad wsparciem Mach-O, w tym uniwersalnymi plikami obiektowymi i bezpośrednią kompilacją z dynamicznymi bibliotekami. Te porty na razie nie powinny być uważane za gotowe do codziennego użytku.
Biblioteczna wersja kompilatora libwild teraz może odbierać pliki wejściowe i zapisywać wyniki bezpośrednio w pamięci. Umożliwia to innym programom osadzanie Wild bez konieczności tworzenia pośrednich plików na dysku. Ponadto, biblioteka już nie nadpisuje globalnej puli wątków Rayon, a wsparcie dla kompresji Zstandard można wyłączyć podczas kompilacji.
W wydaniu znalazło się wiele poprawek dla x86-64, AArch64, RISC-V i LoongArch64. Naprawiono błędy w obsłudze TLS, PLT, LTO, skompresowanej informacji debugowania, dużych wyrównań i przesunięć w obiektach PIE i współdzielonych. Naprawiono możliwe awarie podczas analizy skryptów kompilatora oraz błędy w tworzeniu sekcji .tbss, .strtab i .eh_frame.
Wild wspiera Linux na architekturach x86-64, AArch64 i RISC-V; wsparcie dla LoongArch64 i PowerPC64LE jest na razie oznaczone jako wstępne. Kompilator można zainstalować z gotowych archiwów, za pomocą cargo-binstall, Homebrew, Nix lub komendą cargo install —locked wild-linker. Kod źródłowy jest dystrybuowany do wyboru użytkownika na licencji Apache 2.0 lub MIT.
Źródło: linux.org.ru
