Hello!

Would the attached patch be acceptable?

The gcc.c patch part should really go to gcc/config/linux.h, but sadly not 
all archs include that file.

for HAVE_ENDFILE_MATH and HAVE_NOSTARTFILE_STATIC another possibility 
would be
%{static:%:if-exists-else(crtbeginT.o%s crtbegin.o%s)}
%{ffast-math|funsafe-math-optimizations:%:if-exists(crtfastmath.o%s)}

Thanks, Peter

PS: please CC to me, not on ml.

-- 
Peter S. Mazinger <ps dot m at gmx dot net>           ID: 0xA5F059F2
Key fingerprint = 92A4 31E1 56BC 3D5A 2D08  BB6E C389 975E A5F0 59F2
--- gcc-4.1/gcc/config/alpha/elf.h.startend~    2005-09-05 15:42:35 +0200
+++ gcc-4.1/gcc/config/alpha/elf.h      2006-01-09 02:12:01 +0100
@@ -392,25 +392,16 @@
    before entering `main'.  */
 
 #undef STARTFILE_SPEC
-#ifdef HAVE_LD_PIE
-#define STARTFILE_SPEC \
-  "%{!shared: %{pg|p:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}}\
-   crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
-#else
-#define STARTFILE_SPEC \
-  "%{!shared: %{pg|p:gcrt1.o%s;:crt1.o%s}}\
-   crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
-#endif
+#define STARTFILE_SPEC STARTFILE_PIE_LINUX_SPEC
 
 /* Provide a ENDFILE_SPEC appropriate for ELF.  Here we tack on the
    magical crtend.o file which provides part of the support for
    getting C++ file-scope static object constructed before entering
    `main', followed by a normal ELF "finalizer" file, `crtn.o'.  */
 
+#define HAVE_ENDFILE_MATH 1
 #undef ENDFILE_SPEC
-#define ENDFILE_SPEC \
-  "%{ffast-math|funsafe-math-optimizations:crtfastmath.o%s} \
-   %{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s"
+#define ENDFILE_SPEC ENDFILE_PIE_LINUX_SPEC
 
 /* We support #pragma.  */
 #define HANDLE_SYSV_PRAGMA 1
--- gcc-4.1/gcc/config/arm/uclinux-elf.h.startend~      2005-11-12 21:35:52 
+0100
+++ gcc-4.1/gcc/config/arm/uclinux-elf.h        2006-01-09 02:12:35 +0100
@@ -44,13 +44,9 @@
    provides part of the support for getting C++ file-scope static
    object constructed before entering `main'.  */
 
+#define HAVE_NOSTARTFILE_STATIC 1
 #undef  STARTFILE_SPEC
-#define STARTFILE_SPEC \
-  "%{!shared: \
-     %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} \
-                      %{!p:%{profile:gcrt1.o%s} \
-                        %{!profile:crt1.o%s}}}} \
-   crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}"
+#define STARTFILE_SPEC STARTFILE_PIE_LINUX_SPEC
 
 /* Provide a ENDFILE_SPEC appropriate for GNU/Linux.  Here we tack on
    the GNU/Linux magical crtend.o file (see crtstuff.c) which
@@ -59,8 +55,7 @@
    GNU/Linux "finalizer" file, `crtn.o'.  */
 
 #undef  ENDFILE_SPEC
-#define ENDFILE_SPEC \
-  "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s"
+#define ENDFILE_SPEC ENDFILE_PIE_LINUX_SPEC
 
 #undef  CC1_SPEC
 #define CC1_SPEC "%{profile:-p}"
--- gcc-4.1/gcc/config/frv/linux.h.startend~    2006-01-09 02:18:18 +0100
+++ gcc-4.1/gcc/config/frv/linux.h      2006-01-09 02:18:46 +0100
@@ -28,13 +28,10 @@
   "%{!mno-fdpic:-mfdpic}",
 
 #undef STARTFILE_SPEC
-#define STARTFILE_SPEC \
-  "%{!shared: %{pg|p|profile:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}} \
-   crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
+#define STARTFILE_SPEC STARTFILE_PIE_LINUX_SPEC
 
 #undef ENDFILE_SPEC
-#define ENDFILE_SPEC \
-  "%{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s"
+#define ENDFILE_SPEC ENDFILE_PIE_LINUX_SPEC
 
 #undef LINK_SPEC
 #define LINK_SPEC "\
--- gcc-4.1/gcc/config/i386/linux.h.startend~   2006-01-09 02:22:49 +0100
+++ gcc-4.1/gcc/config/i386/linux.h     2006-01-09 02:23:47 +0100
@@ -122,10 +122,8 @@
        %{static:-static}}}"
 
 /* Similar to standard Linux, but adding -ffast-math support.  */
-#undef  ENDFILE_SPEC
-#define ENDFILE_SPEC \
-  "%{ffast-math|funsafe-math-optimizations:crtfastmath.o%s} \
-   %{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s"
+#define HAVE_ENDFILE_MATH 1
+#undef  ENDFILE_SPEC ENDFILE_PIE_LINUX_SPEC
 
 /* A C statement (sans semicolon) to output to the stdio stream
    FILE the assembler definition of uninitialized global DECL named
--- gcc-4.1/gcc/config/ia64/linux.h.startend~   2004-09-08 02:17:14 +0200
+++ gcc-4.1/gcc/config/ia64/linux.h     2006-01-09 02:11:09 +0100
@@ -16,23 +16,15 @@
        builtin_define("_LONGLONG");            \
 } while (0)
 
-/* Need to override linux.h STARTFILE_SPEC, since it has crtbeginT.o in.  */
+#define HAVE_NOSTARTFILE_STATIC 1
 #undef STARTFILE_SPEC
-#ifdef HAVE_LD_PIE
-#define STARTFILE_SPEC \
-  "%{!shared: %{pg|p|profile:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}}\
-   crti.o%s %{shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
-#else
-#define STARTFILE_SPEC \
-  "%{!shared: %{pg|p|profile:gcrt1.o%s;:crt1.o%s}}\
-   crti.o%s %{shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
-#endif
+#define STARTFILE_SPEC STARTFILE_PIE_LINUX_SPEC
 
 /* Similar to standard Linux, but adding -ffast-math support.  */
+
+#define HAVE_ENDFILE_MATH 1
 #undef  ENDFILE_SPEC
-#define ENDFILE_SPEC \
-  "%{ffast-math|funsafe-math-optimizations:crtfastmath.o%s} \
-   %{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s"
+#define ENDFILE_SPEC ENDFILE_PIE_LINUX_SPEC
 
 /* Define this for shared library support because it isn't in the main
    linux.h file.  */
--- gcc-4.1/gcc/config/m32r/linux.h.startend~   2006-01-09 02:19:28 +0100
+++ gcc-4.1/gcc/config/m32r/linux.h     2006-01-09 02:20:04 +0100
@@ -85,20 +85,10 @@
     %{profile:-lc_p} %{!profile: -lc}}"
 
 #undef  STARTFILE_SPEC
-#if defined HAVE_LD_PIE
-#define STARTFILE_SPEC \
-  "%{!shared: %{pg|p|profile:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}} \
-   crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
-#else
-#define STARTFILE_SPEC \
-  "%{!shared: \
-     %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}}\
-   crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}"
-#endif
+#define STARTFILE_SPEC STARTFILE_PIE_LINUX_SPEC
 
 #undef  ENDFILE_SPEC
-#define ENDFILE_SPEC \
-  "%{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s"
+#define ENDFILE_SPEC ENDFILE_PIE_LINUX_SPEC
 
 #undef  SUBTARGET_CPP_SPEC
 #define SUBTARGET_CPP_SPEC "\
--- gcc-4.1/gcc/config/rs6000/linux64.h.startend~       2005-09-16 21:02:29 
+0200
+++ gcc-4.1/gcc/config/rs6000/linux64.h 2006-01-08 15:24:07 +0100
@@ -152,7 +152,7 @@
 #endif
 
 #define ASM_SPEC32 "-a32 %{n} %{T} %{Ym,*} %{Yd,*} \
-%{mrelocatable} %{mrelocatable-lib} %{fpic:-K PIC} %{fPIC:-K PIC} \
+%{mrelocatable} %{mrelocatable-lib} %{fpic|fPIC|fpie|fPIE:-K PIC} \
 %{memb} %{!memb: %{msdata: -memb} %{msdata=eabi: -memb}} \
 %{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: \
     %{mcall-freebsd: -mbig} \
--- gcc-4.1/gcc/config/rs6000/sysv4.h.startend~ 2005-09-05 15:43:47 +0200
+++ gcc-4.1/gcc/config/rs6000/sysv4.h   2006-01-09 02:15:18 +0100
@@ -1017,21 +1017,11 @@
 %{!mnewlib: %{pthread:-lpthread} %{shared:-lc} \
 %{!shared: %{profile:-lc_p} %{!profile:-lc}}}"
 
-#ifdef HAVE_LD_PIE
-#define        STARTFILE_LINUX_SPEC "\
-%{!shared: %{pg|p|profile:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}} \
-%{mnewlib:ecrti.o%s;:crti.o%s} \
-%{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
-#else
-#define        STARTFILE_LINUX_SPEC "\
-%{!shared: %{pg|p|profile:gcrt1.o%s;:crt1.o%s}} \
-%{mnewlib:ecrti.o%s;:crti.o%s} \
-%{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
-#endif
+#define CRTIFILE_SPEC " %{mnewlib:ecrti.o%s;:crti.o%s} "
+#define        STARTFILE_LINUX_SPEC STARTFILE_PIE_LINUX_SPEC
 
-#define        ENDFILE_LINUX_SPEC "\
-%{shared|pie:crtendS.o%s;:crtend.o%s} \
-%{mnewlib:ecrtn.o%s;:crtn.o%s}"
+#define CRTNFILE_SPEC " %{mnewlib:ecrtn.o%s;:crtn.o%s}"
+#define        ENDFILE_LINUX_SPEC ENDFILE_PIE_LINUX_SPEC
 
 #define LINK_START_LINUX_SPEC ""
 
--- gcc-4.1/gcc/config/sparc/linux.h.startend~  2005-09-05 15:44:03 +0200
+++ gcc-4.1/gcc/config/sparc/linux.h    2006-01-09 02:16:05 +0100
@@ -49,15 +49,7 @@
    object constructed before entering `main'.  */
    
 #undef  STARTFILE_SPEC
-#if defined HAVE_LD_PIE
-#define STARTFILE_SPEC \
-  "%{!shared: %{pg|p:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}}\
-   crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
-#else
-#define STARTFILE_SPEC \
-  "%{!shared: %{pg|p:gcrt1.o%s;:crt1.o%s}}\
-   crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
-#endif
+#define STARTFILE_SPEC STARTFILE_PIE_LINUX_SPEC
 
 /* Provide a ENDFILE_SPEC appropriate for GNU/Linux.  Here we tack on
    the GNU/Linux magical crtend.o file (see crtstuff.c) which
@@ -65,10 +57,9 @@
    object constructed before entering `main', followed by a normal
    GNU/Linux "finalizer" file, `crtn.o'.  */
 
+#define HAVE_ENDFILE_MATH 1
 #undef  ENDFILE_SPEC
-#define ENDFILE_SPEC \
-  "%{ffast-math|funsafe-math-optimizations:crtfastmath.o%s} \
-   %{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s"
+#define ENDFILE_SPEC ENDFILE_PIE_LINUX_SPEC
 
 /* This is for -profile to use -lc_p instead of -lc.  */
 #undef CC1_SPEC
--- gcc-4.1/gcc/config/sparc/linux64.h.startend~        2005-09-05 15:44:03 
+0200
+++ gcc-4.1/gcc/config/sparc/linux64.h  2006-01-09 02:16:52 +0100
@@ -72,16 +72,7 @@
    object constructed before entering `main'.  */
    
 #undef  STARTFILE_SPEC
-
-#ifdef HAVE_LD_PIE
-#define STARTFILE_SPEC \
-  "%{!shared:%{pg|p:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}}\
-   crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbeginS.o%s}"
-#else
-#define STARTFILE_SPEC \
-  "%{!shared:%{pg|p:gcrt1.o%s;:crt1.o%s}}\
-   crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbeginS.o%s}"
-#endif
+#define STARTFILE_SPEC STARTFILE_PIE_LINUX_SPEC
 
 /* Provide a ENDFILE_SPEC appropriate for GNU/Linux.  Here we tack on
    the GNU/Linux magical crtend.o file (see crtstuff.c) which
@@ -89,11 +80,9 @@
    object constructed before entering `main', followed by a normal
    GNU/Linux "finalizer" file, `crtn.o'.  */
 
+#define HAVE_ENDFILE_MATH 1
 #undef  ENDFILE_SPEC
-
-#define ENDFILE_SPEC \
-  "%{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s\
-   %{ffast-math|funsafe-math-optimizations:crtfastmath.o%s}"
+#define ENDFILE_SPEC ENDFILE_PIE_LINUX_SPEC
 
 /* The GNU C++ standard library requires that these macros be defined.  */
 #undef CPLUSPLUS_CPP_SPEC
--- gcc-4.1/gcc/config/linux.h.startend~        2005-09-05 15:42:31 +0200
+++ gcc-4.1/gcc/config/linux.h  2006-01-09 02:28:07 +0100
@@ -37,17 +37,9 @@
    the GNU/Linux magical crtbegin.o file (see crtstuff.c) which
    provides part of the support for getting C++ file-scope static
    object constructed before entering `main'.  */
-   
+
 #undef STARTFILE_SPEC
-#if defined HAVE_LD_PIE
-#define STARTFILE_SPEC \
-  "%{!shared: %{pg|p|profile:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}} \
-   crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
-#else
-#define STARTFILE_SPEC \
-  "%{!shared: %{pg|p|profile:gcrt1.o%s;:crt1.o%s}} \
-   crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
-#endif
+#define STARTFILE_SPEC STARTFILE_PIE_LINUX_SPEC
 
 /* Provide a ENDFILE_SPEC appropriate for GNU/Linux.  Here we tack on
    the GNU/Linux magical crtend.o file (see crtstuff.c) which
@@ -56,8 +48,7 @@
    GNU/Linux "finalizer" file, `crtn.o'.  */
 
 #undef ENDFILE_SPEC
-#define ENDFILE_SPEC \
-  "%{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s"
+#define ENDFILE_SPEC ENDFILE_PIE_LINUX_SPEC
 
 /* This is for -profile to use -lc_p instead of -lc.  */
 #ifndef CC1_SPEC
--- gcc-4.1/gcc/gcc.c.startend~ 2006-01-07 19:51:33 +0100
+++ gcc-4.1/gcc/gcc.c   2006-01-09 02:09:58 +0100
@@ -686,6 +686,41 @@
 #endif
 #endif
 
+#ifdef HAVE_LD_PIE
+# define CRTFILE_PIE_SPEC "%{!shared: 
%{pg|p|profile:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s} }"
+# ifdef HAVE_NOSTARTFILE_STATIC
+#  define STARTFILE_PIE_SPEC "%{shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
+# else
+#  define STARTFILE_PIE_SPEC 
"%{shared|pie:crtbeginS.o%s;static:crtbeginT.o%s;:crtbegin.o%s}"
+# endif
+# define ENDFILE_PIE_SPEC "%{shared|pie:crtendS.o%s;:crtend.o%s}"
+#else
+# define CRTFILE_PIE_SPEC "%{!shared: %{pg|p|profile:gcrt1.o%s;:crt1.o%s} }"
+# ifdef HAVE_NOSTARTFILE_STATIC
+#  define STARTFILE_PIE_SPEC "%{shared:crtbeginS.o%s;:crtbegin.o%s}"
+# else
+#  define STARTFILE_PIE_SPEC 
"%{shared:crtbeginS.o%s;static:crtbeginT.o%s;:crtbegin.o%s}"
+# endif
+# define ENDFILE_PIE_SPEC "%{shared:crtendS.o%s;:crtend.o%s}"
+#endif
+
+#ifndef CRTIFILE_SPEC
+#define CRTIFILE_SPEC " crti.o%s "
+#endif
+
+#ifndef CRTNFILE_SPEC
+#define CRTNFILE_SPEC " crtn.o%s"
+#endif
+
+#ifdef HAVE_ENDFILE_MATH
+#define ENDFILE_MATH "%{ffast-math|funsafe-math-optimizations:crtfastmath.o%s} 
"
+#else
+#define ENDFILE_MATH ""
+#endif
+
+#define STARTFILE_PIE_LINUX_SPEC CRTFILE_PIE_SPEC CRTIFILE_SPEC 
STARTFILE_PIE_SPEC
+#define ENDFILE_PIE_LINUX_SPEC ENDFILE_LINUX_MATH ENDFILE_PIE_SPEC 
CRTNFILE_SPEC
+
 /* -u* was put back because both BSD and SysV seem to support it.  */
 /* %{static:} simply prevents an error message if the target machine
    doesn't handle -static.  */

Reply via email to