mold 2.0.0 - linker de alta velocidade
(github.com/rui314)- A licença foi alterada de AGPL para MIT, tornando-se a principal mudança do mold 2.0.0
- Corrigido um bug que impedia a criação de arquivos-objeto com mais de 65520 seções ao usar
--relocatable -undefinedagora é interpretado como sinônimo de--undefined, e não de-u ndefined, alinhando-se ao comportamento dos linkers GNU e do LLVM lld-nopiepassa a ser tratado como sinônimo de--no-pie- Suporte aos tipos de relocação
R_RISCV_SET_ULEB128eR_RISCV_SUB_ULEB128em RISC-V - Suporte ao tipo de relocação
R_PPC64_REL32em PPC64
1 comentários
Comentários no Hacker News
mold é um trabalho realmente excelente em sistemas modernos.
Recentemente, ao tentar acelerar o build de um projeto, percebi que a etapa de linkedição era um gargalo enorme. Mesmo usando 24 núcleos * 2 threads, cerca de 30% do desempenho total ficava ocioso por causa do linker.
Eu já tinha tentado compilar com mold antes, mas na época não funcionou bem; pretendo tentar de novo.
Não lembro os números exatos, mas era uma diferença bem grande, do tipo algo que levava alguns segundos com gold e lld cair para menos de 1 segundo com mold.
Era um código C++/Qt complexo.
mold -run ninjafunciona muito bem no meu ambiente.Fico muito feliz em ver a notícia da mudança de licença. Espero que o projeto também consiga gerar receita, mas com uma licença MIT a chance de integrá-lo em projetos de trabalho fica muito maior.
Se acabarmos usando de fato, pretendo tentar convencer a empresa a patrocinar este projeto.
A AGPL também só imporia restrições ao distribuir um linker modificado privadamente como serviço de rede, o que não é um cenário realista para uma ferramenta básica de desenvolvimento.
Fiquei curioso sobre a mudança de licença. Isto não é um executável? Chamar um processo separado não obriga o software que o chama a virar GPL, então, no caso comum, a mudança para MIT não deveria ter impacto.
Se os autores realmente quisessem uma licença mais permissiva, em vez de relicenciar de AGPL para MIT, deveriam ter mudado para AGPL com uma exceção de linkedição. Um exemplo de projeto GPL com exceção de linkedição é o libgit2: https://github.com/libgit2/libgit2#license
Esse tipo de licença é mais permissivo e, ao mesmo tempo, ainda permite vender licenças comerciais para quem cria alterações de código fechado.
A versão para macOS,
sold, parece ser uma exceção.Este linker aumentou de forma perceptível a satisfação no desenvolvimento no meu repositório Rust exploratório, que está virando um grande monólito web usando SeaORM e axum/tokio.
Você não vai querer saber o tamanho do meu diretório
target, mas os builds incrementais ficaram muito mais ágeis.15:55 $ du -Hs --si target/11G target/Mold é excelente, e tenho alguns usos favoritos para ele.
[target.x86_64-unknown-linux-gnu]linker = "clang"rustflags = ["-C", "link-arg=-fuse-ld=mold","-C", "target-cpu=native"]"-fuse-ld=mold"ao CFLAGS também acelera omakepkg.Uma decisão muito sensata. Às vezes há momentos difíceis em que preciso admitir que algumas coisas nos meus produtos ou código não são adequadas para monetização.
É o mercado que diz isso e, infelizmente, em vez de lutar contra ele, é importante encontrar outra coisa que o mercado recompense.
Alguém sabe se essa mudança de licença/estratégia de negócios também será aplicada ao sold? O sold é o mold para macOS.
https://github.com/bluewhalesystems/sold
https://twitter.com/davidecci/status/1665835119331135488
“Este repositório contém a versão gratuita do linker mold. Se você procura uma versão comercial com suporte a macOS, visite o repositório do linker sold.”
Bastaria pagar bem pelo trabalho e tornar o mundo melhor.
Para a Apple, isso seria fácil demais.
A licença mudou de AGPL para MIT.
Mas como artesãos tão excelentes deveriam ser recompensados, e por que isso ainda não acontece? Acho que empresas, independentemente do tamanho, deveriam reservar algum orçamento para dependências ou ferramentas essenciais e divulgar isso em seus sites oficiais. Parece que precisamos de mais uma espécie de norma cultural.
Eu tinha esquecido que isto era um linker rápido
“O Mold 2.0.0 é o novo lançamento major do nosso linker de alta velocidade. Nesta versão, mudamos a licença de AGPL para MIT com o objetivo de ampliar a base de usuários. Quem acompanhou o progresso sabe que não foi uma decisão fácil, pois vínhamos tentando monetizar o produto com um modelo de licença dupla AGPL/licença comercial. Infelizmente, essa abordagem não correspondeu às expectativas. A mudança de licença é resultado de aceitarmos essa realidade. Não queremos continuar insistindo em uma estratégia que não estava funcionando bem.”
Era horrível, e também uma péssima forma de tratar desenvolvedores que escreviam software para o seu próprio SO
Há muito tempo estamos acostumados a não pagar por ferramentas de desenvolvimento de baixo nível e, em vez disso, pagar por suporte. É surpreendente que tenham tentado uma licença desse tipo
Ao longo dos anos vi várias discussões sobre linkers rápidos e relatos de que trocar um linker por outro mais rápido reduziu bastante o tempo de compilação, mas em geral eu não entendia bem por que linkers são lentos
Seria bom se alguém pudesse explicar
Uma boa parte do ganho de desempenho vem de processar o trabalho em paralelo, o que leva a uma grande melhoria em CPUs modernas, potentes e multicore
Se quiser saber mais, há uma boa apresentação do Rui sobre o Mold: https://www.youtube.com/watch?v=hAt3kCalE0Y
cat. Afinal, bastaria concatenar os binários e pronto. Na época dos discos giratórios, a E/S de disco era um problema, mas hoje é menosO que leva tempo é reescrever conteúdo durante o processo. Percorrer a tabela de relocação e inserir endereços no código é barato, e o dead stripping por seção também é razoavelmente barato, mas fazer dead stripping de blocos básicos individuais dentro de uma função exige muito mais análise e consome tempo
Deduplicar strings constantes é uma boa ideia, mas é preciso despejar tudo em alguma forma de tabela hash. Se você quiser compartilhar também sufixos comuns, o trabalho aumenta ainda mais
Deduplicação, dead stripping e reescrita de informações de depuração também levam tempo. Builds de debug podem conter vários GB de DWARF que precisam ser reescritos
Curiosamente, o fato de o linker ser scriptável e aceitar um programa para interpretar não parece ter um custo grande. Provavelmente porque esses scripts são bem curtos e suas funcionalidades são um tanto limitadas
Historicamente, o motivo de o lld ser muito rápido era que ele fazia pouca manipulação de informações de depuração ou outras deduplicações. O lld rodava rápido, mas o binário de saída ficava grande
Faz alguns anos que me afastei da área de desempenho de linkedição, então não sei bem qual é o estado atual. Em especial, não sei onde mold ou lld se situam hoje no equilíbrio entre qualidade da saída e desempenho próprio
https://www.airs.com/blog/archives/38
“Mais uma vez, o objetivo é velocidade. Neste caso, ser mais rápido que meu segundo linker. Esse linker ficou consideravelmente mais lento ao longo dos anos com a adição de suporte a ELF e bibliotecas compartilhadas. Esse suporte não foi projetado desde o início; foi acrescentado depois. Os planos futuros para o novo linker também incluem suporte a linkedição incremental, que é outra forma de aumentar a velocidade.”
Pense nos apps dos primórdios do Unix. Eram apps simples, de propósito único, provavelmente com um único arquivo-fonte, um único objeto, linkando apenas com a libc, sem nada como bibliotecas compartilhadas
Depois disso, recursos “obrigatórios” foram sendo adicionados, e o código do linker cresceu organicamente. Especialmente na época em que discos giratórios eram o gargalo, a correção dos recursos era mais importante que a velocidade