Use picolibcpp.ld and add crtbegin.o and crtend.o when linking C++
applications.

Signed-off-by: Keith Packard <[email protected]>
---
 gcc/config/picolibc-spec.h | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/gcc/config/picolibc-spec.h b/gcc/config/picolibc-spec.h
index d1024ced3e7..7c43c79545e 100644
--- a/gcc/config/picolibc-spec.h
+++ b/gcc/config/picolibc-spec.h
@@ -23,6 +23,14 @@
    <http://www.gnu.org/licenses/>.  */
 
 #define PICOLIBC_LD "picolibc.ld"
+#define PICOLIBCPP_LD "picolibcpp.ld"
+
+#define EXCEPT_FILE_ELSE(_except, _noexcept) "%:if-driverlang(c++ " _except " 
" _noexcept ")"
+#define EXCEPT_FILE(_except) "%:if-driverlang(c++ " _except ")"
+
+#define PICOLIBC_SCRIPT   EXCEPT_FILE_ELSE(PICOLIBCPP_LD, PICOLIBC_LD)
+#define PICOLIBC_CRTEND   EXCEPT_FILE("crtend%O%s")
+#define PICOLIBC_CRTBEGIN EXCEPT_FILE("crtbegin%O%s")
 
 /* Default to local-exec TLS model.  */
 #undef OS_CC1_SPEC
@@ -39,7 +47,7 @@
  * Define vfscanf if --scanf is set
  */
 #define LIBC_LINK_SPEC                                                 \
-  " %{!shared:%{!r:%{!T*: %:if-exists-then-else(%:find-file(" PICOLIBC_LD ") 
-T" PICOLIBC_LD ")}}}" \
+  " %{!shared:%{!r:%{!T*: %:if-exists-then-else(%:find-file(" PICOLIBC_SCRIPT 
") -T" PICOLIBC_SCRIPT ")}}}" \
   " %{-printf=*:--defsym=" USER_LABEL_PREFIX "vfprintf=" USER_LABEL_PREFIX 
"__%*_vfprintf}" \
   " %{-scanf=*:--defsym=" USER_LABEL_PREFIX "vfscanf=" USER_LABEL_PREFIX 
"__%*_vfscanf}"
 
@@ -50,8 +58,11 @@
 #undef LIB_SPEC
 #define LIB_SPEC "--start-group -lc %{-oslib=*:-l%*} %(libgcc) --end-group"
 
+#undef ENDFILE_SPEC
+#define ENDFILE_SPEC PICOLIBC_CRTEND
+
 /* Select alternate crt0 version if --crt0 is specified */
 #undef  STARTFILE_SPEC
-#define STARTFILE_SPEC "%{-crt0=*:crt0-%*%O%s; :crt0%O%s}"
+#define STARTFILE_SPEC "%{-crt0=*:crt0-%*%O%s; :crt0%O%s} " PICOLIBC_CRTBEGIN
 
 #define EH_TABLES_CAN_BE_READ_ONLY 1
-- 
2.51.0

Reply via email to