This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Bug in gcc.c for_each_path() (leads to invalid crt0.o selection)?


Hallo Joseph,

On 05/12/16 23:02, Joseph Myers wrote:
On Mon, 5 Dec 2016, Sebastian Huber wrote:

If we assume that the command line order determines the search order, then its
not clear why for_each_path() first iterates for all paths with the multilib
postfix and then without. Shouldn't it iterate over all paths and check
with/without multilib postfix in each step?
No.  The directory without the multilib postfix is generally the directory
for another multilib, i.e. always wrong to search, and in case the library
appears earlier in the non-multilib directories than the multilib ones,
mixing the search paths (and there may already be some unwanted mixing
when sysroots are involved) would result in the wrong library being
chosen.

Unfortunately, getting rid of the search of non-multilib directories
completely is hard.  It was removed in r96915
<https://gcc.gnu.org/ml/gcc-patches/2004-11/msg01895.html>.  Then this was
reverted in <https://gcc.gnu.org/ml/gcc-patches/2005-12/msg00818.html>.
Furthermore, it turns out there is a case where the existing multilib
configuration machinery cannot express things correctly without searching
non-multilib directories.  Specifically, consider the combination of
MULTILIB_OSDIRNAMES with sysroot suffixes.  This is used by
config/mips/{t-mti-linux,mti-linux.h}, for example.

MULTILIB_OSDIRNAMES provides directory names used in two ways: relative to
$target/lib/ in the GCC installation, and relative to lib/ and usr/lib/ in
a sysroot.  For the latter, we want names such as plain ../lib64, but
these cannot be used outside the sysroot because different multilibs would
be mapped to the same directory.  The solution to this issue relies on
searches without multilib suffixes: you define STARTFILE_PREFIX_SPEC
(which used to be used more widely before MULTILIB_OSDIRNAMES was added in
the first place) so sysroot libraries can be found by the combination of
(sysroot, sysroot suffix, startfile prefix, *no* multilib suffix).

So while this case of MULTILIB_OSDIRNAMES with multiple sysroots makes it
hard to eliminate the search of non-multilib directories, they should be
searched as late as possible to reduce the risk of problems from the wrong
libraries being found.

thanks for the detailed explanation. I guess, then the root cause for my problem is that the Newlib provided crt0.o files in the build tree are not in the same relative location of the installation tree. In the build tree, they reside in a "newlib" subdirectory. I changed the Newlib build flags set by GCC to use -L instead of -B and this seems to work (comment is wrong now). Does it make sense to submit such a patch or has it maybe some nasty side-effects?

diff --git a/configure b/configure
index b6389e4..3c84acb 100755
--- a/configure
+++ b/configure
@@ -7497,7 +7497,7 @@ case " $target_configdirs " in
       # If we're building newlib, use its generic headers last, but search
       # for any libc-related directories first (so make it the last -B
       # switch).
- FLAGS_FOR_TARGET=$FLAGS_FOR_TARGET' -B$$r/$(TARGET_SUBDIR)/newlib/ -isystem $$r/$(TARGET_SUBDIR)/newlib/targ-include -isystem $$s/newlib/libc/include' + FLAGS_FOR_TARGET=$FLAGS_FOR_TARGET' -L$$r/$(TARGET_SUBDIR)/newlib/ -isystem $$r/$(TARGET_SUBDIR)/newlib/targ-include -isystem $$s/newlib/libc/include'

# If we're building libgloss, find the startup file, simulator library
       # and linker script.
diff --git a/configure.ac b/configure.ac
index 51ee705..ca6fb88 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3086,7 +3086,7 @@ case " $target_configdirs " in
       # If we're building newlib, use its generic headers last, but search
       # for any libc-related directories first (so make it the last -B
       # switch).
- FLAGS_FOR_TARGET=$FLAGS_FOR_TARGET' -B$$r/$(TARGET_SUBDIR)/newlib/ -isystem $$r/$(TARGET_SUBDIR)/newlib/targ-include -isystem $$s/newlib/libc/include' + FLAGS_FOR_TARGET=$FLAGS_FOR_TARGET' -L$$r/$(TARGET_SUBDIR)/newlib/ -isystem $$r/$(TARGET_SUBDIR)/newlib/targ-include -isystem $$s/newlib/libc/include'

# If we're building libgloss, find the startup file, simulator library
       # and linker script.
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index c7b1eaf..9e8dea1 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -3809,7 +3809,7 @@ site.exp: ./config.status Makefile
        @if [ -d $(objdir)/../$(target_subdir)/newlib ] \
            && [ "${host}" != "${target}" ]; then \
echo "set newlib_cflags \"-I$(objdir)/../$(target_subdir)/newlib/targ-include -I\$$srcdir/../newlib/libc/include\"" >> ./site.tmp; \ - echo "set newlib_ldflags \"-B$(objdir)/../$(target_subdir)/newlib/\"" >> ./site.tmp; \ + echo "set newlib_ldflags \"-L$(objdir)/../$(target_subdir)/newlib/\"" >> ./site.tmp; \
          echo "append CFLAGS \" \$$newlib_cflags\"" >> ./site.tmp; \
          echo "append CXXFLAGS \" \$$newlib_cflags\"" >> ./site.tmp; \
          echo "append LDFLAGS \" \$$newlib_ldflags\"" >> ./site.tmp; \

--
Sebastian Huber, embedded brains GmbH

Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone   : +49 89 189 47 41-16
Fax     : +49 89 189 47 41-09
E-Mail  : sebastian.huber@embedded-brains.de
PGP     : Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]