NixOS(16.09)에서 GCC(6.3)를 빌드하려고 하면 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
이 답변에 따르면
nix-shell
Nix 표현식과는 관련이 없지만... 플래그를 make
사용하여 호출하면NIX_DEBUG
env NIX_DEBUG=' ' make crossgcc-i386
<nixpkgs>/pkgs/build-support/cc-wrapper/add-hardening.sh
예를 들어 내가 추론 HARDENING: enabling format
할 수 있는 한 ;make
nix-shell
어쩌면 Collision을 통해 무언가를 전달해야 할 수도 있지만 nixos-option
정확히 어떤 옵션이 필요할까요? 난 이렇게만 있을 수는 없어 grep
... ( dconf dump /
또는 유사어 없음 gsettings list-recursively
)
답변1
format-security
경고가지다다음과 같은 이유로 비활성화되었거나 최소한 -Werror
비활성화되지 않았습니다.
강화 옵션은 컴파일러 래퍼에 의해 적용되므로 로그에 표시되지 않습니다.
분명히 hardeningDisable
이것이 래퍼에 영향을 미치는 유일한 방법입니다.
한 가지 가능한 해결책은 와 함께 사용할 더미 Nix 표현식을 만드는 것입니다 nix-shell -A
. 예: 별도의 위치( )에
복사하여 쓰기 가능하게 만들고, 포함을 추가합니다 .~/.nix-defexpr/channels_root/nixos/
<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
.
답변2
nix-shell에서 gcc 강화 플래그 비활성화
# shell.nix
{ pkgs ? import <nixpkgs> {} }:
with pkgs;
mkShell {
# disable all hardening flags
NIX_HARDENING_ENABLE = "";
# enable default hardening flags
#NIX_HARDENING_ENABLE = "pie pic format stackprotector fortify strictoverflow";
buildInputs = [
#gnumake
#python3
# ...
];
}
확인하다
$ NIX_DEBUG=1 gcc -v 2>&1 | grep ^HARDENING
HARDENING: disabled flags: pie pic format stackprotector fortify strictoverflow
기반으로
$ which gcc
/nix/store/l0fvy72hpfdpjjs3dk4112f57x7r3dlm-gcc-wrapper-12.2.0/bin/gcc
$ grep add-hardening.sh /nix/store/l0fvy72hpfdpjjs3dk4112f57x7r3dlm-gcc-wrapper-12.2.0/bin/gcc
source /nix/store/l0fvy72hpfdpjjs3dk4112f57x7r3dlm-gcc-wrapper-12.2.0/nix-support/add-hardening.sh
또한보십시오:Nixpkgs의 지원군nixpkgs 매뉴얼에서