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

11

Bem, obviamente há uma diferença, mas estou curioso sobre o motivo por trás de algumas coisas serem usadas em / usr / include / sys e outras sob / usr / include / linux, e ter o mesmo nome de arquivo de cabeçalho? Isso tem algo a ver com o POSIX vx non-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 pegar os arquivos de cabeçalho que estão em / usr / incluir / sys? Eu não consegui encontrá-lo.

    
por Jeff 23.02.2011 / 23:58

1 resposta

13

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

Observe que /usr/include/linux e /usr/include/asm devem 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 corresponderem à biblioteca C, mas a biblioteca C não corresponder ao kernel, o que realmente acontece é que o kernel é projetado para manter uma ABI estável e deve detectar que é chamado sob uma ABI diferente e interpretar os argumentos syscall adequadamente. O kernel deve fazer isso para programas estaticamente compilados de qualquer forma.)

Eu me lembro de um debate acalorado entre o Debian e a Red Hat há algum tempo (há uma década) sobre o /usr/include/linux issue; aparentemente, cada lado está aderindo à sua posição. (Até onde eu entendi, o Debian está certo, como explicado acima). O Debian atualmente distribui /usr/include/linux e amigos no pacote linux-libc-dev , que é compilado a partir de fontes do kernel, mas não atualizado com o kernel. Os cabeçalhos de kernel estão em pacotes específicos da versão, fornecendo o meta-pacote linux-headers-2.6 ; isto é o 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. Eu não sei como é chamado, mas você pode descobrir com yum provides /usr/include/sys/types.h .

    
por 24.02.2011 / 00:40