On 2/8/24 10:04, Iain Sandoe wrote:
Hi Jason,
I have tested this on modern Darwin (with libc++ as the system library) and on
older Darwin, where we do see the issue - because the system linker is written
in C++ and links with libstdc++ (so sometimes we get a crash, or worse
unpredictable
beahviour).
Thank you!
-----
For modern Darwin [ > macOS 10.11] , there’s no issue seen so far, but for
older Darwin….
On 8 Feb 2024, at 05:36, Alexandre Oliva <ol...@adacore.com> wrote:
On Feb 6, 2024, Jason Merrill <ja...@redhat.com> wrote:
Reverting that hunk of the change fixed my problem with bubblestrapping GCC
12 with ccache on a host with a newer system libstdc++.
Did you have libcc1, gnattools and gotools enabled in your testing?
… I have done all but “go” since that’s not supported on Darwin.
The patch breaks bootstrap on older Darwin because:
Ada uses exceptions.
gnat1 pulls in system libraries that link with the system unwinder
- so we have to link gnat1 “-shared-libgcc”
- which means we need to be able to find the just-built one when building
the target libs.
Hmm. In stage 1, when we build with the system gcc, I'd think we want
the just-built gnat1 to find the system libgcc.
In stage 2, when we build with the stage 1 gcc, we want the just-built
gnat1 to find the stage 1 libgcc.
In neither case do we want it to find the libgcc from the current stage.
So it seems to me that what we want is for stage2+ LD_LIBRARY_PATH to
include the TARGET_LIB_PATH from the previous stage. Something like the
below, on top of the earlier patch.
Does this make sense? Does it work on Darwin?
From 1115afdce16742003030599aab327daaf9db5073 Mon Sep 17 00:00:00 2001
From: Jason Merrill <ja...@redhat.com>
Date: Thu, 8 Feb 2024 11:58:11 -0500
Subject: [PATCH] build: add prev target libs to rpath
To: gcc-patches@gcc.gnu.org
ChangeLog:
* Makefile.tpl (POSTSTAGE1_HOST_EXPORTS): Add TARGET_PREV_LIB_PATH
to RPATH_ENVVAR.
* Makefile.in: Regenerate.
---
Makefile.in | 14 +++++++++++++-
Makefile.tpl | 10 +++++++++-
2 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/Makefile.in b/Makefile.in
index c2843d5df89..31737cba37f 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -266,6 +266,7 @@ POSTSTAGE1_CXX_EXPORT = \
# Similar, for later GCC stages.
POSTSTAGE1_HOST_EXPORTS = \
$(HOST_EXPORTS) \
+ $(RPATH_ENVVAR)=`echo "$(TARGET_PREV_LIB_PATH)$$$(RPATH_ENVVAR)" | sed 's,::*,:,g;s,^:*,,;s,:*$$,,'`; export $(RPATH_ENVVAR); \
CC="$(STAGE_CC_WRAPPER) $$r/$(HOST_SUBDIR)/prev-gcc/xgcc$(exeext) \
-B$$r/$(HOST_SUBDIR)/prev-gcc/ -B$(build_tooldir)/bin/ \
$(XGCC_FLAGS_FOR_TARGET) $$TFLAGS"; export CC; \
@@ -727,41 +728,51 @@ all:
# This is the list of directories that may be needed in RPATH_ENVVAR
# so that programs built for the target machine work.
TARGET_LIB_PATH = $(TARGET_LIB_PATH_libstdc++-v3)$(TARGET_LIB_PATH_libsanitizer)$(TARGET_LIB_PATH_libvtv)$(TARGET_LIB_PATH_libssp)$(TARGET_LIB_PATH_libphobos)$(TARGET_LIB_PATH_libgm2)$(TARGET_LIB_PATH_libgomp)$(TARGET_LIB_PATH_libitm)$(TARGET_LIB_PATH_libatomic)$(HOST_LIB_PATH_gcc)
+TARGET_PREV_LIB_PATH = $(TARGET_PREV_LIB_PATH_libstdc++-v3)$(TARGET_PREV_LIB_PATH_libsanitizer)$(TARGET_PREV_LIB_PATH_libvtv)$(TARGET_PREV_LIB_PATH_libssp)$(TARGET_PREV_LIB_PATH_libphobos)$(TARGET_PREV_LIB_PATH_libgm2)$(TARGET_PREV_LIB_PATH_libgomp)$(TARGET_PREV_LIB_PATH_libitm)$(TARGET_PREV_LIB_PATH_libatomic)$(HOST_PREV_LIB_PATH_gcc)
@if target-libstdc++-v3
TARGET_LIB_PATH_libstdc++-v3 = $$r/$(TARGET_SUBDIR)/libstdc++-v3/src/.libs:
+TARGET_PREV_LIB_PATH_libstdc++-v3 = $$r/prev-$(TARGET_SUBDIR)/libstdc++-v3/src/.libs:
@endif target-libstdc++-v3
@if target-libsanitizer
TARGET_LIB_PATH_libsanitizer = $$r/$(TARGET_SUBDIR)/libsanitizer/.libs:
+TARGET_PREV_LIB_PATH_libsanitizer = $$r/prev-$(TARGET_SUBDIR)/libsanitizer/.libs:
@endif target-libsanitizer
@if target-libvtv
TARGET_LIB_PATH_libvtv = $$r/$(TARGET_SUBDIR)/libvtv/.libs:
+TARGET_PREV_LIB_PATH_libvtv = $$r/prev-$(TARGET_SUBDIR)/libvtv/.libs:
@endif target-libvtv
@if target-libssp
TARGET_LIB_PATH_libssp = $$r/$(TARGET_SUBDIR)/libssp/.libs:
+TARGET_PREV_LIB_PATH_libssp = $$r/prev-$(TARGET_SUBDIR)/libssp/.libs:
@endif target-libssp
@if target-libphobos
TARGET_LIB_PATH_libphobos = $$r/$(TARGET_SUBDIR)/libphobos/src/.libs:
+TARGET_PREV_LIB_PATH_libphobos = $$r/prev-$(TARGET_SUBDIR)/libphobos/src/.libs:
@endif target-libphobos
@if target-libgm2
TARGET_LIB_PATH_libgm2 = $$r/$(TARGET_SUBDIR)/libgm2/.libs:
+TARGET_PREV_LIB_PATH_libgm2 = $$r/prev-$(TARGET_SUBDIR)/libgm2/.libs:
@endif target-libgm2
@if target-libgomp
TARGET_LIB_PATH_libgomp = $$r/$(TARGET_SUBDIR)/libgomp/.libs:
+TARGET_PREV_LIB_PATH_libgomp = $$r/prev-$(TARGET_SUBDIR)/libgomp/.libs:
@endif target-libgomp
@if target-libitm
TARGET_LIB_PATH_libitm = $$r/$(TARGET_SUBDIR)/libitm/.libs:
+TARGET_PREV_LIB_PATH_libitm = $$r/prev-$(TARGET_SUBDIR)/libitm/.libs:
@endif target-libitm
@if target-libatomic
TARGET_LIB_PATH_libatomic = $$r/$(TARGET_SUBDIR)/libatomic/.libs:
+TARGET_PREV_LIB_PATH_libatomic = $$r/prev-$(TARGET_SUBDIR)/libatomic/.libs:
@endif target-libatomic
@@ -772,7 +783,8 @@ HOST_LIB_PATH = $(HOST_LIB_PATH_gmp)$(HOST_LIB_PATH_mpfr)$(HOST_LIB_PATH_mpc)$(H
# Define HOST_LIB_PATH_gcc here, for the sake of TARGET_LIB_PATH, ouch
@if gcc
-HOST_LIB_PATH_gcc = $$r/$(HOST_SUBDIR)/gcc$(GCC_SHLIB_SUBDIR):$$r/$(HOST_SUBDIR)/prev-gcc$(GCC_SHLIB_SUBDIR):
+HOST_LIB_PATH_gcc = $$r/$(HOST_SUBDIR)/gcc$(GCC_SHLIB_SUBDIR)
+
@endif gcc
diff --git a/Makefile.tpl b/Makefile.tpl
index cb39fbd0434..cbb07c93a34 100644
--- a/Makefile.tpl
+++ b/Makefile.tpl
@@ -269,6 +269,7 @@ POSTSTAGE1_CXX_EXPORT = \
# Similar, for later GCC stages.
POSTSTAGE1_HOST_EXPORTS = \
$(HOST_EXPORTS) \
+ $(RPATH_ENVVAR)=`echo "$(TARGET_PREV_LIB_PATH)$$$(RPATH_ENVVAR)" | sed 's,::*,:,g;s,^:*,,;s,:*$$,,'`; export $(RPATH_ENVVAR); \
CC="$(STAGE_CC_WRAPPER) $$r/$(HOST_SUBDIR)/prev-gcc/xgcc$(exeext) \
-B$$r/$(HOST_SUBDIR)/prev-gcc/ -B$(build_tooldir)/bin/ \
$(XGCC_FLAGS_FOR_TARGET) $$TFLAGS"; export CC; \
@@ -652,9 +653,13 @@ all:
TARGET_LIB_PATH = [+ FOR target_modules +][+
IF lib_path +]$(TARGET_LIB_PATH_[+module+])[+ ENDIF lib_path +][+
ENDFOR target_modules +]$(HOST_LIB_PATH_gcc)
+TARGET_PREV_LIB_PATH = [+ FOR target_modules +][+
+ IF lib_path +]$(TARGET_PREV_LIB_PATH_[+module+])[+ ENDIF lib_path +][+
+ ENDFOR target_modules +]$(HOST_PREV_LIB_PATH_gcc)
[+ FOR target_modules +][+ IF lib_path +]
@if target-[+module+]
TARGET_LIB_PATH_[+module+] = $$r/$(TARGET_SUBDIR)/[+module+]/[+lib_path+]:
+TARGET_PREV_LIB_PATH_[+module+] = $$r/prev-$(TARGET_SUBDIR)/[+module+]/[+lib_path+]:
@endif target-[+module+]
[+ ENDIF lib_path +][+ ENDFOR target_modules +]
@@ -667,7 +672,10 @@ HOST_LIB_PATH = [+ FOR host_modules +][+
# Define HOST_LIB_PATH_gcc here, for the sake of TARGET_LIB_PATH, ouch
@if gcc
-HOST_LIB_PATH_gcc = $$r/$(HOST_SUBDIR)/gcc$(GCC_SHLIB_SUBDIR):$$r/$(HOST_SUBDIR)/prev-gcc$(GCC_SHLIB_SUBDIR):
+HOST_LIB_PATH_gcc = $$r/$(HOST_SUBDIR)/gcc$(GCC_SHLIB_SUBDIR)
+[+ IF bootstrap +]
+HOST_PREV_LIB_PATH_gcc = $$r/$(HOST_SUBDIR)/prev-gcc$(GCC_SHLIB_SUBDIR):
+[+ ENDIF bootstrap +]
@endif gcc
[+ FOR host_modules +][+ IF lib_path +]
--
2.43.0