заголовки ядрa установки, не перезаписывая старые заголовки

(Это не совсем ответ, больше комментариев)

Вы должны быть немного осторожны в A && B || C Сочетания:

  • Если Возвращает A A Возвращает успех, то B выполнен
  • , если B впоследствии возвращает состояние выхода, затем C тоже будет выполнен.
$ [[ -f /etc/passwd ]] && { echo "file exists"; false; } || echo "file does not exist"
file exists
file does not exist

Если A; тогда б; остальное c; ФИ в этом отношении безопаснее, в этом C не зависит от B , только A

$ if [[ -f /etc/passwd ]];then { echo "file exists"; false; }; else echo "file does not exist"; fi
file exists
$ echo $?
1
0
31.07.2014, 21:18
1 ответ

Вы не можете #include два заголовка с одинаковым путем, но вы можете установить один вне обычных путей и заменить его при компиляции с помощью соответствующий переключатель (для gcc, -I ). Я думаю, вы уже это понимаете, поэтому не нужно слишком много думать, чтобы осознать это, если вы поместите более одного asm / fcntl.h в обычные подключаемые каталоги, только один из них будет применить в любом случае .

Однако я не думаю, что вам есть о чем беспокоиться. Начнем с некоторых ваших комментариев:

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

Это хорошо. Если вам нужно #define NEWVALUE 666 для компиляции , и это включает в себя функцию, которая будет работать только с более новым ядром, и вы можете поймать или отключить ее использование в противном случае, тогда секции, которые действительно применяют NEWVALUE , никогда не будут вызваны. Помните, это не значит, что нет заголовка, определяющего это доступным, когда старое ядро ​​работает - даже если бы он был, это не имело бы значения, поскольку настоящая проблема во время выполнения заключается в том, что вы фактически вызвали несуществующую часть ядро ABI . Вам не нужны никакие заголовки только для того, чтобы запустить исполняемый файл, поэтому возврат к старому ядру не имеет значения.

Возможно, я параноик, но ...

Да и нет.Если это система, в которой разные люди произвольно меняют местами разные заголовки ядра, чтобы использовать новые функции при компиляции вещей, которые будут оставлены и запущены позже с использованием более старого ядра, то паранойя - уместная реакция, лол. Однако, вероятно, не так много всего попадает в эту категорию.

Дистрибутивы заменяют заголовки ядра при каждом обновлении, но список вещей, которые пользователь должен заменить одновременно, обычно кажется не таким длинным (если он вообще существует). Я полагаю, что это отчасти потому, что поддерживать обратную совместимость в этом контексте довольно просто, но я думаю, что это также потому, что вещи в этом контексте не меняются кардинально с течением времени.

Полагаю, я мог бы сохранить старые заголовки и переустановить их.

Вы можете сделать это или при необходимости заменить их из соответствующего источника ( make headers_install ); если это ядро ​​дистрибутива, и вы беспокоитесь, что они могут быть исправлены, в дистрибутиве должен быть пакет с исходным кодом для него.

1
28.01.2020, 02:52

Теги

Похожие вопросы