* gospec.c: pass -u pthread_create to linker when static linking.
authorShenghou Ma <minux.ma@gmail.com>
Wed, 16 Jan 2013 16:32:35 +0000 (16:32 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Wed, 16 Jan 2013 16:32:35 +0000 (16:32 +0000)
From-SVN: r195244

gcc/go/ChangeLog
gcc/go/gospec.c

index 6d6b14b110988fa17869c836ce02696d482077b5..61739cea4f2202d9fa5c1cc63892d7606616ce88 100644 (file)
@@ -1,3 +1,7 @@
+2013-01-16  Shenghou Ma  <minux.ma@gmail.com>
+
+       * gospec.c: pass -u pthread_create to linker when static linking.
+
 2012-12-21  Ian Lance Taylor  <iant@google.com>
 
        PR bootstrap/54659
index 4f0764e4a315cbc3a1dddb7bc04df8320ce8ff7d..0be7716be5c3afd72534e924fff8ade289888e89 100644 (file)
@@ -227,7 +227,7 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
 #endif
 
   /* Make sure to have room for the trailing NULL argument.  */
-  num_args = argc + need_math + shared_libgcc + (library > 0) * 5 + 5;
+  num_args = argc + need_math + shared_libgcc + (library > 0) * 5 + 10;
   new_decoded_options = XNEWVEC (struct cl_decoded_option, num_args);
 
   i = 0;
@@ -381,6 +381,20 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
     generate_option (OPT_shared_libgcc, NULL, 1, CL_DRIVER,
                     &new_decoded_options[j++]);
 
+#ifdef TARGET_CAN_SPLIT_STACK
+  /* libgcc wraps pthread_create to support split stack, however, due to
+     relative ordering of -lpthread and -lgcc, we can't just mark
+     __real_pthread_create in libgcc as non-weak.  But we need to link in
+     pthread_create from pthread if we are statically linking, so we work-
+     around by passing -u pthread_create to to the linker. */
+  if (static_link)
+    {
+      generate_option (OPT_Wl_, "-u,pthread_create", 1, CL_DRIVER,
+                      &new_decoded_options[j]);
+      j++;
+    }
+#endif
+
   *in_decoded_options_count = j;
   *in_decoded_options = new_decoded_options;
   *in_added_libraries = added_libraries;