El 4 de agosto se lanzó Wild 0.10 un enlazador de código abierto, escrito en Rust y diseñado principalmente para la rápida construcción de programas en Linux. El enlazador realiza la etapa final de la construcción: combina archivos objeto y bibliotecas en un archivo ejecutable o biblioteca compartida listos para usar. Wild puede utilizarse como reemplazo de GNU ld, LLD y Mold, aunque el objetivo final declarado por los desarrolladores, la creación de enlaces incremental, aún no está implementado..
Una de las principales innovaciones es el soporte de los parámetros --gdb-index y --no-gdb-index. Al habilitar esta función, Wild crea en el archivo de salida una sección .gdb_index con un índice de información de depuración. Gracias a esto, GDB puede encontrar más rápidamente los símbolos necesarios en programas grandes, sin necesidad de crear un índice por separado después de la construcción. La implementación es compatible con la novena versión del formato GDB Index; las operaciones de escaneo, combinación y escritura del índice se han paralelizado.
Se ha ampliado significativamente la funcionalidad de los scripts de enlace. Se ha añadido soporte para:
- secciones /DISCARD/ para excluir secciones de entrada innecesarias;
- encabezados de programas PHDRS personalizados;
- funciones SIZEOF_HEADERS, DEFINED y SEGMENT_START;
- la palabra clave AT y la función LOADADDR;
- expresiones condicionales con el operador ternario;
- comandos SORT, SORT_BY_NAME y SORT_BY_ALIGNMENT;
- el símbolo __bss_start;
- plantillas de llenado de secciones de salida;
- los comandos OUTPUT_FORMAT y OUTPUT_ARCH;
- varios contadores relativos de la dirección actual.
La compatibilidad completa con GNU ld aún no se ha alcanzado. Por ejemplo, parte de las funcionalidades del comando MEMORY, las secciones OVERLAY y algunos métodos de colocación de secciones siguen sin completar. Los desarrolladores llevan un registro de capacidades necesarias para la vinculación del núcleo de Linux..
Se ha mejorado el rendimiento al colocar los resultados de la construcción en Btrfs y VFAT. Wild ahora utiliza automáticamente el modo --no-mmap-output-file y no mapea el archivo de salida en memoria a través de mmap. En una prueba realizada por el desarrollador del enlace Zed en Btrfs, el tiempo se redujo de aproximadamente 2,6–2,8 a 1,5–1,8 segundos. Sin embargo, el autor del cambio advierte que incluso después de la optimización, Btrfs en este escenario sigue siendo significativamente más lento que tmpfs; para Ext4 y XFS, el uso de mmap, por otro lado, resultó ser más beneficioso.
La transición de Wild a otros formatos y plataformas continúa. La versión experimental para WebAssembly ya puede componer una serie de programas, y el puerto para Mach-O permite crear archivos ejecutables simples. Se ha comenzado a trabajar en plataformas objetivo de 32 bits, lo que debería facilitar en el futuro la aplicación de Wild en el desarrollo de sistemas embebidos. También se ha añadido el procesamiento inicial de archivos objeto PowerPC64 ELFv2 y se ha continuado el desarrollo del soporte para Mach-O, incluyendo archivos objeto universales y la vinculación directa con bibliotecas dinámicas. Estos puertos aún no deben considerarse listos para su uso diario.
La variante de biblioteca del enlazador libwild ahora puede recibir archivos de entrada y guardar resultados directamente en memoria. Esto permite que otros programas integren Wild sin la necesidad de crear archivos intermedios en el disco. Además, la biblioteca ya no redefine el grupo global de hilos Rayon, y el soporte para la compresión Zstandard se puede deshabilitar durante la compilación.
La versión incluye numerosas correcciones para x86-64, AArch64, RISC-V y LoongArch64. Se han solucionado errores en el manejo de TLS, PLT, LTO, información de depuración comprimida, grandes alineaciones y movimientos en objetos PIE y compartidos. Se han corregido posibles cierres inesperados al analizar scripts del enlazador, y errores en la formación de las secciones .tbss, .strtab y .eh_frame.
Wild es compatible con Linux en las arquitecturas x86-64, AArch64 y RISC-V; el soporte para LoongArch64 y PowerPC64LE está actualmente etiquetado como inicial. El enlazador se puede instalar desde archivos precompilados, a través de cargo-binstall, Homebrew, Nix o con el comando cargo install —locked wild-linker. El código fuente se distribuye a elección del usuario bajo licencias Apache 2.0 o MIT.
Fuente: linux.org.ru
