Différence entre / usr / include / sys et / usr / include / linux?

12

Eh bien, évidemment, il y a une différence, mais je suis curieux de savoir pourquoi certaines choses passent sous / usr / include / sys et d'autres sous / usr / include / linux, et ont le même nom de fichier d'en-tête? Est-ce que cela a quelque chose à voir avec POSIX vx non-POSIX?

De plus, j'ai réussi à remplir / usr / include / linux avec des en-têtes sur mon système Fedora en saisissant un package kernel-headers, y a-t-il un nom de package standard pour moi pour obtenir les fichiers d'en-tête qui vont sous / usr / include / sys ? Je n'ai pas pu le trouver.

Jeff
la source

Réponses:

14

Les en-têtes under /usr/include/linuxet under /usr/include/asm*sont distribués avec le noyau Linux. Les autres en-têtes ( /usr/include/sys/*.h, /usr/include/bits/*.het bien d'autres) sont distribués avec la bibliothèque C (la bibliothèque GNU C , également connue sous le nom de glibc, sur tous les systèmes Linux non intégrés). Il y a une petite explication dans le manuel de la glibc .

Notez que /usr/include/linuxet /usr/include/asmdoit contenir les en-têtes qui ont été utilisés lors de la compilation de la bibliothèque C, pas les en-têtes du noyau en cours d'exécution. Sinon, si certaines constantes ou structures de données ont changé, il y aura une incohérence entre le programme compilé et la bibliothèque C, ce qui est susceptible d'entraîner un crash ou pire. (Si les en-têtes correspondent à la bibliothèque C mais que la bibliothèque C ne correspond pas au noyau, ce qui se passe réellement est que le noyau est conçu pour conserver un ABI stable et doit détecter qu'il est appelé sous un ABI différent et interpréter les arguments syscall en conséquence. le noyau doit de toute façon le faire pour les programmes compilés statiquement.)

Je me souviens d'un débat houleux entre Debian et Red Hat il y a quelque temps (une décennie?) Sur la /usr/include/linuxquestion; apparemment, chaque côté s'en tient à sa position. (Si je comprends bien, Debian a raison, comme expliqué ci-dessus.) Debian distribue actuellement /usr/include/linuxet ses amis dans le linux-libc-devpaquet, qui est compilé à partir des sources du noyau mais pas mis à jour avec le noyau. Les en-têtes du noyau sont dans des packages spécifiques à la version fournissant le linux-headers-2.6métapaquet; c'est ce dont vous avez besoin pour compiler un module pour une version particulière du noyau.

Le package que vous recherchez est celui des en-têtes de bibliothèque C. Je ne sais pas comment ça s'appelle, mais vous pouvez le découvrir avec yum provides /usr/include/sys/types.h.

Gilles 'SO- arrête d'être méchant'
la source
2
La réponse au dernier bit est glibc-headers.
mattdm