Diferença entre / usr / include / sys e / usr / include / linux?

12

Bem, obviamente, há uma diferença, mas estou curioso sobre o racional por que algumas coisas estão sob / usr / include / sys e outras sob / usr / include / linux e têm o mesmo nome de arquivo de cabeçalho? Isso tem algo a ver com o POSIX vx não POSIX?

Além disso, eu consegui preencher / usr / include / linux com cabeçalhos no meu sistema Fedora, pegando o pacote kernel-headers, existe um nome de pacote padrão para eu obter os arquivos de cabeçalho que estão em / usr / include / sys ? Não consegui encontrá-lo.

Jeff
fonte

Respostas:

14

Os cabeçalhos abaixo /usr/include/linuxe abaixo /usr/include/asm*são distribuídos com o kernel do Linux. Os outros cabeçalhos ( /usr/include/sys/*.h, /usr/include/bits/*.he muitos mais) são distribuídos com a biblioteca C (a biblioteca GNU C , também conhecida como glibc, em todos os sistemas Linux não incorporados). Há uma pequena explicação no manual glibc .

Observe que /usr/include/linuxe /usr/include/asmdeve conter os cabeçalhos que foram usados ​​ao compilar a biblioteca C, não os cabeçalhos do kernel em execução. Caso contrário, se algumas constantes ou estruturas de dados forem alteradas, haverá uma inconsistência entre o programa compilado e a biblioteca C, o que provavelmente resultará em uma falha ou pior. (Se os cabeçalhos correspondem à biblioteca C, mas a biblioteca C não corresponde ao kernel, o que realmente acontece é que o kernel foi projetado para manter uma ABI estável e deve detectar que foi chamado sob uma ABI diferente e interpretar os argumentos do syscall de acordo. de qualquer maneira o kernel deve fazer isso para programas estaticamente compilados.)

Lembro-me de um debate acalorado entre o Debian e a Red Hat há um tempo (uma década?) Sobre o /usr/include/linuxassunto; aparentemente cada lado está aderindo à sua posição. (Pelo que entendi, o Debian está certo, como explicado acima.) Atualmente, o Debian distribui /usr/include/linuxe amigos no linux-libc-devpacote, que é compilado a partir de fontes do kernel, mas não atualizado com o kernel. Os cabeçalhos do kernel estão em pacotes específicos da versão, fornecendo o linux-headers-2.6metapacote; é isso que você precisa para compilar um módulo para uma versão específica do kernel.

O pacote que você está procurando é o cabeçalho da biblioteca C. Não sei como se chama, mas você pode descobrir yum provides /usr/include/sys/types.h.

Gilles 'SO- parar de ser mau'
fonte
2
A resposta para o último bit é glibc-headers.
mattdm