[Bug preprocessor/96027] New: Windows: gcc does not resolve long relative header paths correctly
kai.koehne at qt dot io
gcc-bugzilla@gcc.gnu.org
Thu Jul 2 09:06:37 GMT 2020
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96027
Bug ID: 96027
Summary: Windows: gcc does not resolve long relative header
paths correctly
Product: gcc
Version: 8.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: preprocessor
Assignee: unassigned at gcc dot gnu.org
Reporter: kai.koehne at qt dot io
Target Milestone: ---
Created attachment 48823
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=48823&action=edit
Test case with directory structure; should be extracted to C:\
In some scenarios gcc on Windows does not resolve includes of headers
correctly, resulting in errors like:
> fatal error: ../../../../../src/BBBBBBBBBBBBBBB/BBBBBBBBBBBBB/BBBBBBBB/BBBBBBBBBBBBBBBBBBBBBBB.h: No such file or directory
The exact circumstances are unclear, but both the length of the (relative)
header path and the length of the absolute paths in the file system play a
role.
Attached you can find a somewhat minimal example, which you need to extract
into a top-level directory (e.g. C:\).
# HOW TO REPRODUCE
Open Windows command line. Extract attachment into C:\, navigate into AAAAAAA,
run e.g. mingw32-make:
> C:\AAAAAAA>mingw32-make
> cd AAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAA/src/AAAAAAA/AAAAAAAAA/AAAAAAAAA && mingw32-make
> mingw32-make[1]: Entering directory 'C:/AAAAAAA/AAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAA/src/AAAAAAA/AAAAAAAAA/AAAAAAAAA'
> gcc.exe -I../../../../include/CCCCCCCCCCCCCCCCCCCCC\CCCCCC test.cpp
> In file included from test.cpp:1:
> ../../../../include/CCCCCCCCCCCCCCCCCCCCC\CCCCCC/BBBBBBBBBBBBBBBBBBBBB/BBBBBBB/BBBBBBBBBBBBBBBBBBBBBBB.h:1:10: fatal error: ../../../../../src/BBBBBBBBBBBBBBB/BBBBBBBBBBBBB/BBBBBBBB/BBBBBBBBBBBBBBBBBBBBBBB.h: No such file or directory
> #include "../../../../../src/BBBBBBBBBBBBBBB/BBBBBBBBBBBBB/BBBBBBBB/BBBBBBBBBBBBBBBBBBBBBBB.h"
> > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> compilation terminated.
# WHAT IS THE EXPECTED OUPUT
If using clang, the header file is found:
> clang.exe -I../../../../include/CCCCCCCCCCCCCCCCCCCCC\CCCCCC test.cpp
> In file included from test.cpp:1:
> In file included from ../../../../include/CCCCCCCCCCCCCCCCCCCCC\CCCCCC\BBBBBBBBBBBBBBBBBBBBB/BBBBBBB/BBBBBBBBBBBBBBBBBBBBBBB.h:1:
> ../../../../include/CCCCCCCCCCCCCCCCCCCCC\CCCCCC\BBBBBBBBBBBBBBBBBBBBB/BBBBBBB/../../../../../src/BBBBBBBBBBBBBBB/BBBBBBBBBBBBB/BBBBBBBB/BBBBBBBBBBBBBBBBBBBBBBB.h:1:9: warning:
> HEADER FILE WAS FOUND, ALL GOOD! [-W#pragma-messages]
> #pragma message "HEADER FILE WAS FOUND, ALL GOOD!"
> ^
> 1 warning generated.
The same is also true for gcc if the path is shortened, e.g. by shortening the
very first path:
> C:\AAAAAAA>subst X: .
>
> C:\AAAAAAA>X:
>
> X:\>mingw32-make
> cd AAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAA/src/AAAAAAA/AAAAAAAAA/AAAAAAAAA && mingw32-make
> mingw32-make[1]: Entering directory 'X:/AAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAA/src/AAAAAAA/AAAAAAAAA/AAAAAAAAA'
> gcc.exe -I../../../../include/CCCCCCCCCCCCCCCCCCCCC\CCCCCC test.cpp
> In file included from ../../../../include/CCCCCCCCCCCCCCCCCCCCC\CCCCCC/BBBBBBBBBBBBBBBBBBBBB/BBBBBBB/BBBBBBBBBBBBBBBBBBBBBBB.h:1,
> from test.cpp:1:
> x:\aaaaaaaaa\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\aaaaaa\src\bbbbbbbbbbbbbbb\bbbbbbbbbbbbb\bbbbbbbb\bbbbbbbbbbbbbbbbbbbbbbb.h:1:17: note: '#pragma message: HEADER FILE WAS FOUND, ALL GOOD!'
> 1 | #pragma message "HEADER FILE WAS FOUND, ALL GOOD!"
> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> mingw32-make[1]: Leaving directory 'X:/AAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAA/src/AAAAAAA/AAAAAAAAA/AAAAAAAAA'
# FURTHER INSIGHTS
If monitoring the Windows API it becomes clear that gcc somehow tries a wrong
path:
> 10:52:44,2386745 cc1plus.exe 20520 CreateFile C:\aaaaaaa\aaaaaaaaa\src\bbbbbbbbbbbbbbb\bbbbbbbbbbbbb\bbbbbbbb\bbbbbbbbbbbbbbbbbbbbbbb.h PATH NOT FOUND Desired Access: Generic Read, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: N, ShareMode: Read, Write, AllocationSize: n/a
> 10:52:44,2387339 cc1plus.exe 20520 CreateFile C:\src\bbbbbbbbbbbbbbb\bbbbbbbbbbbbb\bbbbbbbb\bbbbbbbbbbbbbbbbbbbbbbb.h PATH NOT FOUND Desired Access: Generic Read, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: N, ShareMode: Read, Write, AllocationSize: n/a
> 10:52:44,2387899 cc1plus.exe 20520 CreateFile C:\winlibs\src\bbbbbbbbbbbbbbb\bbbbbbbbbbbbb\bbbbbbbb\bbbbbbbbbbbbbbbbbbbbbbb.h PATH NOT FOUND Desired Access: Generic Read, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: N, ShareMode: Read, Write, AllocationSize: n/a
> 10:52:44,2388532 cc1plus.exe 20520 CreateFile C:\winlibs\winlibs-x86_64-posix-seh-gcc-10.1.0-llvm-10.0.0-mingw-w64-7.0.0-r3\src\bbbbbbbbbbbbbbb\bbbbbbbbbbbbb\bbbbbbbb\bbbbbbbbbbbbbbbbbbbbbbb.h PATH NOT FOUND Desired Access: Generic Read, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: N, ShareMode: Read, Write, AllocationSize: n/a
# GCC VERSIONS TESTED
> Using built-in specs.
> COLLECT_GCC=C:\winlibs\winlibs-x86_64-posix-seh-gcc-10.1.0-llvm-10.0.0-mingw-w64-7.0.0-r3\bin\gcc.exe
> COLLECT_LTO_WRAPPER=c:/winlibs/winlibs-x86_64-posix-seh-gcc-10.1.0-llvm-10.0.0-mingw-w64-7.0.0-r3/bin/../libexec/gcc/x86_64-w64-mingw32/10.1.0/lto-wrapper.exe
> Target: x86_64-w64-mingw32
> Configured with: ../configure --prefix=/R/winlibs64_10.1.0/inst_gcc-10.1.0/share/gcc --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --with-pkgversion='MinGW-W64 x86_64-posix-seh, built by Brecht Sanders' --with-tune=generic --enable-checking=release --enable-threads=posix --disable-sjlj-exceptions --disable-libunwind-exceptions --enable-serial-configure --disable-bootstrap --enable-host-shared --enable-plugin --enable-default-ssp --disable-rpath --disable-libstdcxx-pch --enable-libstdcxx-time=yes --disable-libstdcxx-debug --disable-version-specific-runtime-libs --with-stabs --disable-symvers --enable-languages=c,c++,fortran,lto,objc,obj-c++,d --disable-gold --disable-nls --disable-stage1-checking --disable-win32-registry --disable-multilib --enable-ld --enable-libquadmath --enable-libada --enable-libssp --enable-libstdcxx --enable-lto --enable-fully-dynamic-string --enable-libgomp --enable-graphite --enable-mingw-wildcard --with-mpc=/d/winlibs64_10.1.0/custombuilt --with-mpfr=/d/winlibs64_10.1.0/custombuilt --with-gmp=/d/winlibs64_10.1.0/custombuilt --with-isl=/d/winlibs64_10.1.0/custombuilt --enable-install-libiberty --enable-__cxa_atexit --without-included-gettext --with-diagnostics-color=auto --with-libiconv --with-system-zlib --with-build-sysroot=/R/winlibs64_10.1.0/gcc-10.1.0/build_mingw/mingw-w64
> Thread model: posix
> Supported LTO compression algorithms: zlib zstd
> gcc version 10.1.0 (MinGW-W64 x86_64-posix-seh, built by Brecht Sanders)
> Using built-in specs.
> COLLECT_GCC=C:\mingw-builds\i686-8.1.0-release-posix-dwarf-rt_v6-rev0\bin\gcc
> COLLECT_LTO_WRAPPER=C:/mingw-builds/i686-8.1.0-release-posix-dwarf-rt_v6-rev0/bin/../libexec/gcc/i686-w64-mingw32/8.1.0/lto-wrapper.exe
> Target: i686-w64-mingw32
> Configured with: ../../../src/gcc-8.1.0/configure --host=i686-w64-mingw32 --build=i686-w64-mingw32 --target=i686-w64-mingw32 --prefix=/mingw32 --with-sysroot=/c/mingw810/i686-810-posix-dwarf-rt_v6-rev0/mingw32 --enable-shared --enable-static --disable-multilib --enable-languages=c,c++,fortran,lto --enable-libstdcxx-time=yes --enable-threads=posix --enable-libgomp --enable-libatomic --enable-lto --enable-graphite --enable-checking=release --enable-fully-dynamic-string --enable-version-specific-runtime-libs --disable-sjlj-exceptions --with-dwarf2 --disable-libstdcxx-pch --disable-libstdcxx-debug --enable-bootstrap --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-gnu-as --with-gnu-ld --with-arch=i686 --with-tune=generic --with-libiconv --with-system-zlib --with-gmp=/c/mingw810/prerequisites/i686-w64-mingw32-static --with-mpfr=/c/mingw810/prerequisites/i686-w64-mingw32-static --with-mpc=/c/mingw810/prerequisites/i686-w64-mingw32-static --with-isl=/c/mingw810/prerequisites/i686-w64-mingw32-static --with-pkgversion='i686-posix-dwarf-rev0, Built by MinGW-W64 project' --with-bugurl=https://sourceforge.net/projects/mingw-w64 CFLAGS='-O2 -pipe -fno-ident -I/c/mingw810/i686-810-posix-dwarf-rt_v6-rev0/mingw32/opt/include -I/c/mingw810/prerequisites/i686-zlib-static/include -I/c/mingw810/prerequisites/i686-w64-mingw32-static/include' CXXFLAGS='-O2 -pipe -fno-ident -I/c/mingw810/i686-810-posix-dwarf-rt_v6-rev0/mingw32/opt/include -I/c/mingw810/prerequisites/i686-zlib-static/include -I/c/mingw810/prerequisites/i686-w64-mingw32-static/include' CPPFLAGS=' -I/c/mingw810/i686-810-posix-dwarf-rt_v6-rev0/mingw32/opt/include -I/c/mingw810/prerequisites/i686-zlib-static/include -I/c/mingw810/prerequisites/i686-w64-mingw32-static/include' LDFLAGS='-pipe -fno-ident -L/c/mingw810/i686-810-posix-dwarf-rt_v6-rev0/mingw32/opt/lib -L/c/mingw810/prerequisites/i686-zlib-static/lib -L/c/mingw810/prerequisites/i686-w64-mingw32-static/lib -Wl,--large-address-aware'
> Thread model: posix
> gcc version 8.1.0 (i686-posix-dwarf-rev0, Built by MinGW-W64 project)
> gcc (MinGW.org GCC Build-20200227-1) 9.2.0
> Copyright (C) 2019 Free Software Foundation, Inc.
> This is free software; see the source for copying conditions. There is NO
> warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
More information about the Gcc-bugs
mailing list