Unterschied zwischen / usr / include / sys und / usr / include / linux?

12

Natürlich gibt es einen Unterschied, aber ich bin gespannt, warum manche Dinge unter / usr / include / sys und andere unter / usr / include / linux gehen und denselben Header-Dateinamen haben. Hat dies etwas mit POSIX vx zu tun, das kein POSIX ist?

Außerdem habe ich es geschafft, / usr / include / linux mit Headern auf meinem Fedora-System zu füllen, indem ich ein Kernel-Header-Paket abgerufen habe. Gibt es einen Standardpaketnamen für mich, um Header-Dateien abzurufen, die unter / usr / include / sys gespeichert sind? ? Ich konnte es nicht finden.

Jeff
quelle

Antworten:

14

Die Header unter /usr/include/linuxund unter /usr/include/asm*werden mit dem Linux-Kernel verteilt. Die anderen Header ( /usr/include/sys/*.h, /usr/include/bits/*.hund viele weitere) werden mit der C-Bibliothek verteilt (die GNU C-Bibliothek , auch als glibc bezeichnet, auf allen nicht eingebetteten Linux-Systemen). Es gibt eine kleine Erklärung im glibc-Handbuch .

Beachten Sie, dass /usr/include/linuxund /usr/include/asmdie Header enthalten sollte, die beim Kompilieren der C-Bibliothek verwendet wurden, nicht die Header des laufenden Kernels. Andernfalls besteht bei Änderungen einiger Konstanten oder Datenstrukturen eine Inkonsistenz zwischen dem kompilierten Programm und der C-Bibliothek, die wahrscheinlich zu einem Absturz oder einer Verschlechterung führt. (Wenn die Header mit der C-Bibliothek übereinstimmen, die C-Bibliothek jedoch nicht mit dem Kernel übereinstimmt, geschieht der Kernel tatsächlich so, dass er einen stabilen ABI beibehält, und muss erkennen, dass er unter einem anderen ABI aufgerufen wird, und die Syscall-Argumente entsprechend interpretieren Der Kernel muss dies ohnehin für statisch kompilierte Programme tun.)

Ich erinnere mich an eine hitzige Debatte zwischen Debian und Red Hat vor einiger Zeit (vor einem Jahrzehnt?) Zu diesem /usr/include/linuxThema. anscheinend hält jede Seite an ihrer Position fest. (Soweit ich weiß, hat Debian Recht, wie oben erläutert.) Debian verteilt /usr/include/linuxund befreundet derzeit das linux-libc-devPaket, das aus Kernelquellen kompiliert, aber nicht mit dem Kernel aktualisiert wurde. Kernel-Header befinden sich in linux-headers-2.6versionenspezifischen Paketen, die das Metapaket bereitstellen. Dies ist, was Sie benötigen, um ein Modul für eine bestimmte Kernel-Version zu kompilieren.

Das Paket, das Sie suchen, sind die C-Bibliotheksheader. Ich weiß nicht, wie es heißt, aber Sie können es mit herausfinden yum provides /usr/include/sys/types.h.

Gilles 'SO - hör auf böse zu sein'
quelle
2
Die Antwort auf das letzte Bit lautet glibc-headers.
Mattdm