Отключение параметров упрощения безопасности для среды `nix-shell`

В попытке построить GCC (6.3) на NixOS (16.09), в пределах nix-shell , я получаю следующее:

 make[1]: Entering directory '<my-build-path>/coreboot/util/crossgcc/build-i386-elf-GCC/build-x86_64-pc-linux-gnu/libcpp' test -f config.h || (rm -f stamp-h1 && make stamp-h1) g++ -I../../../gcc-6.3.0/libcpp -I. -I../../../gcc-6.3.0/libcpp/../include -I../../../gcc-6.3.0/libcpp/include -O2 -fomit-frame-pointer -m64 -W -Wall -Wno-narrowing -Wwrite-strings -Wmissing-format-attribute -pedantic -Wno-long-long -fno-exceptions -fno-rtti -I../../../gcc-6.3.0/libcpp -I. -I../../../gcc-6.3.0/libcpp/../include -I../../../gcc-6.3.0/libcpp/include -c -o expr.o -MT expr.o -MMD -MP -MF .deps/expr.Tpo ../../../gcc-6.3.0/libcpp/expr.c ../../../gcc-6.3.0/libcpp/expr.c: In function 'unsigned int cpp_classify_number(cpp_reader*, const cpp_token*, const char**, source_location)': ../../../gcc-6.3.0/libcpp/expr.c:686:18: error: format not a string literal and no format arguments [-Werror=format-security] 0, message); ^ ../../../gcc-6.3.0/libcpp/expr.c:689:39: error: format not a string literal and no format arguments [-Werror=format-security] virtual_location, 0, message); ^ cc1plus: some warnings being treated as errors make[1]: *** [Makefile:224: expr.o] Error 1 make[1]: Leaving directory '<my-build-path>/coreboot/util/crossgcc/build-i386-elf-GCC/build-x86_64-pc-linux-gnu/libcpp' make: *** [Makefile:2730: all-build-libcpp] Error 2 sh ../gcc-6.3.0/mkinstalldirs <my-build-path>/coreboot/util/crossgcc/xgcc <my-build-path>/coreboot/util/crossgcc/xgcc sh: line 3: cd: i386-elf/libgcc: No such file or directory make: *** [Makefile:10462: install-target-libgcc] Error 1 

Где -Werror=format-security , по-видимому, является причиной сбоя (хотя я не вижу в этом точном параметре). Однако в <nixpkgs>/pkgs/development/compilers/gcc/6/default.nix я нахожу это:

 hardeningDisable = [ "format" ]; 

И угадайте, что отказ может быть вызван мерами безопасности для NixOS, некоторые из которых необходимо отключить, чтобы скомпилировать GCC (предположим, что разработчики GCC знают, что они делают в этих функциях). Протестировал его с помощью GCC 6.2 и 5.4 – то же самое.

Поэтому возникает вопрос, как отключить параметры упрочнения (в частности, format ) для среды nix-shell ? Или где же эти «предупреждения, которые рассматриваются как ошибки»?

Описание (и) варианта (ов):

  • https://nixos.org/nixpkgs/manual/#sec-hardening-in-nixpkgs
  • https://blog.mayflower.de/5800-Hardening-Compiler-Flags-for-NixOS.html

Согласно этому ответу

  • https://stackoverflow.com/questions/38679630/nixos-setting-options-for-nix-shell

nix-shell имеет ничего общего с выражениями Nix … но когда я вызываю make с флагом NIX_DEBUG ,

 env NIX_DEBUG=' ' make crossgcc-i386 

Я получаю вывод из <nixpkgs>/pkgs/build-support/cc-wrapper/add-hardening.sh , например, <nixpkgs>/pkgs/build-support/cc-wrapper/add-hardening.sh HARDENING: enabling format ; из того, что я делаю вывод, что эти опции «форматирование безопасности» применяются, когда я вызываю make в nix-shell .


Возможно, мне просто нужно что-то nixos-option помощью nixos-option , но какой именно вариант? Я не могу просто grep его … (нет аналога dconf dump / or gsettings list-recursively )

  • Порядок печати?
  • Как использовать printf и% s при наличии цветовых кодов?
  • Разный формат в терминале vs в .txt документе
  • Как печатать управляющие символы с escape-последовательностями?
  • печатать символы повторно, используя символ звездочки в bash
  • Сформированный вывод скрипта оболочки
  • Где исходный код реализации «scanf»?
  • Добавление ведущих символов перед строкой с использованием printf или echo
  • One Solution collect form web for “Отключение параметров упрощения безопасности для среды `nix-shell`”

    Предупреждения о format-security должны быть отключены или, по крайней мере, не -Werror 'd, из-за этого:

    Параметры упрочнения налагаются оболочкой компилятора, поэтому они не отображаются в журнале.

    И hardeningDisable по-видимому, единственный способ повлиять на обертку.

    Одним из возможных решений является создание фиктивного выражения Nix для использования с nix-shell -A . Например:
    copy ~/.nix-defexpr/channels_root/nixos/ в отдельное место ( <nixpkgs'> ) и сделать его <nixpkgs'> записи,
    добавить <nixpkgs'>/pkgs/tools/misc/coreboot/default.nix содержащий

     { stdenv, gcc6, flex, bison, ncurses, iasl, doxygen, zlib, isl, python }: stdenv.mkDerivation { name = "coreboot"; buildInputs = [ gcc6 flex bison ncurses iasl doxygen zlib isl python ]; hardeningDisable = [ "format" ]; # to build the cross-compiler } 

    и зарегистрировать его в <nixpkgs'>/top-level/all-packages.nix как обычно,
    и, наконец, вызвать nix-shell <nixpkgs'> -A coreboot для создания необходимой среды.

    Тем не менее я считаю, что это должно быть проще (работоспособно для nix-shell -p ).

    Linux и Unix - лучшая ОС в мире.