¿Diferencia entre / usr / include / sys y / usr / include / linux?

12

Bueno, obviamente hay una diferencia, pero tengo curiosidad acerca de la razón detrás de por qué algunas cosas van bajo / usr / include / sys y otras van bajo / usr / include / linux y tienen el mismo nombre de archivo de encabezado. ¿Tiene esto algo que ver con POSIX vx no POSIX?

Además, me las arreglé para llenar / usr / include / linux con encabezados en mi sistema Fedora al tomar el paquete kernel-headers, ¿hay un nombre de paquete estándar para mí para obtener los archivos de encabezado que van bajo / usr / include / sys ? No he podido encontrarlo.

Jeff
fuente

Respuestas:

14

Los encabezados debajo /usr/include/linuxy debajo /usr/include/asm*se distribuyen con el kernel de Linux. Los otros encabezados ( /usr/include/sys/*.h, /usr/include/bits/*.hy muchos más) se distribuyen con la biblioteca C (la biblioteca GNU C , también conocida como glibc, en todos los sistemas Linux no integrados). Hay una pequeña explicación en el manual de glibc .

Tenga en cuenta que /usr/include/linuxy /usr/include/asmdebe contener los encabezados que se utilizaron al compilar la biblioteca C, no los encabezados del núcleo en ejecución. De lo contrario, si algunas constantes o estructuras de datos cambian, habrá una inconsistencia entre el programa compilado y la biblioteca de C, lo que probablemente provocará un bloqueo o algo peor. (Si los encabezados coinciden con la biblioteca C pero la biblioteca C no coincide con el núcleo, lo que realmente sucede es que el núcleo está diseñado para mantener un ABI estable y debe detectar que se llama bajo un ABI diferente e interpretar los argumentos de syscall en consecuencia. kernel debe hacer esto para programas compilados estáticamente de todos modos).

Recuerdo un acalorado debate entre Debian y Red Hat hace un tiempo (¿una década?) Sobre el /usr/include/linuxtema; aparentemente cada lado se está pegando a su posición. (Según tengo entendido, Debian tiene razón, como se explicó anteriormente.) Debian actualmente distribuye /usr/include/linuxy amigos en el linux-libc-devpaquete, que se compila a partir de fuentes del núcleo pero no se actualiza con el núcleo. Los encabezados del núcleo están en paquetes específicos de la versión que proporcionan el linux-headers-2.6metapaquete; Esto es lo que necesita para compilar un módulo para una versión particular del núcleo.

El paquete que está buscando son los encabezados de la biblioteca C. No sé cómo se llama, pero puedes averiguarlo yum provides /usr/include/sys/types.h.

Gilles 'SO- deja de ser malvado'
fuente
2
La respuesta al último bit es glibc-headers.
mattdm