- Un usuario de LWN organizó como índice los 20 ensayos sobre linkers de Ian Lance Taylor, que estaban dispersos, para poder seguirlos de una sola vez
- El texto original es de Ian Lance Taylor, autor del linker
gold, y reagrupa entradas numeradas para que sea más fácil volver a encontrarlas según el título de cada sección - La primera mitad cubre el concepto de linker, la trayectoria personal del autor, enlace dinámico, formatos de archivos objeto, bibliotecas compartidas, símbolos ELF, relocalización y optimización de TLS
- La segunda mitad continúa con resolución de símbolos, comparación entre enlace estático y dinámico, optimización en tiempo de enlace, COMDAT, instanciación de plantillas de C++, frames de excepción y enlace incremental
- El índice y los comentarios están publicados como public domain, sin restricciones para copiar, usar o crear trabajos derivados
Índice que agrupa los 20 ensayos sobre linkers para encontrarlos con facilidad
- Se organizan los 20 textos de Ian Lance Taylor sobre linkers en un índice continuo y fácil de leer
- Era difícil encontrar un índice bien conectado en el blog de Ian o en LWN, así que se creó uno por separado
- Las URL de los textos usan números consecutivos, pero un índice resulta útil para ver de un vistazo el tema de cada entrada
- Como cada texto se identifica solo por número, los títulos se arman principalmente a partir de los encabezados de sección de Ian
Lista de textos incluidos
- Introduction, personal history, first half of what's-a-linker: introducción, trayectoria personal y primera mitad de qué es un linker
- What's-a-linker: Dynamic linking, linker data types, linker operation: enlace dinámico, tipos de datos del linker y funcionamiento del linker
- Address spaces, Object file formats: espacios de direcciones y formatos de archivos objeto
- Shared Libraries: bibliotecas compartidas
- More Shared Libraries -- specifically, linker implementation; ELF Symbols: más sobre bibliotecas compartidas, implementación del linker y símbolos ELF
- Relocations, Position Dependent Shared Libraries: relocalizaciones y bibliotecas compartidas dependientes de posición
- Thread Local Storage (TLS) optimization: optimización de TLS
- ELF Segments and Sections: segmentos y secciones ELF
- Symbol Versions, Relaxation optimization,: versiones de símbolos y optimización de relaxation
- Parallel linking: enlace en paralelo
- Archive format: formato de archivo archive
- Symbol resolution: resolución de símbolos
- Symbol resolution from the user's point of view; Static Linking vs. Dynamic Linking: resolución de símbolos desde el punto de vista del usuario; enlace estático vs. enlace dinámico
- Link time optimization, aka Whole Program optimization; Initialization Code: optimización en tiempo de enlace, también llamada optimización de programa completo; código de inicialización
- COMDAT sections: secciones COMDAT
- C++ Template Instantiation, Exception Frames: instanciación de plantillas de C++ y frames de excepción
- Warning Symbols,: símbolos de advertencia
- Incremental Linking: enlace incremental
- __start and __stop Symbols, Byte Swapping: símbolos
__starty__stop, y byte swapping - Last post; Update on gold's status: última entrada y actualización sobre el estado de
gold
Condiciones de publicación
- Este índice y los comentarios están publicados como public domain
- No hay restricciones para usarlo, copiarlo, ejecutarlo públicamente ni crear trabajos derivados, y no se requiere permiso adicional
1 comentarios
Comentarios de Hacker News
Alguien compartió un enlace a una compilación completa en un solo libro electrónico usando una receta de Calibre, así que dejó el resultado para quien lo necesite
https://www.mediafire.com/folder/b8fdqx7eqcpdl/linker
o
https://0x0.st/Xycy.azw3
https://0x0.st/Xyct.epub
https://0x0.st/Xycv.mobi
https://0x0.st/Xycw.pdf
El desarrollador que trabajó en los enlazadores lld y mold llevó el rendimiento al extremo
LLD (parte de LLVM):
https://llvm.org/devmtg/2017-10/slides/Ueyama-lld.pdf
Enlazador MOLD:
https://github.com/rui314/mold/blob/main/docs/design.md
Apple también presentó un enlazador nuevo de un nivel parecido a mold; la discusión anterior está aquí: https://news.ycombinator.com/item?id=36218330
LLD fue diseñado para ser rápido, y Gold antes de él también, pero Mold superó ampliamente a ambos
Aunque es un texto de [2008], estos artículos son realmente material de oro, así que siempre da gusto verlos volver a la portada de HN
Es una explicación excelente
Esta serie de artículos es de mis favoritas y, en lo personal, me abrió mucho los ojos
No creo que exista, ni en internet ni en otro lado, un recurso que reúna toda esta información en un solo lugar. Ojalá Ian lo hubiera publicado como libro
Aun así, me gustaría que Ian ofreciera una versión donde se pudieran ver todos los capítulos en una sola página
https://www.airs.com/blog/archives/51
Trata sobre pattern matching en código ensamblador, y sobre reorganizar o reutilizar secuencias
Recopilación de comentarios anteriores: https://news.ycombinator.com/item?id=27445981
Entiendo por qué surgieron los enlazadores en la época en que la memoria era limitada
Pero me pregunto si siguen siendo necesarios incluso en entornos modernos donde la memoria abunda. Además, las bibliotecas compartidas parecen poder convertirse en una ruta de ataque a la cadena de suministro, como pasó con el ataque de xz bloqueado a inicios de este año
También hay que seguir pensando en entornos como Raspberry Pi. No diría que las bibliotecas compartidas sean una vía de ataque más peligrosa que la aplicación misma. Aunque descargues un binario estático, no sabes qué trae dentro, y tampoco entiendo por qué la gente confía en la mitad de las imágenes de Docker que descarga, pero aun así así las usan
A menos que proceses todos los archivos fuente al mismo tiempo y con exactamente las mismas opciones de compilación, necesitas combinar los resultados. Incluso con LTO moderno, el compilador normalmente no puede ver todos los archivos del programa a nivel de código fuente, y las bibliotecas de C y C++ suelen estar separadas. A menos que múltiples lenguajes conviertan todo el programa en una sola etapa de compilación y ensamblado, necesitas algo que combine los resultados, y eso es el enlazador. Incluso si compilas todo de forma estática, mientras no codifiques de forma rígida la dirección exacta en la que se ejecutará el programa, la necesidad de un enlazador en tiempo de ejecución no desaparece, y ese enfoque además choca con técnicas de seguridad como ASLR
Esa forma de pensar de que sobran memoria y CPU me parece una de las razones por las que la experiencia de usuario no ha mejorado de forma visible, aunque el hardware sea varios órdenes de magnitud más rápido