Patchwork libgcc patch committed: Change __real_pthread_create ref to be non-weak

login
register
mail settings
Submitter Ian Taylor
Date Jan. 14, 2013, 7:33 p.m.
Message ID <mcrr4lnimq3.fsf@google.com>
Download mbox | patch
Permalink /patch/211871/
State New
Headers show

Comments

Ian Taylor - Jan. 14, 2013, 7:33 p.m.
The declaration of __real_pthread_create in generic-morestack-thread.c
had attribute weak.  Note that this code is linked with --wrap
pthread_create, so the reference to __real_pthread_create is really to
pthread_create.  Using weak was incorrect, because the reference really
is a strong one.  There is no support for __real_pthread_create aka
pthread_create to not be defined.  It caused some Go programs to fail
when linking statically, because a weak reference does not cause a
symbol definition to be included from an archive.  If there was no other
reason to include pthread_create, then pthread_create would never be
defined, so the call to __real_pthread_create would crash at runtime.

This fixes a regression, as static linking of Go programs used to work.

Bootstrapped and ran Go testsuite and split-stack tests on
x86_64-unknown-linux-gnu.  Committed to mainline.

Ian


2013-01-14  Ian Lance Taylor  <iant@google.com>

	* generic-morestack-thread.c: Change declaration of
	__real_pthread_create to not be weak.
Ian Taylor - Jan. 14, 2013, 7:38 p.m.
On Mon, Jan 14, 2013 at 11:33 AM, Ian Lance Taylor <iant@google.com> wrote:
> The declaration of __real_pthread_create in generic-morestack-thread.c
> had attribute weak.  Note that this code is linked with --wrap
> pthread_create, so the reference to __real_pthread_create is really to
> pthread_create.  Using weak was incorrect, because the reference really
> is a strong one.  There is no support for __real_pthread_create aka
> pthread_create to not be defined.  It caused some Go programs to fail
> when linking statically, because a weak reference does not cause a
> symbol definition to be included from an archive.  If there was no other
> reason to include pthread_create, then pthread_create would never be
> defined, so the call to __real_pthread_create would crash at runtime.
>
> This fixes a regression, as static linking of Go programs used to work.
>
> Bootstrapped and ran Go testsuite and split-stack tests on
> x86_64-unknown-linux-gnu.  Committed to mainline.

Sigh, this turned out to be wrong because it causes libgcc_s.so to
require libpthread.so.

Reverted.

Ian
H.J. Lu - Jan. 14, 2013, 7:42 p.m.
On Mon, Jan 14, 2013 at 11:33 AM, Ian Lance Taylor <iant@google.com> wrote:
> The declaration of __real_pthread_create in generic-morestack-thread.c
> had attribute weak.  Note that this code is linked with --wrap
> pthread_create, so the reference to __real_pthread_create is really to
> pthread_create.  Using weak was incorrect, because the reference really
> is a strong one.  There is no support for __real_pthread_create aka
> pthread_create to not be defined.  It caused some Go programs to fail
> when linking statically, because a weak reference does not cause a
> symbol definition to be included from an archive.  If there was no other
> reason to include pthread_create, then pthread_create would never be
> defined, so the call to __real_pthread_create would crash at runtime.
>
> This fixes a regression, as static linking of Go programs used to work.
>
> Bootstrapped and ran Go testsuite and split-stack tests on
> x86_64-unknown-linux-gnu.  Committed to mainline.
>
> Ian
>
>
> 2013-01-14  Ian Lance Taylor  <iant@google.com>
>
>         * generic-morestack-thread.c: Change declaration of
>         __real_pthread_create to not be weak.
>

I think you run into:

http://sourceware.org/bugzilla/show_bug.cgi?id=14556

Patch

Index: generic-morestack-thread.c
===================================================================
--- generic-morestack-thread.c	(revision 195171)
+++ generic-morestack-thread.c	(working copy)
@@ -136,8 +136,7 @@  int __wrap_pthread_create (pthread_t *,
   __attribute__ ((visibility ("hidden")));
 
 extern int __real_pthread_create (pthread_t *, const pthread_attr_t *,
-				  void *(*start_routine) (void *), void *)
-  __attribute__ ((weak));
+				  void *(*start_routine) (void *), void *);
 
 int
 __wrap_pthread_create (pthread_t *tid, const pthread_attr_t *attr,