diff --git a/src/configure.in b/src/configure.in
index e7516ecc03cf4b09daceb20c4ce7cbb4fefd08d9..0cab0396b354144673029fbd092a77a2aa8f6e88 100644
--- a/src/configure.in
+++ b/src/configure.in
@@ -7490,6 +7490,7 @@ AC_MSG_RESULT($SO)
 # -- "ld" on SunOS 4.x.x, "ld -G" on SunOS 5.x, "ld -shared" on IRIX 5
 AC_MSG_CHECKING(LDSHARED)
 if test -z "$LDSHARED" ; then
+  ldshared_is_cc=yes
   case "$pike_cv_sys_os" in
     AIX*)
       if test "$GCC" = yes ; then
@@ -7521,6 +7522,7 @@ if test -z "$LDSHARED" ; then
 	pike_cv_sys_dynamic_loading=no
 	LDSHARED="ld"
       fi
+      ldshared_is_cc=no
     ;;
     Darwin*)
       if test "$pike_cv_osx_twolevel_namespace" = yes ; then
@@ -7545,12 +7547,28 @@ if test -z "$LDSHARED" ; then
       if test "`uname -r`" -ge 6 ; then
         LDSHARED="$LDSHARED -woff 84,85,134"
       else :; fi
+      ldshared_is_cc=no
     ;;
-    SunOS*) LDSHARED="ld";;
-    Solaris) LDSHARED="/usr/ccs/bin/ld -G";;
-    hp*|HP*) LDSHARED="ld -b";;
-    OSF*) LDSHARED="ld -expect_unresolved '*' -shared -msym -O3";;
-    DYNIX/ptx*) LDSHARED="ld -G";;
+    SunOS*)
+      LDSHARED="ld"
+      ldshared_is_cc=no
+      ;;
+    Solaris)
+      LDSHARED="/usr/ccs/bin/ld -G"
+      ldshared_is_cc=no
+      ;;
+    hp*|HP*)
+      LDSHARED="ld -b"
+      ldshared_is_cc=no
+      ;;
+    OSF*)
+      LDSHARED="ld -expect_unresolved '*' -shared -msym -O3"
+      ldshared_is_cc=no
+      ;;
+    DYNIX/ptx*)
+      LDSHARED="ld -G"
+      ldshared_is_cc=no
+      ;;
     next*) LDSHARED="$REALCC $CFLAGS -nostdlib -r";;
     Linux*) LDSHARED="$REALCC -shared";;
     GNU/kFreeBSD*) LDSHARED="$REALCC -shared";;
@@ -7561,11 +7579,16 @@ if test -z "$LDSHARED" ; then
     BSD/OS*)
       case "`uname -r`" in
        [4-9].*) LDSHARED="$REALCC -shared";;
-        *) LDSHARED="shlicc -r";;
+        *) LDSHARED="shlicc -r"
+	   ldshared_is_cc=no
+	   ;;
       esac
     ;;
     SCO_SV*) LDSHARED="$REALCC -G -KPIC -Wl,-Bexport";;
-    UNIX_SV*) LDSHARED="ld -G";;
+    UNIX_SV*)
+      LDSHARED="ld -G"
+      ldshared_is_cc=no
+      ;;
     UnixWare*|OpenUNIX*)
       if test "$GCC" = yes ; then
         LDSHARED="$REALCC -G -fPIC"
@@ -7584,8 +7607,18 @@ if test -z "$LDSHARED" ; then
 	LDSHARED_MODULE_ARGS="$LDSHARED_MODULE_ARGS -pdb:\$\$modname.pdb"
       fi
     ;;
-    *) LDSHARED="ld";;
+    *)
+      LDSHARED="ld"
+      ldshared_is_cc=no
+      ;;
   esac
+  if test "$GCC:$ldshared_is_cc" = "yes:yes" ; then
+    # On some architectures gcc attempts to link the shared object with
+    # the standard startup files (crt0.o et al), which may fail due to
+    # relocation errors. The flag -nostartfiles exists in gcc since at
+    # least version 3.3.2 from 2003, so this should be safe.
+    LDSHARED="$LDSHARED -nostartfiles"
+  fi
 fi
 AC_MSG_RESULT($LDSHARED)