hurd: let csu initialize tls

Since 9cec82de71 ("htl: Initialize later"), we let csu initialize
pthreads. We can thus let it initialize tls later too, to better align
with the generic order.  Initialization however accesses ports which
links/unlinks into the sigstate for unwinding.  We can however easily
skip that during initialization.
This commit is contained in:
Samuel Thibault 2021-12-28 10:15:52 +01:00
parent 7b358de1af
commit 2ce0481d26
3 changed files with 24 additions and 49 deletions

View File

@ -98,13 +98,16 @@ _hurd_userlink_link (struct hurd_userlink **chainp,
link->resource.prevp = chainp;
*chainp = link;
/* Also chain it on the current thread's list of active resources. */
thread_chainp = &_hurd_self_sigstate ()->active_resources;
link->thread.next = *thread_chainp;
if (link->thread.next)
link->thread.next->thread.prevp = &link->thread.next;
link->thread.prevp = thread_chainp;
*thread_chainp = link;
if (!__LIBC_NO_TLS ())
{
/* Also chain it on the current thread's list of active resources. */
thread_chainp = &_hurd_self_sigstate ()->active_resources;
link->thread.next = *thread_chainp;
if (link->thread.next)
link->thread.next->thread.prevp = &link->thread.next;
link->thread.prevp = thread_chainp;
*thread_chainp = link;
}
}
# endif
#endif
@ -131,11 +134,14 @@ _hurd_userlink_unlink (struct hurd_userlink *link)
if (link->resource.next)
link->resource.next->resource.prevp = link->resource.prevp;
/* Remove our link from the chain of currently active resources
for this thread. */
*link->thread.prevp = link->thread.next;
if (link->thread.next)
link->thread.next->thread.prevp = link->thread.prevp;
if (!__LIBC_NO_TLS ())
{
/* Remove our link from the chain of currently active resources
for this thread. */
*link->thread.prevp = link->thread.next;
if (link->thread.next)
link->thread.next->thread.prevp = link->thread.prevp;
}
return dealloc;
}
@ -160,9 +166,12 @@ _hurd_userlink_move (struct hurd_userlink *new_link,
new_link->resource.next->resource.prevp = &new_link->resource.next;
*new_link->resource.prevp = new_link;
if (new_link->thread.next != NULL)
new_link->thread.next->thread.prevp = &new_link->thread.next;
*new_link->thread.prevp = new_link;
if (!__LIBC_NO_TLS ())
{
if (new_link->thread.next != NULL)
new_link->thread.next->thread.prevp = &new_link->thread.next;
*new_link->thread.prevp = new_link;
}
}
# endif
#endif

View File

@ -184,9 +184,6 @@ init (int *data)
_dl_phnum = d->phdrsz / sizeof (ElfW(Phdr));
assert (d->phdrsz % sizeof (ElfW(Phdr)) == 0);
}
/* We need to setup TLS before initializing libpthread. */
__libc_setup_tls ();
#endif
/* Call `init1' (above) with the user code as the return address, and the

View File

@ -1,31 +0,0 @@
/* Hurd definitions for libc main startup.
Copyright (C) 2017-2021 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#ifndef _LIBC_START_H
#define _LIBC_START_H
#ifndef SHARED
/* By default we perform STT_GNU_IFUNC resolution *before* TLS
initialization, and this means you cannot, without machine
knowledge, access TLS from an IFUNC resolver. */
#define ARCH_SETUP_IREL() apply_irel ()
#define ARCH_SETUP_TLS()
#define ARCH_APPLY_IREL()
#endif /* ! SHARED */
#endif /* _LIBC_START_H */