Desabilitando as opções de proteção de segurança para um ambiente 'nix-shell'

2

Em uma tentativa de construir o GCC (6.3) no NixOS (16.09), dentro de um nix-shell , recebo isto:

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

Onde -Werror=format-security parece ser o motivo da falha (embora eu não veja essa opção exata no comando). Ainda em <nixpkgs>/pkgs/development/compilers/gcc/6/default.nix eu acho isso:

hardeningDisable = [ "format" ];

E adivinhe que a falha pode ser devida às medidas de segurança do NixOS, algumas das quais têm para serem desabilitadas para obter o GCC compilado (vamos assumir que os desenvolvedores do GCC sabem o que estão fazendo naqueles funções). Testado com o GCC 6.2 e 5.4 - o mesmo.

Portanto, a questão é como desabilitar as opções de proteção (em particular format ) para um ambiente nix-shell ? Ou onde mais esses "avisos sendo tratados como erros" vêm?

Descrição da (s) opção (ões):

De acordo com esta resposta

nix-shell não tem nada a ver com as expressões Nix ... mas quando eu chamo make com o sinal NIX_DEBUG ,

env NIX_DEBUG=' ' make crossgcc-i386

Eu recebo a saída de <nixpkgs>/pkgs/build-support/cc-wrapper/add-hardening.sh , por exemplo %código%; inferi que essas opções de "segurança de formato" são realmente aplicadas quando eu chamo HARDENING: enabling format no make .

Talvez eu simplesmente precise dar um bump em algo por meio de nix-shell , mas qual exatamente a opção? Eu não posso apenas nixos-option ... (não há análogo de grep ou dconf dump / )

    
por Andrew Miloradovsky 06.04.2017 / 01:25

1 resposta

1

Os format-security avisos têm para serem desativados, ou pelo menos não -Werror 'd, por causa disso:

As opções de proteção são impostas pelo wrapper do compilador, e é por isso que elas não são mostradas no log.

E hardeningDisable aparentemente é o único método para afetar o wrapper.

Uma possível solução é criar uma expressão Nix fictícia para ser usada com nix-shell -A . Por exemplo:
copie ~/.nix-defexpr/channels_root/nixos/ em um lugar separado ( <nixpkgs'> ) e torne-o gravável,
adicione <nixpkgs'>/pkgs/tools/misc/coreboot/default.nix contendo

{ 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
}

e registre-o em <nixpkgs'>/top-level/all-packages.nix como de costume,
e, finalmente, chame nix-shell <nixpkgs'> -A coreboot para criar o ambiente necessário.

Ainda acho que deveria ser mais fácil (trabalhável para nix-shell -p ).

    
por 30.05.2017 / 02:33