- O gccrs, front-end de Rust para o GCC, testou crates do kernel Linux no primeiro semestre de 2026, corrigindo problemas de processamento de atributos, resolução de nomes e gerenciamento de recursos, e agora se concentra em implementar corretamente a semântica de execução do código do kernel
- Um compilador Rust baseado no GCC é necessário para aproveitar arquiteturas não compatíveis com LLVM e o ecossistema existente de plugins do GCC, além de poder oferecer às distribuições Linux mais opções de toolchain
- A geração correta de código exige análise dinâmica de drop flags de acordo com o fluxo de controle; se isso for omitido, um
MutexGuardpode não liberar o bloqueio, levando a falhas de sincronização ou deadlocks - Ao compilar crates reais do kernel, surgiram problemas que levaram a um grande retrabalho: uma estrutura de resolução de nomes que tratava incorretamente os três namespaces do Rust, a ordem de processamento de
#[cfg()]e metadados de crate que omitiam módulos aninhados - Embora tenha havido avanços no suporte a programas
no_coree acoreecompiler_builtins, a compilação completa do kernel ainda exige suporte aalloce semântica de execução correta, além de revisão e coordenação para integração ao upstream do GCC
Por que usar o kernel Linux como alvo de teste
- gccrs é um projeto que desenvolve um front-end de Rust para o GCC e, no primeiro semestre de 2026, concentrou-se na compilação do kernel Linux
- Ao testar crates do kernel, encontrou e corrigiu problemas de processamento de atributos, resolução de nomes e gerenciamento de recursos
- Atualmente ele só consegue lidar com programas independentes simples, mas testar código do kernel também traz avanços para a geração correta de código em outros programas Rust
- O progresso é registrado nos relatórios semanais e relatórios mensais do projeto
- O código Rust do kernel Linux atualmente precisa usar o
rustcbaseado em LLVM- O rust_codegen_gcc, um experimento que usa o GCC como back-end no
rustc, também está em desenvolvimento - Uma alternativa baseada no GCC é necessária para dar suporte a arquiteturas que o LLVM não tem como alvo e para se integrar ao ecossistema existente de plugins do GCC
- À medida que a integração de Rust no kernel amadurece, distribuições Linux passam a priorizar a flexibilidade de toolchains e a disponibilidade de compiladores baseados no GCC
- O rust_codegen_gcc, um experimento que usa o GCC como back-end no
Marcos definidos por capacidades, não por versões do GCC
- No relatório de março de 2026, a equipe do gccrs mudou a organização do trabalho: em vez de mirar uma versão específica do GCC, passou a usar três marcos baseados em capacidades
- Compilador Rust embarcado: compila programas
no_stdque dependem apenas decore - Compilador Rust for Linux: dá suporte a
coree a crates específicos usados pelo kernel - Compilador de uso geral: lida com uma gama mais ampla de aplicações Rust além do ambiente do kernel
- Compilador Rust embarcado: compila programas
- O primeiro marco ainda não foi concluído, mas está quase lá, e o trabalho no marco Rust for Linux também começou
- Em março de 2026, foi adicionado suporte ao crate de baixo nível compiler_builtins, necessário para a build do kernel, e o foco passou a ser resolver problemas no crate
ffido kernel - Zhi Heng entrou em maio de 2026 por meio de um estágio na Open Source Security
- Corrigiu bugs que ocorriam quando o gccrs compilava crates do kernel
- Criou testes de integração contínua para evitar regressões
- Processar código Rust sem falhas não é suficiente; o código gerado também precisa funcionar corretamente
- Código Rust idiomático usa semântica de destrutores mais do que C, então implementações de
Dropsão centrais para a geração correta de código
- Código Rust idiomático usa semântica de destrutores mais do que C, então implementações de
Infraestrutura de Drop para liberação correta de recursos
- Rust gerencia recursos com o modelo RAII, em que a aquisição de recursos é inicialização, e o compilador chama automaticamente o destrutor definido no trait Drop quando um valor sai de escopo
- O estado de inicialização de uma variável pode variar conforme o fluxo de controle dentro de uma função
- Se um valor for movido condicionalmente ou inicializado apenas parcialmente, ele não pode ser destruído incondicionalmente no fim do escopo
- O front-end precisa analisar o grafo de fluxo de controle, criar drop flags dinâmicas — variáveis booleanas que registram em tempo de execução se um valor precisa ser destruído — e então passá-las ao back-end do GCC
- A implementação inicial de
Dropno gccrs não tinha essa análise, fazendo com que algumas chamadas aDrop::drop()fossem omitidas ou geradas incorretamente - No kernel Linux, omitir chamadas a
Droppode levar a falhas graves em tempo de execução, como vazamentos de memória e não liberação de recursos do sistema- Ao adquirir um bloqueio, a API Rust for Linux retorna um
MutexGuard - A implementação de
Dropdesse guard é responsável por liberar o bloqueio - Sem a chamada correta a
Drop, o bloqueio permanece mesmo quando o guard sai de escopo, podendo causar falhas de sincronização ou deadlocks
- Ao adquirir um bloqueio, a API Rust for Linux retorna um
- A participante do GSoC Janet Chien entrou em maio de 2026 e passou a se concentrar na construção da infraestrutura de
Dropdo gccrs
Reescrita da resolução de nomes para os namespaces do Rust
- Testes com a biblioteca padrão e crates do kernel revelaram bugs fundamentais de resolução de nomes no gccrs
- O projeto já conhecia vários problemas e vinha aprimorando separadamente a resolução de nomes desde 2023
- Rust distingue três namespaces
- O namespace de valores inclui funções e variáveis estáticas
- O namespace de macros inclui macros
- O namespace de tipos inclui structs, módulos e traits
- Para processar caminhos como
crate::foo::bar, é preciso determinar a qual namespace pertence cada segmento identificador - O gccrs existente resolvia todo o caminho em um único namespace, de acordo com o tipo do item buscado no fim
- Ao procurar uma função, todos os segmentos do caminho eram resolvidos no namespace de valores
- Porém módulos e imports públicos ficam no namespace de tipos; portanto, primeiro é preciso seguir a estrutura de módulos no namespace de tipos para então chegar à função
- Para corrigir isso, foi necessário reescrever estruturas internas de dados e refatorar implementações de visitors por todo o código
- Em maio de 2026, o crate
corepassou a ter imports profundamente aninhados resolvidos corretamente - Ao inserir módulos e imports no namespace de tipos, o comportamento ficou mais próximo do
rustc
- Em maio de 2026, o crate
Melhorias em atributos condicionais e opções do compilador
- A compilação de crates do kernel também expôs problemas no processamento de atributos do compilador e nos metadados de crates do gccrs
- Rust usa atributos como
#[cfg()]para compilação condicional - Pierre-Emmanuel Patry retrabalhou o pipeline de processamento de atributos em fevereiro de 2026
- Separou em duas etapas o passe do compilador que remove itens excluídos por atributos
cfg - Alguns recursos instáveis do kernel dependem de expansão de macros ou de atributos condicionais
- Esses atributos precisam ser removidos antes do passe principal de validação de atributos para evitar erros de compilação durante a validação
- Separou em duas etapas o passe do compilador que remove itens excluídos por atributos
- Em março de 2026, foi adicionada a opção
-frust-crate-attr, equivalente ao-Zcrate-attrdorustc- Ela permite que o sistema de build injete atributos na chamada do compilador sem modificar os arquivos-fonte originais
- É útil para passar
#![no_core], necessário para compilar código sem a biblioteca padrãocore - Desenvolvedores que fazem fuzzing do compilador para encontrar bugs em casos de borda também usam esse recurso
Metadados ausentes revelados por código real do kernel
- Crates Rust normalmente exportam metadados incluídos em arquivos
.rlibpara transmitir a API pública a outros crates - Ao vincular crates Rust do kernel, foi constatado que alguns módulos e exports estavam ausentes nos metadados gerados
- O gccrs omitia exports de módulos aninhados durante a geração de metadados
- Como resultado, dependências externas não podiam ser resolvidas
- Os testes de metadados existentes usavam uma estrutura de módulos plana e não detectaram o problema; o bug só apareceu depois de compilar código real
- Começou um grande retrabalho do sistema de processamento de metadados para permitir que a árvore de dependências do kernel seja vinculada com a toolchain GNU
Escopo de suporte atual e restrições do upstream do GCC
- Atualmente, o gccrs consegue processar com sucesso programas independentes
no_core - O processamento do crate
coree a implementação decompiler_builtinstambém avançaram bastante, mas o trabalho de compilar completamente as abstrações Rust complexas do kernel ainda está em andamento- O código do kernel pode ser analisado sintaticamente
- O foco atual é implementar corretamente a semântica de tempo de execução
- Além dos desafios técnicos, também é preciso superar restrições organizacionais da toolchain GNU
- O esforço para integrar ao GCC um novo front-end de linguagem que muda rapidamente é grande
- Grandes conjuntos de patches às vezes excederam a capacidade limitada de revisão do upstream do GCC
- A situação melhorou à medida que a estrutura do front-end se estabilizou
- Recentemente, dois desenvolvedores do gccrs foram promovidos a mantenedores do GCC
- Com isso, eles podem preparar atualizações em sua própria árvore e depois incorporá-las de uma vez
Suporte a alloc e próximas apresentações
- O participante do GSoC Enes Çevik entrou em maio de 2026 e está implementando suporte ao crate alloc
allocé responsável por tipos com alocação dinâmica de memória, comoBox,RceVec- O desenvolvimento do kernel evita várias abstrações da biblioteca padrão, mas algumas abstrações Rust centrais do kernel dependem de tipos com alocação
- Portanto, o suporte a
allocé requisito essencial para o marco Rust for Linux
- Patry e Arthur Cohen planejam apresentar “Compiling the Linux kernel with gccrs” na RustConf em Montreal e na EuroRust em Barcelona no segundo semestre de 2026
- Ao implementar, uma a uma, as funcionalidades exigidas pelo código do kernel, o projeto está construindo a base para compilar com o GCC o código Rust do ecossistema do kernel Linux
Ainda não há comentários.