This release comes with a lot of bug fixes. Most of the new features are linker-script related. You
can see the current status of linker script support in
LINKER_SCRIPT_SUPPORT.md. Another significant feature worth calling out
is support for --gdb-index.
Not much changed in terms of performance. The most notable change was that we now avoid using mmap on the output file if it's on a btrfs or vfat filesystem, which gives a bit of a speed-up, although you're still much better off avoiding these filesystems for your builds if at all possible.
Much porting work has been done. The Wasm port can now link a range of programs. Mach-O still has a way to go, but can link some very simple programs. We've also started work on adding 32 bit support, which will make it easier for projects doing embedded work to be able to use Wild.
Wild is starting to get used by some other projects as a library (libwild). This release makes it possible to use libwild with input and output files in memory.
- Support evaluating SEGMENT_START with evaluate_expression (#1959)
- Add support for the DISCARD section in linker scripts (#1978)
- Add
--discard-sframeflag (#1982) - Support top-level symbol definitions within the sections command (#2002)
- Support using an expression when setting the location counter (#2005)
- Support defining custom phdrs in linker scripts (#2013)
- Support
--rosegmentand--no-rosegment(#2022) - Always emit .riscv.attribute when using linker scripts (#2021)
- Add support for the SIZEOF_HEADERS builtin function (#2030)
- Add support for the AT keyword in output sections (#2043)
- Use the LMA when calling LOADADDR in linker scripts (#2048)
- Support GDB index (#1990)
- Support setting an output section's region (#2078)
- Add
--compress-debug-section=zlib-gabias an alias for--compress-debug-section=zlib(#2097) - Calculate section layouts and part layouts at the same time (#2103)
- Add built-in symbol
__bss_start(#2124) - Use location counters within output sections in linker scripts (#2136)
- Implement SORT() directive for linker scripts (#1994)
- Implement ternary operations in linker scripts (#2166)
- Parse and ignore
CONSTRUCTORSin linker scripts (#2180) - Define multiple location counters that are relative to each other (#2151)
- Support the DEFINED command in linker scripts (#2181)
- GOT-based RELR bitmap packing (#2196)
- Print version and emulation info when the -V flag is used (#2201)
- Support specifying an output section's fill pattern in a linker script (#2226)
- Implement --sort-section flag (#2230)
- Parse an optional comma after output sections in linker scripts (#2246)
- Define multiple program headers per output section in linker scripts (#2256)
- Introduce FileSystem abstraction (#2267)
- Evaluate the modulo operator in linker scripts (#2292)
- Implement
OUTPUT_FORMATandOUTPUT_ARCHin linker scripts (#2295) - Implement
SORT_BY_NAMEandSORT_BY_ALIGNMENT(#2296)
- Default to --no-mmap-output-file when writing to btrfs/vfat (#2051)
- Make gdb-index building do less heap allocation (#2057)
- Avoid b-tree and parallelise symbol sort in gdb-index (#2073)
- Parallelise merging of gdb index scans (#2079)
- Write GDB index concurrently with rest of file (#2084)
- Don't sort GDB index symbols (#2087)
- Don't flatten symbol buckets when writing GDB index (#2088)
- Remove unnecessary Vecs for cv_offsets and name_offsets (#2094)
- Write gdb index constant pool in parallel (#2095)
- Drop unused flag --debug-address (#2219)
- Unify more arguments among platforms (#2036)
- Keep
--defsym/linker-script redirect targets alive through LTO (#1979) - Properly handle PLT references via thunks (#1989)
- (LoongArch64/RV64) Allow empty sequence for merge_eflags (#1996)
- Don't bail when a linker plugin doesn't claim an IR archive member (#2027)
- Support R_X86_64_PC32 relocations to absolute addresses (#2050)
- Don't output -ggnu-pubnames sections when --gdb-index is active (#2054)
- Use 0x10000 as default load address for RISC-V (#2055)
- Support
--wrapcombined with linker plugin LTO (#2081) - (loongarch64) Treat R_LARCH_CALL36 as PLT-generating (#2093)
- Error on sub-pointer-size absolute relocations in shared objects (#2083)
- Don't panic on linker script section names shorter than 4 bytes (#2104)
- Accept full byte range for R_X86_64_8 and R_X86_64_16 relocations (#2105)
- Add RWX LOAD segment for sections with writable+executable flags (#2111)
- Don't compress
SHF_ALLOCdebug sections (#2119) - Apply linker-managed section rules when using linker scripts (#2123)
- --compress-debug-sections drops merged-string offset map (#2118)
- Error on R_X86_64_32/32S against DSO symbols in PIE output (#2125)
- Error on R_X86_64_PC32 to DSO symbols in non-executable sections in PIE (#2132)
- Reject R_X86_64_8/16/PC8/PC16 against preemptible symbols in shared objects (#2146)
- Reject absolute R_X86_64_8/16 against non-preemptible symbols in shared objects (#2150)
- Create canonical PLT entry for R_X86_64_PC32 to STT_FUNC DSO symbols in PIE (#2152)
- Relax -z noplt form of TLS GD to Local Exec on x86_64 (#2160)
- Relax -z noplt form of TLS GD to Initial Exec on x86_64 (#2165)
- Emit one zlib stream per compressed debug section (#2162)
- Implement RELR bitmap packing for consecutive relocations (#2179)
- Don't count .tbss size towards TLS segment file size (#2190)
- Do not allocate space for uninitialized tls variables (#1788)
- Use nop padding bytes in executable sections on x86 (#2200)
- Properly handle eh_frame terminators (#2208)
- Don't double count section sizes in scripts (#2214)
- Do not retain a linker script output section if a symbol is defined after it (#2243)
- Avoid segment overlap due to large .tbss (#2252)
- Properly handle large alignments in .tbss (#2253)
- Error on R_AARCH64_ABS32/ABS16 against symbols in shared objects (#2250)
- Error on non-PIC AArch64 relocations against preemptible symbols in shared objects (#2273)
- Avoid applying ELF-specific entry behaviour to other platforms (#2275)
- Error on R_AARCH64_PREL16/32/64 against preemptible symbols in shared objects (#2274)
- Avoid range error for aarch64 TPOFF rel against undefined weak tls (#2284)
- Skip mapping symbols in unloaded sections during relocatable link (#2305)
- Do not store the section name of a section symbol in .strtab (#2310)
- OR GNU property notes within file before ANDing across files (#2309)
- (README.md) Structure "using Wild" part (#2023)
- Update LINKER_SCRIPT_SUPPORT.md (#2034)
- Fix cross-arch setup instructions for loongarch64 and add ppc64le (#2197)
- Document usage with CMake 4.4+ (#2331)
- Add section emitters for type / import / function / global / export (#1987)
- Build initial output module layout (#2037)
- Build and emit metadata section (#2042)
- Build and emit code and memory sections (#2047)
- Apply code section index relocations (#2058)
- Resolve cross-object imports (#2092)
- Add per-object data segment layout and emission (#2117)
- Apply data relocations (#2135)
- Link clang objects with memory, stack, and data addresses (#2145)
- Allow linking against archives containing Wasm objects (#2154)
- Absorb indirect function tables and apply table relocations (#2163)
- Keep standard sections off the generic allocation path (#2170)
- Add linker-defined memory base,
MEMORY_ADDR_REL_SLEBrelocation, andcall_ctorsstubs (#2176) - Deduplicate the output type section (#2187)
- Resolve
__data_endand__heap_baseas linker data addresses (#2188) - Synthesize
__wasm_call_ctorsfrom InitFuncs and wrap the command entry (#2192) - Link static WASI libraries and preserve host imports (#2202)
- Align data segments and stack like wasm-ld (#2206)
- Support
--exportin Wasm (#2211) - Support
-z stack-sizefor Wasm (#2224) - Synthesize
__wasm_first_page_endand__heap_endfor WASI heap (#2227) - Emit the custom
namesection for function and global names (#2233) - Speed up Wasm data segment layout by fixing reloc classification (#2235)
- Speed up data symbol address lookup with O(1) segment indexing (#2239)
- Define Wasm linker symbols through SymbolDb (#2238)
- Accept constructors with non-void return types (#2244)
- Support
R_WASM_TABLE_INDEX_REL_SLEB(#2245) - Define linker-synthesized
__table_base(#2251) - Defer reloc entry decoding to layout (#2262)
- Support
--stack-firstfor Wasm (#2254) - Support
--entry/--no-entry(#2272) - Change default to --stack-first (#2278)
- Synthesize GOT.mem globals for
R_WASM_GLOBAL_INDEX(#2271) - Avoid cloning symbol tables during module layout (#2293)
- Resolve undefined weak functions to unreachable stubs (#2307)
- Emit
target_featurescustom section from linked objects (#2308) - Coalesce identical host imports across objects (#2313)
- Use
RelocationTypefromwasmparsecrate (#2317) - Report unrecognized options (#2318)
- Parallelize code and data section emission (#2322)
- Add symlinks and support -m wasm32 (#2329)
- Support
--initial-memory(#2325)
- Improve error message about FAT objects (#1972)
- Parse more options and identify stub libs (#1973)
- Support for linking against stub libraries (#2031)
- Simplify LOAD_COMMANDS and support more LC_LOAD_DYLIB (#2062)
- Switch from arm64-macos to arm64e-macos (#2086)
- Allow linking against archives containing MachO objects (#2110)
- Refactor how imported_symbols and imported_libraries work (#2109)
- Add BuildVersion cmd (#2121)
- Add support for fat objects (#2122)
- Use sequential imported library ordinals (#2128)
- Add support for fat-64 objects (#2127)
- Error on undefined symbol (#2129)
- Don't strip unused dylibs by default (#2142)
- Support direct linking against dylibs (#2158)
- Support fat dylibs (#2159)
- Align __LINKEDIT sections (#2186)
- Fix chained fixups __DATA_CONST segment index (#2195)
- Write LC_UUID hash (#2223)
- Add
__constsection to output order (#2249) - Introduce
SectionIdentity(#2312) - Plug stub symbols into symbol DB (#1984)
- (ppc64) Recognise ppc64 (PowerPC64, ELFv2) ELF objects (#1976)
- (ppc64) Decode the static relocation subset (#1977)
- (ppc64) REL24 local entry plus REL32/ADDR32/REL64 (#1999)
- (zkvm) Workaround weird behavior of
env::var(#2213)
- Do not override the global Rayon thread pool (#2209)
- Make zstd support optional at build time (#2210)
- Change save-dir so that arguments go at the end, not the start (#2232)
- Only move arguments after -- to the end in save-dir (#2270)
- Allow experimental platforms via env var (#2321)
- Use ANSI colors for the tracing output (#2010)
The Wild repository moved to a GitHub org, so is now at https://github.com/wild-linker/wild. The old URL should redirect to the new one.
A lot of work in this release was related to porting to other platforms. We did a large number of refactorings to put ELF-specific behaviour behind traits. We've also started work on porting to Mach-O and WebAssembly. These aren't yet ready for use, but if you'd like to help out with porting, get in touch.
Wild now supports the linker plugin API that was originally part of the Gold linker, but which is also supported by GNU ld and Mold. This lets us do linker-plugin LTO (link time optimisation). There are still a few known issues, but it's already working on a good range of programs. Pure Rust projects generally don't use linker plugins, since Rust can do LTO within the compiler, so this is mostly helpful for C, C++ or mixed language projects. Note that when using a linker plugin, link times will be very slow.
Lots more linker-script features were implemented during this release.
- Support
--dependency-file(#1467) - Add built-in symbol __executable_start (#1473)
- Allow specifying library search paths in version scripts and export lists (#1477)
- Add support for
--auxiliaryarg (#1488) - Allow excluding symbols from specific libraries via
--exclude-libs(#1494) - Support
--enable-new-dtagsand--disable-new-dtags(#1507) - Add flag to turn off version in .comment (#1504)
- Support
PROVIDEandPROVIDE_HIDDENlinker script directives (#1525) - Reject conflicting RISC-V ISA extensions (#1526)
- Add support for linker plugins (#1411)
- Add base to track byte reduction due to relaxation (#1527)
- Support RISC-V call relaxation (#1552)
- Define
_etext,__etextand_edataspecial symbols (#1563) - Don't bail on
--use-android-relr-tagsand--pack-dyn-relocs=relr(#1566) - Support RISC-V HI20 relaxation (#1574)
- Support matching based on linker script input filenames (#1596)
- Support lui deletion in RISC-V HI20 relaxation when %hi is zero (#1636)
- Implement PROVIDE semantics for linker-defined symbols (#1534)
- Implement R_X86_64_CODE_* relocations with relaxations (#1632)
- Add ASSERT command parsing support to linker scripts (#1607)
- Support building on Windows (#1629)
- Bail when an input file requests exec stack and it is not allowed (#1675)
- Add support for
--trace(#1699) - Evaluate linker script ASSERT commands (#1695)
- (loongarch64) Add allowed range and alignment by spec (#1734)
- Allow users of libwild to capture all warnings (#1756)
- (AArch64) Support 2 more relocations (#1760)
- Add support for generating static relocatables (#1698)
- Support bitwise, logical, and unary operators in linker script expressions (#1768)
- Implement ALIGNOF linker script function (#1770)
- Support
R_RISCV_ALIGNrelaxation (#1772) - Support LOADADDR in linker scripts (#1780)
- Support K and M suffixes in linker script number literals (#1782)
- Support
-o/path(without the space) (#1785) - Add MEMORY block parsing and LENGTH/ORIGIN expression variants (#1792)
- Support
-z pack-relative-relocswithout actual packing (#1701) - Support
--pack-dynamic-relocs=relr(#1804) - Implement ORIGIN and LENGTH evaluation in linker script expression eval (#1803)
- Generate a .symtab_shndx section when shnum > 65k (#1783)
- Handle output section header start addresses in linker scripts (#1850)
- Support
--use-android-relr-tags(#1805) - Implement range-extension thunks for aarch64 (#1847)
- Select platform based on
-flavor, arg0 then host (#1873) - Add -Ttext/-Tdata/-Tbss segment layout for SEGMENT_START support (#1877)
- Support SEGMENT_START function in Linker Script (#1851)
- Support
--compress-debug-sections(#1881) - Evaluate expressions within PROVIDE with
evaluate_expression(#1925) - Implement symbol resolution within the ASSERT command (#1931)
- Support
--nmagic(#1884) - Support PROVIDE within the SECTIONS toplevel command (#1947)
- Reduce use of starts_with in version script parsing (#1514)
- Add fast path for non-glob version script matchers (#1515)
- Reduce atomic operations for tracking sections with content (#1517)
- Fix performance loss of ctor/dtor ordering (#1522)
- Parallelize section and symbol address computation in relaxation scan (#1575)
- Skip fully-resolved sections in subsequent relaxation iterations (#1580)
- Skip relaxation iteration early when no rescan candidates remain (#1582)
- Change release profile to use codegen-units=1 (#1500)
- Fill padding bytes once instead of 3 times (#1889)
- (benchmarks) Use parent directory of args.tmp for filesystem checking (#1458)
- Delete the file instead of truncating it when updating busy executable (#1466)
- Use version_r when resolving undefined symbols in shared objects (#1469)
- Address equality for exported ifunc symbols (#1452)
- Resolve weak undefined symbols to zero in read-only sections (#1474)
- Properly merge
.ctors/.dtorssections into.init_array/.fini_array(#1479) - Align RELRO segment end to page boundary (#1496)
- Handle symbols with empty versions (#1480)
- Use actual segment alignment in
layout_section_parts(#1501) - Properly handle version script WRT symbols with multiple defs (#1519)
- Make
--versionexit immediately,-vcontinue linking (#1521) - Properly handle entry symbol being weak and overridden (#1530)
- Placed downgraded symbols from version script correctly in .symtab (#1553)
- Do not bail when encountering unsupported SFrame version (#1577)
- Avoid updates to perf-event due to breaking changes (#1591)
- Use correct symbol priority when primary definition is dynamic (#1601)
- Prevent panic when writing to stdout fails in
--versionand--help(#1631) - Don't use nop for calls to undefined functions (#1649)
- Make three more x86_64 relaxations required for static binaries (#1654)
- Print the correct message in
--sym-info(#1673) - Emit error for unterminated block comments in linker scripts (#1674)
- Warn rather than error on
--sort-sectionflag (#1684) - Emit error when shared objects required symbols are not provided (#1666)
- Hide linker-defined symbols in shared libraries (#1686)
- fix: Register linker plugin message callback first (#1697)
- Only emit
__global_pointer$on RISC-V (#1715) - COMMON/ABS symbols are now defined in .dynsym (#1685)
- Emit undefined symbol error even if primary reference is GCed (#1737)
- (AllowedRange) Tweak and add
AllowedRange::from_bit_size(#1742) - Don't report undefined symbols when writing executables with -z undefs (#1741)
- Make our warning format consistent with the other linkers (#1738)
- Don't skip undefined symbol error due to previous weak ref (#1740)
- Write warnings to stderr not stdout (#1752)
- Preserve hidden visibility when merging symbols and localize dynsym exports (#1700)
- Format linker plugin messages via C shim and prints full log messages. (#1774)
- Null-terminate linker identity string in .comment section (#1776)
- Correct
--helpmessages (#1784) - GC of sections referenced from debug info (#1787)
- Clear instruction immediate fields before writing relocations in LoongArch64 (#1791)
- Clear opcode and immediate fields before rewriting MOVZ/MOVN relocations in AArch64 (#1794)
- Correct debug relocation values for local symbols (#1806)
- Symtab symbol version added by .symver (#1811)
- Import just
GLIBC_ABI_DT_RELRversion (#1826) - Don't bypass dynamic symbol lookup due to unused hidden in archive (#1837)
- Copying debug symbols from debug info section (#1820)
- Sync GLOB_DAT allocation and writing conditions (#1845)
- Improve SHT_SYMTAB_SHNDX handling (#1846)
- Always handle elf::SHN_XINDEX when reading (#1852)
- Use correct addend for relocs referencing STT_SECTION (#1854)
- Resolve warning of cargo regarding yanked package (#1859)
- Support merging multiple eh_frame sections (#1867)
- Don't warn if unsupported
--pack-dyn-relocsis overridden (#1874) - Disable SFrame support by default (#1871)
- Emit error if attempting static link of dynamic object (#1886)
- Only keep RELRO_PADDING section when relro is enabled (#1892)
- Make --whole-archive work with linker plugins (#1900)
- (jobserver) ThreadPoolBuilder must use 1 thread with available_threads == 1 (#1904)
- Increase file limit when linker plugin is active (#1901)
- Implement plugin callsbacks required for thin LTO (#1902)
- Set file limit before we open input files (#1911)
- Bad allocation for versioned internal symbol (#1914)
- More robust code to get line numbers from debug info (#1923)
- Do not output SFrame section unless asked (#1916)
- Allow LTO to eliminate dead code (#1942)
- Handle missing version node for synthetic symbols (#1924)
- Fix resolution following linker scripts / synthetic symbols (#1953)
- Prevent GC of linker script symbol aliases (#1956)
- Load archive entries targeted by
--defsymand linker script aliases (#1957) - Emit error on missing resolution for symbol alias (#1961)
- Add code of conduct (#1630)
- Write up LLM use policy (#1618)
- Add governance documentation (#1656)
- Update communication options section in
CONTRIBUTING.md(#1676) - Add linker script support matrix and feature tracking (#1827)
- Use icons for implementation status (#1839)
- Simplify usage with GCC 16.1 (-fuse-ld=wild) (#1883)
- (README.md) Adjust what's not supported yet (#1906)
- Add instructions for installing with Brew (#1913)
- (MachO) Copy __text section from input, introduce more output commands (#1810)
- (MachO) Emit code signature (#1919)
- (MachO) Fat binary support (#1910)
- (MachO) Include collected notes (#1812)
- (MachO) Initial scaffolding and input file parsing (#1748)
- (MachO) Introduce feature and smaller refactoring (#1929)
- (MachO) Make __DATA segment optional (#1862)
- (MachO) Make simple executable running on a real system (#1816)
- (MachO) Section/segment mapping and first final output (#1795)
- (MachO) Support relocation handling (#1869)
- (MachO) Support symbol table (#1888)
- (MachO) Unify and refactor segment writer (#1821)
- (MachO) Use args.output for CS identifier (#1949)
- (wasm) Add section and program segment mapping (#1926)
- (wasm) Implement object file section accessors (#1936)
- (wasm) Implement object file symbol accessors and
Symboltrait (#1946) - (wasm) Initial scaffolding for WebAssembly support (#1912)
- (wasm) Parse
linkingandreloc.*custom sections (#1918) - (wasm) Support relocation encoding (#1964)
- Support running on wasi (#1723)
- Change C to 100 columns (#1928)
- Format TOML files and use taplo for checking (#1930)
- Add ymlfmt and format existing YAML files (#1652)
- Support passing a symbol ID to
--sym-info(#1511) - Fix save-dir when input filenames contain '=' (#1833)
- Save-dir now keeps at-files as separate files (#1834)
- Add some colour to
--sym-infooutput (#1844) - Use WILD_LOG environment variable rather than RUST_LOG (#1951)
- Make
--sym-infoshow canonical targets regardless of order (#1952) - Fix save-dir handling of response files (#1858)
- Identify some relaxations that LLD does (#1510)
- Support RISC-V attributes (#1535)
- Recognise additional indirections (#1642)
possible_relaxations_doin RISC-V (#1767)
- Use a separate subdirectory for each test config (#1495)
- Use wild 0.8.0 in CI (#1503)
- Add local config option to skip specific external tests (#1502)
- Hash input files rather than using timestamps (#1505)
- Allow ExpectError directive to use regular expressions (#1513)
- Enhance symbol expectation and configuration test coverage (#1597)
- Verify that all source files use unix line endings (#1671)
- Don't silently pass section assertion if symbol is undefined (#1683)
- Add test for weak ref to as-needed shared library (#1672)
- Add test for hidden symbol that can only be resolved from a DSO (#1688)
- Disable Go caching (#1696)
- Enable some libc-integration variants for riscv (#1704)
- Add support for cross-testing with clang (#1703)
- Include macOS build (#1733)
- Report file and line number when rejecting test directives (#1743)
- Integration tests can now call dynamic libraries (#1690)
- Remove command hash from object filenames (#1745)
- Use deps files to track gcc/clang inputs (#1747)
- Move integration tests to one dir per test (#1754)
- Switch from rstest to libtest-mimic (#1757)
- Speed up running single arch with nextest (#1758)
- Fix external test CI that was running but ineffective (#1761)
- Allow substring matching in test filters (#1764)
- Fix clang-format formatting check (#1779)
- Allow running external tests with third-party linkers (#1786)
- Support running unit tests on wasi (#1759)
- Remove regex from linker plugin test (#1790)
- Actually run wasm32-wasip1 tests (#1808)
- Move tidy tests to libwild (#1807)
- Add test to check for ELF-specific code in shared locations (#1809)
- Add a test for #1817 (#1819)
- Rebuild object files if command-line changes (#1818)
- Fix colourisation of test output when using nextest (#1843)
- Add an integration test for
--write-gc-stats(#1840) - Get cross tests working in OpenSUSE docker image (#1864)
- Add a test that verifies debug line info (#1878)
- Add basic support for running MachO tests (#1876)
- Check for unexpected warnings (#1885)
- Test handling of empty aligned section (#1894)
- Fix cache step: /bin/tar: unrecognized option: posix (#1896)
- Run tests on Mach-O (skip ELF tests), reorder CI jobs (#1895)
- Include stderr/stdout in failure message when match fails (#1944)
- Don't register plugin tests when plugins feature is disabled (#1954)
- Add test for linker script without
-T(#1955) - Validate that loadable segments don't overlap (#1950)
- Support
--hash-style={sysv, both}(#1281) - Support negation ('^') in version script globs (#1284)
- Support
PT_GNU_PROPERTY(#1297) - Support
--defsym=symbol=expression(#1300) - Support symbol definitions in linker script (#1307)
- Support merging non-string sections (#1306)
- Handle
-z x86-64-*ISA needed (#1320) - Ignore
--discard-all/-xoption (#1377) - Support SFrame (#1287)
- Support
--section-start=.section=address(#1385) - Add --no-update-in-place flag (#1395)
- Support
-z max-page-size(#1400) - LoongArch64 support (#1409)
- Support expressions in
--defsymand linker script symbol assignment (#1418) - Sort .init_array and .fini_array by priority (#1408)
- Support
--no-eh-frame-hdr(#1440) - Support
-z stack-size=SIZE(#1448) - Include metrics connected to '.eh_frame' (#1443)
- Add
--pic-executableas an alias for--pie(#1453) - Support
variant_pcs(#1272) - Support
.variant_cc(#1280)
- Make --update-in-place default and fallback to unlinking on ETXTBSY (#1238)
- Parallelize copying data sections (#1277)
- Avoid heap allocating each task during string merging (#1286)
- Minor improvement to cache efficiency of resolution (#1294)
- Merge some of the GC phases into a single phase (#1330)
- Process merge-string sections in mostly equal chunks (#1345)
- Run string merging and GC in parallel (#1339)
- Preallocate a Vec to avoid resizes (#1349)
- Optimize version script from rustc (#1355)
- Tweak how we determine the target number of groups (#1432)
- Ensure we write every byte of file even when updating in-place (#1276)
- Align output kind with LD in more cases (#1279)
- Don't try to emit copy relocations for non-canonical symbol aliases (#1308)
- Put common TLS symbols into correct section (#1310)
- Handle non-absolute paths with
--no-allow-shlib-undefined(#1321) - Do not add duplicated rpath entries (#1338)
save_dir::make_relative_path()now works as expected (#1337)- Reorder some sections so that objcopy doesn't complain (#1358)
- (save-dir) Handle @filename when processing save-dir (#1362)
- Use DT_SONAME to help determine if SO deps are met (#1390)
- (save-dir) Don't make paths in linker scripts relative if in sysroot (#1393)
- Relax debug info comparison against bfd (#1397)
- Don't exclude all libs when not yet supported --exclude-libs is passed (#1394)
- Properly resolve and retain defsym target symbols (#1402)
- (save-dir) Normalize source paths before checking if it's in sysroot (#1406)
- Resolve
__real_fooin--wrapeven without__wrap_foo(#1419) - (CREL) Reduce allocation for non-EH relocations (#1426)
- Don't try to copy CREL sections to output file (#1438)
- Ifunc address equality for data section references (#1441)
- Ifunc address equality for GOT-relative relocations (#1446)
- Improve building and benching docs for rustc (#1283)
- Add some info about our monthly dev team meetings (#1291)
- Update rustc building instructions & format all the rustflags consistently (#1324)
- Add alternative Clang invocation (#1334)
- Add instructions for using wild with clang and gcc (#1354)
- Add
PACKAGING.mdinstructions (#1342) - Improve instructions on checking if wild was actually used (#1316)
- Wrap comments at 100 characters (#1268)
- Update for inclusion in Nixpkgs (#1318)
- Make absolute address checking work correctly (#1417)
- Add support for writing perfetto traces (#1323)
- Add a tool to aid with running benchmarks (#1454)
- Add Dockerfile for Gentoo (#1373)
- Ignore VER_NDX_LOCAL vs GLOBAL for undefined symbols (#1424)
- LoongArch64 support (#1428)
- Make a test failure message less confusing (#1275)
- Set
timeout-minutesfor CI jobs (#1301) - Add a test for backtraces (#1353)
- Use a separate subdirectory for each tests build (#1404)
- Drop ubuntu 25.04 (#1433)
- Improve robustness of integration-test usage of run-with (#1437)
- Add cache for a couple of build jobs (#1434)
- Use separate archive sources for a couple of tests (#1401)
- Move contents of
exit.ctoruntime.c(#1447) - Add a test for
-Bsymbolic-non-weak(#1427) - Use rust-cache actions (#1444)
- Introduce
WILD_TEST_CROSS=all(#1425) - Introduce
SkipArchintegration test directive (#1415) - Include next upcoming LTS Ubuntu release (#1416)
- Run loongarch64 external tests (#1421)
- A few simplifications to sysvs .hash computations (#1282)
- Change resolution to use a work queue (#1290)
- Make timing annotations use tracing indirectly (#1295)
- Make secondary output sections more flexible (#1312)
- Decouple OutputKind from Args (#1293)
- Preparations to run string merging in parallel with GC (#1329)
- Change GC to use a channel for work control (#1331)
- Change GC phase to use rayon scopes (#1344)
- Rewrite input opening work control (#1348)
- Change symbol resolution to use rayon scopes (#1363)
- Have linker script emit symbol defs directly (#1364)
- Work towards being able to load additional batches of files (#1365)
- Separate Epilogue into two separate entities (#1367)
- Move dynamic symbol definitions onto layout (#1368)
- Move gnu property notes to the layout (#1369)
- Move riscv attributes to the layout (#1370)
- Move eflags out of the prelude (#1371)
- Get rid of SymbolDb::num_symbols_per_group (#1372)
- Allow SymbolDb to be built in stages (#1374)
- Allow symbol resolution to be done in stages (#1375)
- Parse files as we open them (#1380)
- Make InputRef implement Copy (#1382)
- Get rid of InputFile::kind (#1383)
- Split ResolvedObject into dynamic and non-dynamic variants (#1389)
- Drop fd-lock dev dependency (#1319)
- Port linked-diff table to tabled crate (#1361)
- davidlattimore
- lapla-cogito
- marxin
- mati865
- karolzwolak
- RossSmyth
- YamasouA
- csfore
- zyxhere
- tshepang
- TechnoPorg
- Add handling of the .symver asm directives (#994)
- Allow absolute-value symbol to be used as an entry point
- Allow setting entry point for shared objects
- Reintroduce handling of tail-merged strings (#1117)
- Implement --retain-symbols-file (#1262)
- Allow mixing of @file and regular arguments (#1148)
- Support
VERSIONcommand in linker script - Ignore '-no-fatal-warnings' option (#1192)
- Increase maximal supported alignment to 2^16 (#1190)
- Include git commit in linker version (#1203)
- Add support for .note.stapsdt sections (#1202)
- Check for overflow on 32bit relocations (#1175)
- Support tokens enclosed in double quotes in linker scripts
- Support flag --no-mmap-output-file (#1215)
- Limit default parallelism in string merging
- Rewrite scheduling of string merging tasks (#1240)
- Fill some bytes with zeros (affects --update-in-place) (#1237)
- Improve handling of non-absolute paths in save-dir (#1244)
- Pad copy relocations according to alignment (#1251)
- Don't allow hidden/protected symbols to reference shared objects (#1258)
- Use local symbol interposability when processing relocations (#1259)
- Make --strip-debug suppress earlier --strip-all (#1261)
- Fix compilation on riscv (#1100)
- Distinguish default version (@@) from non-default (@). (#1129)
- Only emit
PT_INTERPfor shared executables - Add RISCV_ATTRIBUTE program segment (#1166)
- Don't create GOT/PLT entries for ifuncs that aren't referenced (#1185)
- Improve handling of relocations in non-alloc sections (#1196)
- Fix lookup of the riscv-fix-hi-part (#1198)
- Make --warn-unresolved-symbols match GNU ld's behaviour (#1217)
- Handle missing GNU_PROPERTY .note.gnu.property values (#1222)
- Allow dynamic symbols to refer to merged strings (#1147)
- Build for
(aarch|x86_|riscv)64(|gc)-unknown-linux-(musl|gnu)(#1151) - Link musl releases with Wild
- Move nix docs to a separate file and update supported features list (#1113)
- Remove
archive_splitter.rsreference from DESIGN.md (#1145) - Update benchmarks, this time with bar charts
- Add instructions for using Wild with Rust on Illumos. (#1171)
- Document crate dependency version policy (#1140)
- Customise git-cliff config and document commit message format (#1267)
- Initial support for Illumos (#1197)
- Add support for RISC-V (#920)
- Ensure all columns in tables have same width (#1247)
- Use wild for build in CI (#1091)
- Verify build on riscv (#1101)
- Verify minimal versions in CI (#1142)
- Ignore some diffs in risc-v tests (#1236)
- Use test-config-ci.toml in CI (#1234)
- Report sections where --update-in-place misses writes (#1239)
- Set the
TRIPLEenvironment variable if needed when running mold tests - Fix potential template-injection in CI
- Fix a couple of tests that were failing on recent opensuse (#1241)
- Don't skip running dynamically linked executables (#1248)
- Apt-get update before installing for riscv build workflow (#1255)
- Prevent race between test cases re-creating the same .so file (#1107)
- Use depfile in integrationtests (#1123)
- Use correct exit syscall number on Illumos (#1138)
- Look for dynamic linker in /bin/less in integ test (#1159)
- Unignore
symbol-versions3.shMold test - Make integration test diffing an opt-in feature (#1158)
- Integration tests: Make symbol assertions more extensible (#1169)
- Better error message when test unexpectedly pasess (#1176)
- Print clang version when clang-format fails (#1183)
- Clarify clang-format version mismatch instructions (#1193)
- Increase test binary execution timeout (#1188)
- Add a test for handling of note sections (#1211)
- Integration tests: Make skipping tests on unsupported flags more generic (#1225)
- Integration tests: Make compilation errors easier to find (#1224)
- Add basic testing for update-in-place flag (#1230)
- Limit the conditions for executing
update-nix-lockfile
- Use u32_from_slice (#1128)
- Introduce BitExtraction trait for u64 (#1157)
- Restructure code in symbol_db.rs a bit (#1252)
- Build only C++ and Rust demanglers
- Simplify get_host_architecture (#1164)
- Merge ResolutionFlags and ValueFlags (#1180)
- Move per-symbol-flags out of SymbolDb (#1186)
- Delete ValueFlags::ADDRESS (#1189)
- Replace all uses of bytemuck with zerocopy (#1210)
- Add readable Debug implementations for internal data structures (#1227)
- Macro to generate ELF newtypes and new SymbolType (#1228)
- davidlattimore
- marxin
- mati865
- daniel-levin
- lapla-cogito
- karolzwolak
- andrewdavidmackenzie
- el-yawd
- TechnoPorg
- jarjk
- jakobhellermann
- YamasouA
274 commits since the last release.
- Installation changes
- Now requires at least rust 1.89.0 to build #1065 (lapla-cogito)
- We no longer have an installer script (sorry) #1093 (davidlattimore)
- Wild's release builds are now linked with wild #1093 (davidlattimore)
- Mold's test suite is now run in CI #903 (lapla-cogito)
- Override
-sharedby (-no)-pie #1095 (mati865) - Emit error if as-yet unsupported .symver directive is used #1089 (marxin)
- Discard sections with exclude bit set #1077 (lqd)
- Do not look up files from args in search paths #1058 (mati865)
- Support escaping in version scripts #1053 (lapla-cogito)
- Avoid adding input files multiple times #1057 (mati865)
- Fix R_X86_64_GOTPC32_TLSDESC relaxations #1051 (marxin)
- Improve error message when LTO objects cause undefined symbols #1050 (AadiWaghray)
- Support -z interpose #1048 (lapla-cogito)
- Obtain verdefnum from verdef section header #1041 (mati865)
- Added support for CREL #981 (marxin)
- Support --help #1029 (lapla-cogito)
- Support -z undefs #1030 (AadiWaghray)
- Support --time=cycles,instructions,cache-misses etc #1027 (davidlattimore)
- Don't error when there are multiple alias definitions pointing to the same symbol #1021 (lapla-cogito)
- Autoformat C/C++ test code #1006 (mati865)
- Implement
--allow-multiple-definitionand-z muldefs#1015 (lapla-cogito) - Implement more arguments for exporting symbols #974 (mati865)
- Add
--unresolved-symbols=and--{warn, error}-unresolved-symbolsoptions support #993 (lapla-cogito) - Discard empty string-merge sections. Fixes #932 (davidlattimore)
- Write dynsym in parallel. Fixes #1000 (davidlattimore)
- Compute dynamic symbols versions during layout. #1000 (davidlattimore)
- Fix infinite loop on string-merge errors. #1008 (davidlattimore)
- Implement --wrap. #998 (davidlattimore)
- Support
extern "C"andextern "C++"in version scripts. #963 (marxin), #1004 (mati865) - Allow parallelism when resolving symbols for an object. #1001 (davidlattimore)
- Implement proper symbol lookup in a collections of versions #972 (marxin)
- Fix handling of custom NOBITS TLS sections #966 (davidlattimore)
- Use segment rather than section layout for TLS addresses #975 (davidlattimore)
- Change behaviour of --no-allow-shlib-undefined to match lld #897 (davidlattimore)
- Put custom TLS section into TLS segment #965 (davidlattimore)
- Don't emit non-standard .phdr and .shdr section headers #957 (davidlattimore)
- Support
-Roption if it points to a directory #956 (marxin) - Version script glob support #943 (marxin)
- Added jobserver support #923 (marxin)
- Improve symbol priority handling #826 (davidlattimore)
- Don't propagate retain bit to output sections #914 (davidlattimore)
- linker-diff: Handle empty .got #831 (Noratrieb)
- Allow undefined symbols in shared objects to trigger archive entries #930 (davidlattimore)
- Report errors as coming from wild and add some colour #896 (davidlattimore)
- Input shared objects now implies -shared #879 (mati865)
- Support
--no-relaxonly for mandatory situations #885 (mati865) - Don't report shlib undefined when writing an shlib #884 (davidlattimore)
- Add support for --[no-]allow-shlib-undefined #881 (davidlattimore)
- Use TLS end-offset for TLSLD GOT entry in executables #882 (davidlattimore)
- Allow R_X86_64_GOTPC32_TLSDESC for all executable outputs. Fixes #849 (marxin)
- Add Nix package, overlay, stdenv adapter, and flake. #847 (RossSmyth with help from dawnofmidnight and Noratrieb)
- Add support for -z defs #850 (AadiWaghray)
- Fix when TLSDESC and TLSDESC_CALL aren't adjacent. Fixes #842 (davidlattimore)
- Fix infinite loop when we have no input files. Fixes #835 (davidlattimore)
- Add flag non-standard flag
--got-plt-syms#827 (lapla-cogito) - Parallelise opening of input files. #816 (davidlattimore)
- Sort .eh_frame_hdr in parallel. #824 (davidlattimore)
- Add support for --exclude-libs ALL. #812 (davidlattimore)
- Don't apply -Bsymbolic* to undefined symbols (davidlattimore)
- Don't error if debug info references undefined / GCed symbol
- Alias
-sharedto-Bshareable(lapla-cogito) - Support
-Bsymbolic,-Bsymbolic-non-weak,-Bsymbolic-non-weak-functionsand-Bno-symbolic#782 (lapla-cogito) - RISC-V support #704 + other commits (marxin)
- save-dir:
- Skip non-existent paths #829 (Noratrieb)
- Handle
@filenameand thin archives #777 (davidlattimore) - Replicate original directory structure. #575 (davidlattimore)
- Improve handling of relative sysroots #772 (davidlattimore)
- Support
-Bsymbolic-functions#770 (lapla-cogito) - Use debug info to show where error came from #768 (davidlattimore)
- Update .preinit_array section locations and flags #761 (marxin)
- Set DT_PREINIT_ARRAY{,SZ} if .preinit_array is present #759 (marxin)
A lot of fixes and new features since 0.4.0. We had 200 commits.
- Improve error message for LTO objects in archives (mati865)
- Fix setting of STATIC_TLS on non-x86-64 arch (marxin)
- linker-diff: Diff program segments (lapla-cogito)
- Fix alignment of stack segment (lapla-cogito)
- Basic linker script support #44 (davidlattimore)
- Defining custom output sections
- Mapping input sections to output sections
- Defining symbols relative to sections
- Setting the address of output sections
- Setting alignment
- KEEP command
- ENTRY command
- Support for --entry flag (davidlattimore)
- Ignore some flags that we don't yet support (mati865)
- Don't error if multiple COMDAT groups define the same symbol (davidlattimore)
- Output section attributes now inherit from corresponding input section attributes (davidlattimore)
- Fix linking against protected symbols in shared objects (davidlattimore)
- Integration tests now support a test configuration file (lapla-cogito)
- Added support for -z norelro (davidlattimore)
- Fix misalignment of TLS when TDATA is absent #614 (davidlattimore)
- TLSDESC handling improvements (marxin)
- Set DF_ORIGIN and DF_1_ORIGIN when -z origin is passed (davidlattimore)
- Don't error if _start is undefined #613 (davidlattimore)
- Fix direct references to ifuncs in relocatable executables #580 (davidlattimore)
- Support
-l:<name.ext>args (mati865) - Make sure that we don't export hidden symbols #604 (davidlattimore)
- Don't emit duplicate symbol error on STB_GNU_UNIQUE #598 (davidlattimore)
- Fix dynamic relocations with non-zero addends on recent glibc #576 (davidlattimore)
- Better error reporting for duplicate symbols (lapla-cogito)
- Fix sysroot handling when sysroot indicators are not followed by a slash #590 (mati865)
- Handle symbol aliases when doing copy relocations #576 (davidlattimore)
- Fix error message if an empty linker script is provided (marxin)
- A few performance improvements (davidlattimore, mati865, marxin)
- Support outputting versioned symbols in shared objects #41 (mati865)
- Support for --start-lib and --end-lib (davidlattimore)
- Verify that input files didn't change while we were running (davidlattimore)
- Added support for thin archives (GlowingScrewdriver)
- Don't delete old output file if it's not a regular file #546 (davidlattimore)
- Added support for --undefined #528 (davidlattimore)
- More aarch64 relaxations (marxin)
A huge release with more than 250 commits since 0.3.0. We've also had several new contributors, which is awesome.
- Wild now supports aarch64 on Linux (marxin)
- Support for TLSDESC (marxin)
- Linker diff mostly rewritten. Now gives much less false positives and diffs more stuff. (davidlattimore)
- Added support for --sysroot (mati865)
- Added support for --whole-archive (riverbl)
- Added support for -z nocopyreloc (davidlattimore)
- Added support for references to versioned symbols (davidlattimore)
- Added support declaring default symbol versions via '@@' in symbol names (davidlattimore)
- Added support for RELRO (inflation)
- Report errors on undefined symbols (mati865)
- Allow --version to be specified with regular linker arguments (inflation)
- Detect objects built for wrong architecture and report proper error (inflation)
- Keep sections if
__start_/__stop_{SEC}is referenced. Fixes linkme crate (davidlattimore) - Improved performance of string merging, which affects debug info link time (davidlattimore, marxin)
- Remove unnecessary and unwanted copy relocations (davidlattimore)
- Emit debug symbols for copy relocations (davidlattimore)
- Demangle symbol names in various error messages (davidlattimore, marxin)
- Improve error message when an absolute relocation is used against a read-only section with a relocatable output (davidlattimore)
- Handle initialisers / destructors in .ctors.* / .dtors.* (davidlattimore)
- Added flag --update-in-place (davidlattimore)
- Fixed referenced to merged strings in relocatable binaries (davidlattimore)
- Optimise x86-64 jmp instructions to bypass GOT (mati865)
- Ignore or warn on various flags that we don't yet support (marxin)
- Don't strip
.debug_sections if they have the alloc flag set (davidlattimore) - Lots of improvements to testing (marxin, mati865, davidlattimore)
- Fixed link error if a shared object had a strong reference to a symbol defined by a discarded archive entry (davidlattimore)
- We should now be publishing to crates.io, so tools like cargo-binstall should work.
- Numerous bugfixes
This release had 581 commits. Since the release notes are being added retrospectively, we just focus on contributions from people other than davidlattimore.
- Added support for linking debug info (marxin)
- Fork on startup so that shut down runs in the background. Override with --no-fork. (andrewdavidmackenzie)
- Refactored to use lower-level APIs from the
objectcrate, extending theobjectcrate as needed (philipc) - Added support for --build-id (mostafa-khaled775)
- Added support .note.gnu.property (marxin)
- Added support .note.ABI-tag section and NOTE segment (marxin)
- Emit GNU_STACK segment (marxin)
Also added retrospectively.
- First tagged release
- Move most of the linker into a separate lib crate (pinkforest)