O Que É uma ABI? O Contrato Binário Entre Programas
Uma ABI (Application Binary Interface) é o contrato de baixo nível que permite que código compilado interopere: como funções são chamadas, como os dados são dispostos e como o binário se encaixa.
Uma API define como o código-fonte se interconecta no nível da linguagem. Uma ABI é a mesma ideia uma camada abaixo, no nível do código de máquina. Ela especifica os detalhes binários com os quais dois componentes compilados precisam concordar para funcionar juntos: convenções de chamada, como argumentos são passados, como estruturas são dispostas na memória e como símbolos são nomeados. Quebre a ABI e binários que compilaram bem falham em runtime.
O que uma ABI especifica
- Convenções de chamada: como argumentos e valores de retorno são passados.
- Layout de dados: tamanhos, alinhamento e ordenação das estruturas.
- Name mangling: como os nomes de símbolos são codificados nos object files.
- O formato binário e como o programa é carregado.
ABI vs API
Uma API é um contrato em nível de fonte: quais funções e tipos existem e como chamá-los no código. Uma ABI é um contrato em nível binário: como esse código compilado de fato interopera. Você pode manter uma API estável enquanto quebra a ABI, e vice-versa.
Por que a estabilidade da ABI importa
O linking dinâmico depende da estabilidade da ABI. Uma biblioteca compartilhada pode ser atualizada sem recompilar seus chamadores somente se a nova versão mantiver a mesma ABI. Mude o layout de uma struct ou uma convenção de chamada, e os binários existentes quebram de formas confusas e difíceis de depurar.
Quando as ABIs quebram
Quebras de ABI causam crashes ou corrupção que são desconcertantes porque nada no fonte parece errado, a incompatibilidade é puramente binária. É por isso que misturar componentes compilados com diferentes compiladores, flags ou versões de biblioteca pode falhar de forma imprevisível.
Um exemplo rápido
Atualizar uma biblioteca compartilhada para que uma struct ganhe um campo muda seu layout de memória. Programas compilados contra o layout antigo ainda esperam o tamanho antigo e leem os bytes errados, apesar de um fonte que compila bem.
ABI em CI
Incompatibilidades de ABI são problemas de ambiente: o mesmo código falha quando os binários são compilados contra toolchains ou versões de biblioteca incompatíveis. O Latchkey fornece ambientes de runner consistentes e reproduzíveis para que componentes sejam compilados e linkados contra ABIs compatíveis, evitando misteriosas falhas binárias do tipo works-on-my-machine.
Principais conclusões
- Uma ABI é o contrato em nível binário que permite que código compilado interopere.
- Ela é distinta de uma API: a ABI trata de código de máquina, a API trata do código-fonte.
- Quebras de ABI causam falhas desconcertantes em runtime mesmo quando o fonte compila sem erros.