From: Florian Weimer <fweimer@redhat.com>
To: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Cc: libc-alpha@sourceware.org
Subject: Re: [PATCH 1/8] nptl: Perform signal initialization upon pthread_create
Date: Fri, 21 May 2021 22:15:14 +0200 [thread overview]
Message-ID: <87fsyf6dyl.fsf@oldenburg.str.redhat.com> (raw)
In-Reply-To: <c510267d-3ec8-a429-148c-20a5b0e626f6@linaro.org> (Adhemerval Zanella's message of "Fri, 21 May 2021 17:03:20 -0300")
* Adhemerval Zanella:
>> @@ -106,4 +172,8 @@ versioned_symbol (libc, __pthread_cancel, pthread_cancel, GLIBC_2_34);
>> compat_symbol (libpthread, __pthread_cancel, pthread_cancel, GLIBC_2_0);
>> #endif
>>
>> -PTHREAD_STATIC_FN_REQUIRE (__pthread_create)
>> +/* Ensure that the unwinder is always linked in (the __pthread_unwind
>> + reference from __do_cancel is weak). Use ___pthread_unwind_next
>> + (three underscores) to produce a strong reference to the same
>> + file. */
>> +PTHREAD_STATIC_FN_REQUIRE (___pthread_unwind_next)
>
> Why __pthread_unwind is marked as weak now? Would be simpler to unmark
> is as weak and avoid the PTHREAD_STATIC_FN_REQUIRE?
It's related to the compiled-in cancellation points. The references to
__pthread_enable_asynccancel are strong, and that disassembles to:
0000000000000000 <__pthread_enable_asynccancel>:
0: mov %fs:0x10,%rcx
9: mov %fs:0x308,%r8d
12: mov %r8d,%edx
15: or $0x2,%edx
18: cmp %edx,%r8d
1b: je 35 <__pthread_enable_asynccancel+0x35>
1d: mov %r8d,%eax
20: lock cmpxchg %edx,0x308(%rcx)
28: cmp %eax,%r8d
2b: jne 40 <__pthread_enable_asynccancel+0x40>
2d: and $0xffffffbb,%edx
30: cmp $0xa,%edx
33: je 45 <__pthread_enable_asynccancel+0x45>
35: mov %r8d,%eax
38: retq
39: nopl 0x0(%rax)
40: mov %eax,%r8d
43: jmp 12 <__pthread_enable_asynccancel+0x12>
45: push %rax
46: movq $0xffffffffffffffff,%fs:0x630
53: mov %fs:0x10,%rax
5c: lock orl $0x10,0x308(%rax)
64: mov %fs:0x300,%rdi
6d: callq 72 <__pthread_enable_asynccancel+0x72>
6e: R_X86_64_PLT32 __pthread_unwind-0x4
72: data16 nopw %cs:0x0(%rax,%rax,1)
7d: nopl (%rax)
And the unwind reference is weak:
17: 0000000000000000 0 NOTYPE WEAK HIDDEN UNDEF __pthread_unwind
There's no address check because the cancellation state in the TCB can
only change if pthread_cancel is linked in, and that really should pull
in the unwinder, too. That's why I added the PTHREAD_STATIC_FN_REQUIRE.
Without it, I think some of the existing tests will fail (the
pthread_create PTHREAD_STATIC_FN_REQUIREs are apparently not quite
correct).
I think it's always been this way, so that the unwinder is optional in
static links (in theory, in practice it is still pulled in by the bits
that are compiled with -fexceptions due to the _Unwind_Resume construct,
hence the need for elf/static-stubs.c).
Thanks,
Florian
next prev parent reply other threads:[~2021-05-21 20:15 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-21 12:45 [PATCH v2 0/8] nptl: Complete libpthread move Florian Weimer
2021-05-21 12:45 ` [PATCH 1/8] nptl: Perform signal initialization upon pthread_create Florian Weimer
2021-05-21 20:03 ` Adhemerval Zanella
2021-05-21 20:15 ` Florian Weimer [this message]
2021-05-21 20:23 ` Adhemerval Zanella
2021-05-21 12:45 ` [PATCH 2/8] nptl: Eliminate the __static_tls_size, __static_tls_align_m1 variables Florian Weimer
2021-05-21 12:45 ` [PATCH 3/8] nptl: Move semi-public __pthread_get_minstack symbol into libc Florian Weimer
2021-05-21 12:45 ` [PATCH v2 4/8] elf: Use custom NODELETE DSO for tst-dlopenfail, tst-dlopenfail-2 Florian Weimer
2021-05-21 20:11 ` Adhemerval Zanella
2021-05-21 12:45 ` [PATCH 5/8] nptl: Move pthread_create, thrd_create into libc Florian Weimer
2021-05-21 12:46 ` [PATCH 6/8] nptl: Remove remaining code from libpthread Florian Weimer
2021-05-21 12:46 ` [PATCH 7/8] nptl: Do not install libpthread.so and do not link tests with it Florian Weimer
2021-05-24 17:14 ` Adhemerval Zanella
2021-05-21 12:46 ` [PATCH 8/8] Linux: Remove remaining references to $(shared-thread-library) Florian Weimer
2021-05-24 18:27 ` Adhemerval Zanella
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87fsyf6dyl.fsf@oldenburg.str.redhat.com \
--to=fweimer@redhat.com \
--cc=adhemerval.zanella@linaro.org \
--cc=libc-alpha@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).