- Um usuário do LWN organizou em um índice os 20 ensaios sobre linkers de Ian Lance Taylor, antes espalhados, para que possam ser acompanhados de uma vez só
- O texto original é de Ian Lance Taylor, autor do linker
gold, e reúne novamente os textos numerados com base nos títulos das seções para facilitar a consulta - A parte inicial cobre o conceito de linker, histórico pessoal, linkagem dinâmica, formatos de arquivo objeto, bibliotecas compartilhadas, símbolos ELF, relocações e otimização de TLS
- A parte final segue com resolução de símbolos, comparação entre linkagem estática/dinâmica, otimização em tempo de link, COMDAT, instanciação de templates em C++, quadros de exceção e linkagem incremental
- O índice e os comentários foram publicados em domínio público, sem restrições para cópia, uso ou trabalhos derivados
Índice que reúne os 20 ensaios sobre linkers para facilitar a busca
- Os 20 textos de Ian Lance Taylor sobre linkers foram organizados em um índice contínuo e fácil de ler
- Era difícil encontrar um índice bem encadeado no blog de Ian ou no LWN, então foi criado um índice separado
- As URLs dos textos seguem numeração sequencial, mas um índice que mostre o tema de cada texto de relance é útil
- Como cada texto é referido apenas por número, os títulos foram montados principalmente a partir dos títulos de seção de Ian
Lista de textos incluídos
- Introduction, personal history, first half of what's-a-linker: introdução, histórico pessoal e a primeira metade do que é um linker
- What's-a-linker: Dynamic linking, linker data types, linker operation: linkagem dinâmica, tipos de dados do linker e funcionamento do linker
- Address spaces, Object file formats: espaços de endereçamento e formatos de arquivo objeto
- Shared Libraries: bibliotecas compartilhadas
- More Shared Libraries -- specifically, linker implementation; ELF Symbols: mais sobre bibliotecas compartilhadas, implementação de linker e símbolos ELF
- Relocations, Position Dependent Shared Libraries: relocações e bibliotecas compartilhadas dependentes de posição
- Thread Local Storage (TLS) optimization: otimização de TLS
- ELF Segments and Sections: segmentos e seções ELF
- Symbol Versions, Relaxation optimization,: versões de símbolos e otimização de relaxation
- Parallel linking: linkagem paralela
- Archive format: formato de arquivo
- Symbol resolution: resolução de símbolos
- Symbol resolution from the user's point of view; Static Linking vs. Dynamic Linking: resolução de símbolos do ponto de vista do usuário; linkagem estática vs. linkagem dinâmica
- Link time optimization, aka Whole Program optimization; Initialization Code: otimização em tempo de link, também conhecida como otimização de programa inteiro; código de inicialização
- COMDAT sections: seções COMDAT
- C++ Template Instantiation, Exception Frames: instanciação de templates em C++ e quadros de exceção
- Warning Symbols,: símbolos de aviso
- Incremental Linking: linkagem incremental
- __start and __stop Symbols, Byte Swapping: símbolos
__starte__stop, e troca de bytes - Last post; Update on gold's status: último texto e atualização sobre o estado do
gold
Condições de publicação
- Este índice e os comentários foram publicados em domínio público
- Não há restrições para uso, cópia, execução pública ou criação de trabalhos derivados, e não é necessária autorização adicional
1 comentários
Opiniões no Hacker News
Alguém linkou uma versão que reúne tudo em um único e-book usando uma receita do Calibre, então deixo aqui o resultado para quem precisar
https://www.mediafire.com/folder/b8fdqx7eqcpdl/linker
ou
https://0x0.st/Xycy.azw3
https://0x0.st/Xyct.epub
https://0x0.st/Xycv.mobi
https://0x0.st/Xycw.pdf
O desenvolvedor que trabalhou nos linkers lld e mold levou o desempenho ao limite
LLD (parte do LLVM):
https://llvm.org/devmtg/2017-10/slides/Ueyama-lld.pdf
Linker MOLD:
https://github.com/rui314/mold/blob/main/docs/design.md
A Apple também revelou um novo linker em um nível parecido com o do mold; a discussão anterior está aqui: https://news.ycombinator.com/item?id=36218330
O LLD foi projetado para ser rápido, e o Gold antes dele também, mas o Mold ultrapassou ambos por uma boa margem
Embora seja um texto de [2008], estes artigos são realmente materiais valiosos, então é sempre bom vê-los voltar à primeira página do HN
É uma explicação realmente excelente
Esta série de artigos é uma das minhas favoritas e, pessoalmente, me abriu os olhos para muitas coisas
Não acho que exista, na internet ou em qualquer outro lugar, um material que reúna todas essas informações em um só lugar. Seria ótimo se o Ian tivesse publicado isso como livro
Ainda assim, gostaria que o Ian disponibilizasse uma versão em que todos os capítulos pudessem ser vistos em uma única página
https://www.airs.com/blog/archives/51
É sobre fazer pattern matching em código assembly e reorganizar ou reutilizar sequências
Coleção de comentários anteriores: https://news.ycombinator.com/item?id=27445981
Entendo por que os linkers surgiram em uma época em que a memória era limitada
Mas fico me perguntando se linkers ainda são necessários em ambientes com memória abundante, como os sistemas modernos. Além disso, bibliotecas compartilhadas não acabam virando um vetor de ataque à cadeia de suprimentos, como no ataque ao xz que foi bloqueado no começo deste ano?
Ambientes como Raspberry Pi ainda precisam ser levados em conta. É difícil dizer que bibliotecas compartilhadas sejam um vetor de ataque mais perigoso do que o próprio aplicativo. Mesmo que você baixe um binário estático, não dá para saber o que há dentro dele; e eu também não sei por que confiamos em metade das imagens Docker que todo mundo baixa e usa, mas, de todo modo, é assim que elas são usadas
A menos que todos os arquivos-fonte sejam processados ao mesmo tempo e com exatamente as mesmas opções de build, é necessário combinar os resultados. Mesmo com LTO moderno, o compilador geralmente não vê todos os arquivos do programa no nível do código-fonte, e as bibliotecas C e C++ normalmente são separadas. Enquanto várias linguagens não transformarem o programa inteiro em uma única etapa de compilação e assembly, será preciso algo para combinar os resultados, e isso é o linker. Mesmo que tudo seja construído estaticamente, a necessidade de um linker em tempo de execução não desaparece, a menos que se codifique diretamente o endereço exato em que o programa será executado; e esse tipo de abordagem entra em conflito com técnicas de segurança como ASLR
Acho que a mentalidade de que memória e CPU são abundantes é uma das razões pelas quais a experiência do usuário não melhorou de forma perceptível, apesar de o hardware ter ficado várias ordens de grandeza mais rápido