Как правило, вы можете компилировать программное обеспечение с новыми заголовками ядра, и оно будет по-прежнему работать на старых ядрах, если программное обеспечение не использует какие-либо новые функции ядра.
Однако многие программы содержат такие конструкции, какthis:
#ifdef __NR_renameat2
int ret = syscall (__NR_renameat2,
oldfd, oldpath, newfd, newpath, RENAME_NOREPLACE);
#else
int ret = renameat (oldfd, oldpath, newfd, newpath);
#endif
В этом случае программное обеспечение будет безоговорочно использовать renameat2
после сборки на основе заголовков ядра 4.0, и не будет работать при работе на 2.6.37 (если не поддерживается система renameat2
звонок был перенесен).В старых заголовках ядра использовалась часть #else
, но она больше не компилируется.
Решение состоит в том, чтобы использовать что-то вроде этого:
#ifdef __NR_renameat2
int ret = syscall (__NR_renameat2,
oldfd, oldpath, newfd, newpath, RENAME_NOREPLACE);
#else
int ret = -1;
errno = ENOSYS;
#endif
if (ret == -1 && errno == ENOSYS)
ret = renameat (oldfd, oldpath, newfd, newpath);
То есть использовать(слегка дефектный) устаревший интерфейс, если вы получаете ENOSYS
из ядра.Обычно такие изменения просты, но поиск всех мест, которые их требуют, может быть утомительным.
Другая область, где новые заголовки ядра не будут работать со старыми ядрами, включает низкоуровневую функциональность, такую как структуры данных, используемыеiptables
инструмент командной строки для ядра.В этих областях обещание стабильности пользовательского пространства ABI не применяется.В этих случаях это не только содержимое заголовочных файлов, вам также могут потребоваться более новые версии инструментов пользовательского пространства, поскольку изменилось поведение ядра, и просто макет некоторых структур данных.
(Обратите внимание, что GCC ибольшая часть остальной текущей текущей цепочки инструментов GNU все еще строится с более старыми заголовками ядра. Единственное исключение - glibc, для которого в настоящее время требуется ядро 3.2 для сборки и запуска. Требование использовать заголовки ядра 4.0 - это то, что наложено вашим дистрибутивом цепочки инструментов GNU.)