When linking with -static-pie, we need to use rcrt0.o (and grcrt0.o for -pg). Also, set static:crt0.o before pie:Scrt1.o, otherwise -static -pie fails to link with Scrt1.o due to missing _DYNAMIC symbol.
Also, -static-pie needs crtbeginS.o (otherwise it contains a relocation in read-only .text). And eventually, when HAVE_LD_PIE is not defined, there is no reason to include the pie case gcc/ChangeLog * gcc/config/i386/gnu.h (STARTFILE_SPEC): Add static-pie cases and fix -static -pie case. --- gcc/config/i386/gnu.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gcc/config/i386/gnu.h b/gcc/config/i386/gnu.h index fb8d69a97d8..7d7bfa7da7b 100644 --- a/gcc/config/i386/gnu.h +++ b/gcc/config/i386/gnu.h @@ -27,12 +27,12 @@ along with GCC. If not, see <http://www.gnu.org/licenses/>. #undef STARTFILE_SPEC #if defined HAVE_LD_PIE #define STARTFILE_SPEC \ - "%{!shared: %{pg|p|profile:%{static:gcrt0.o%s;:gcrt1.o%s};pie:Scrt1.o%s;static:crt0.o%s;:crt1.o%s}} \ - crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}" + "%{!shared: %{pg|p|profile:%{static-pie:grcrt0.o%s;static:gcrt0.o%s;:gcrt1.o%s};static-pie:rcrt0.o%s;static:crt0.o%s;pie:Scrt1.o%s;:crt1.o%s}} \ + crti.o%s %{static:crtbeginT.o%s;shared|pie|static-pie:crtbeginS.o%s;:crtbegin.o%s}" #else #define STARTFILE_SPEC \ "%{!shared: %{pg|p|profile:%{static:gcrt0.o%s;:gcrt1.o%s};static:crt0.o%s;:crt1.o%s}} \ - crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}" + crti.o%s %{static:crtbeginT.o%s;shared:crtbeginS.o%s;:crtbegin.o%s}" #endif #ifdef TARGET_LIBC_PROVIDES_SSP