No meu entendimento, o POSIX especifica apenas um conjunto de APIs que o sistema operacional precisa fornecer, mas não especifica os detalhes da implementação, especificamente a compatibilidade no nível do assembly. Por exemplo, em x86, você precisa usar um syscall para obter a API POSIX:
1. set `eax` to the syscall number
2. set syscall arguments
3. call int 0x80
Mas esse processo pode variar muito dependendo de:
- SO UNIX: diferentes sistemas operacionais podem ter um mapeamento diferente do número syscall para a API POSIX
- arquitetura: X86/arm tem instruções diferentes para chamar
int 0x80
Então acho que o POSIX faz seu trabalho mantendo a conversão da API para a biblioteca POSIX em sistemas operacionais diferentes glibc.so
.
A API POSIX é fornecida como símbolo glibc. Portanto, toda vez que o executável chama a API POSIX, ele encontra o símbolo em todos os sistemas operacionais glibc.so
e não há necessidade de chamar int 0x80 diretamente no executável.
Então minha pergunta é:
- meu entendimento está correto?
- além disso
glibc.so
, existem outras bibliotecas que funcionam como,glibc.so
mas em sistemas operacionais UNIX diferentes?
POSIX não especifica interfaces binárias, portanto você não pode construir um binário “POSIX” e executá-lo em diferentes sistemas operacionais estilo POSIX. O POSIX nem se importa com chamadas de sistema; ele define funções e não importa onde essas funções sejam implementadas.
Na prática, no Linux e em outros sistemas estilo POSIX, as funções são implementadas em uma “biblioteca C”, como você mencionou. Mas não existe nem mesmo uma maneira definida pelo POSIX para os binários chamarem essas funções; POSIX para programas C é mais relevante ao escrever e compilar programas e ao considerar o comportamento das interfaces do sistema em tempo de execução, mas não no que diz respeito à forma como essas interfaces são acessadas. O
c99
comando para executar um compilador é especificado, portanto, ser capaz de pegar a fonte C e transformá-la em um binário é um requisito no POSIX, mas os detalhes desse binário são específicos do sistema. (As interfaces binárias no Linux seguem a especificação conhecida como System V ABI , com várias extensões específicas da arquitetura.)Existem outras bibliotecas C. Cada plataforma oferece a sua própria e algumas plataformas possuem várias. No Linux, existe a biblioteca GNU C , mas também musl .
Observe também que a biblioteca C não é usada apenas para programas C; em sistemas estilo POSIX, a maioria dos compiladores e interpretadores acabam usando-o. (Exceções notáveis incluem binários Go que implementam suas próprias interfaces para a API do espaço do usuário do kernel.)