On Wed, 12 Aug 2020 at 01:02, Paul Smith <p...@mad-scientist.net> wrote:
>
> This is a kind of esoteric problem, but all the more annoying for that.
>
> As usual I've built my own version of GCC, and then I check it into Git
> so that all builds can use this one canonical compiler regardless of
> operating system, etc.
>
> After being checked into Git, the compiler started failing to link with
> an error that it could not find libgcc_s.so, even though it exists in
> exactly the same place (relatively) as it was before.
>
> After some debugging and strace-ing, I discovered that in the failure
> mode the front-end didn't provide this flag to collect2, which is where
> libgcc_s.so lives:
>
> -L/.../cc/unknown/bin/../lib/gcc/x86_64-unknown-linux-gnu/10.2.0/../../../../x86_64-unknown-linux-gnu/lib/../lib64/.
>
> The problem is this: when I built this compiler I only built the 64bit
> version of it, not the 32bit version.  As a result, the lib/.
> directories are empty: only the lib64 directories have any content.
>
> When I check this into Git, of course all empty directories are
> ignored.  So while the /.../cc/unknown/x86_64-unknown-linux-gnu/lib64
> directory, where 64bit libgcc_s.so lives, does exist, the
> /.../cc/unknown/x86_64-unknown-linux-gnu/lib directory doesn't exist,
> which means the above path cannot be resolved.
>
> Of course, I can force the lib directory to exist by adding a dummy
> file there and I will do so.  However, it seems to me that it would be
> better if GCC would apply a simplifying function to pathnames to reduce
> all the "/.." elements, before it starts looking for directories, to
> avoid failing if some unnecessary element doesn't exist.  This
> shouldn't be too difficult since the path will be either the same
> length as, or shorter than, the original so there's no need to
> reallocate memory etc.: it can be updated in place.
>
> Oddly, I looked through the gnulib library and didn't find any
> appropriate module for this.  It seems like there should be one.

C++17 provides std::filesystem::weakly_canonical for that. It doesn't
help GCC or gnulib though.

POSIX realpath and GNU canonicalize_file_name do the canonicalization,
but require every path component to exist.

I think it's worth adding this to bugzilla. Depending on the existence
of empty directories seems less than ideal.

Reply via email to