Разница между / usr / include / sys и / usr / include / linux?

12

Конечно, есть разница, но мне любопытно, почему некоторые вещи идут в / usr / include / sys, а другие - в / usr / include / linux и имеют одинаковое имя файла заголовка? Это как-то связано с POSIX vx non-POSIX?

Кроме того, мне удалось заполнить / usr / include / linux заголовками в моей системе Fedora, захватив пакет kernel-headers, есть ли стандартное имя пакета для меня, чтобы получить заголовочные файлы, которые находятся в / usr / include / sys ? Я не смог найти его.

Джефф
источник

Ответы:

14

Верхние /usr/include/linuxи нижние заголовки /usr/include/asm*распространяются вместе с ядром Linux. Остальные заголовки ( /usr/include/sys/*.h, /usr/include/bits/*.h, и многие другие) распределены с библиотекой C (в библиотеке GNU C , также известный как Glibc, на всех не встроенные системы Linux). В руководстве по glibc есть небольшое объяснение .

Обратите внимание, что /usr/include/linuxи /usr/include/asmдолжен содержать заголовки, которые использовались при компиляции библиотеки C, а не заголовки из работающего ядра. В противном случае, если некоторые константы или структуры данных изменились, между скомпилированной программой и библиотекой C возникнет несоответствие, что может привести к сбою или, что еще хуже. (Если заголовки соответствуют библиотеке C, но библиотека C не соответствует ядру, то на самом деле происходит то, что ядро ​​разработано для поддержания стабильного ABI и должно обнаруживать, что оно вызывается под другим ABI, и соответствующим образом интерпретировать аргументы syscall. В любом случае ядро ​​должно делать это для статически скомпилированных программ.)

Я помню жаркую дискуссию между Debian и Red Hat некоторое время назад (десять лет?) По этому /usr/include/linuxвопросу; по-видимому, каждая сторона придерживается своей позиции. (Насколько я понимаю, Debian прав, как объяснено выше.) В настоящее время Debian распространяет /usr/include/linuxи друзей в linux-libc-devпакете, который скомпилирован из исходников ядра, но не обновлен с помощью ядра. Заголовки ядра находятся в специфичных для версии пакетах, обеспечивающих linux-headers-2.6метапакет; это то, что вам нужно для компиляции модуля для конкретной версии ядра.

Пакет, который вы ищете - это заголовки библиотеки C. Я не знаю, как это называется, но вы можете узнать с помощью yum provides /usr/include/sys/types.h.

Жиль "ТАК - прекрати быть злым"
источник
2
Ответ на последний бит glibc-headers.
Матдм