Требуется ли для обновления gcc более новое ядро? - PullRequest
0 голосов
/ 27 декабря 2018

Я использую встроенное с немного старым ядром 2.6.37.Теперь нам нужно обновить rootfs, добавив больше gcc, чем тот, который использовался при построении образа (вместо 4.3 нам нужно использовать 5.1, потому что он будет поддерживать c ++ 11, который нам нужен в приложении).

При обновлении gcc означает ли это, что нам нужен более новый набор инструментов?

Новый инструментарий использует более новые заголовки ядра (4.0.0).

Итак, при обновленииgcc, значит ли это, что нам нужно новое ядро?или он также поддерживает старые заголовки ядра?

1 Ответ

0 голосов
/ 27 декабря 2018

Как правило, вы можете компилировать программное обеспечение с новыми заголовками ядра, и оно будет по-прежнему работать на старых ядрах, если программное обеспечение не использует какие-либо новые функции ядра.

Однако многие программы содержат такие конструкции, как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.)

...