https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111527
--- Comment #2 from Sergei Trofimovich <slyfox at gcc dot gnu.org> --- (In reply to Richard Biener from comment #1) > Hm, but the COLLECT_GCC_OPTIONS variable is only used for communicating > between the driver and the linker, the options therein are individually > passed to the program execved? AFAIU the driver sets `COLLECT_GCC_OPTIONS` variable and never unsets it. As a result it affects all the `exevce() calls. Be it `cc1`, `as` or anything else regardless of the fact if it uses the variable or not. `cc1` is probably the first casualty. As a simplistic example here we break `ls` with too large environment file: $ COLLECT_GCC_OPTIONS=$(printf "%0*d" 200000 0) ls -bash: /run/current-system/sw/bin/ls: Argument list too long > You are maybe looking for the -f*-map options to take a file as input > containing multiple mappings? `NixOS` is also occasionally hottong the same limit by passing too many include an library paths: -I/nix/store/hash1-foo/include -I/nix/store/hash2-bar/include ... -L/nix/store/hash1-foo/lib -L/nix/store/hash2-bar/lib ... -Wl,-rpath,/nix/store/hash1-foo/lib -Wl,-rpath,/nix/store/hash2-bar/lib I wonder if we could solve all of these limitations here by at least avoiding `COLLECT_GCC_OPTIONS`. But otherwise if generic fix is too invasive change then passing a mapping file should do as well. What would be an acceptable for of the file? A new option, like? -fmacro-prefix-map-file=./foo with entries of exactly the same form $ cat foo /nix/store/hash1-foo=/nix/store/00000000-foo /nix/store/hash2-bar=/nix/store/00000000-bar ... Or maybe reuse existing -fmacro-prefix-map= and use response-style file input? Like -fmacro-prefix-map=@./foo. clang would probably need the same handling if we were to extend the driver.