mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-23 17:53:37 +08:00
elf: Change TLS static surplus default back to 1664
Make the computation in elf/dl-tls.c more transparent, and add an explicit test for the historic value. Reviewed-by: Carlos O'Donell <carlos@redhat.com>
This commit is contained in:
parent
5baad9a6f9
commit
07ed32f920
@ -216,7 +216,7 @@ tests-internal += loadtest unload unload2 circleload1 \
|
||||
neededtest neededtest2 neededtest3 neededtest4 \
|
||||
tst-tls3 tst-tls6 tst-tls7 tst-tls8 tst-dlmopen2 \
|
||||
tst-ptrguard1 tst-stackguard1 tst-libc_dlvsym \
|
||||
tst-create_format1
|
||||
tst-create_format1 tst-tls-surplus
|
||||
tests-container += tst-pldd tst-dlopen-tlsmodid-container \
|
||||
tst-dlopen-self-container
|
||||
test-srcs = tst-pathopt
|
||||
@ -1794,3 +1794,5 @@ $(objpfx)tst-tls-ie-dlmopen.out: \
|
||||
$(objpfx)tst-tls-ie-mod4.so \
|
||||
$(objpfx)tst-tls-ie-mod5.so \
|
||||
$(objpfx)tst-tls-ie-mod6.so
|
||||
|
||||
$(objpfx)tst-tls-surplus: $(libdl)
|
||||
|
37
elf/dl-tls.c
37
elf/dl-tls.c
@ -54,13 +54,37 @@
|
||||
Audit modules use their own namespaces, they are not included in rtld.nns,
|
||||
but come on top when computing the number of namespaces. */
|
||||
|
||||
/* Size of initial-exec TLS in libc.so. */
|
||||
#define LIBC_IE_TLS 160
|
||||
/* Size of initial-exec TLS in libc.so. This should be the maximum of
|
||||
observed PT_GNU_TLS sizes across all architectures. Some
|
||||
architectures have lower values due to differences in type sizes
|
||||
and link editor capabilities. */
|
||||
#define LIBC_IE_TLS 144
|
||||
|
||||
/* Size of initial-exec TLS in libraries other than libc.so.
|
||||
This should be large enough to cover runtime libraries of the
|
||||
compiler such as libgomp and libraries in libc other than libc.so. */
|
||||
#define OTHER_IE_TLS 144
|
||||
|
||||
/* Default number of namespaces. */
|
||||
#define DEFAULT_NNS 4
|
||||
|
||||
/* Default for dl_tls_static_optional. */
|
||||
#define OPTIONAL_TLS 512
|
||||
|
||||
/* Compute the static TLS surplus based on the namespace count and the
|
||||
TLS space that can be used for optimizations. */
|
||||
static inline int
|
||||
tls_static_surplus (int nns, int opt_tls)
|
||||
{
|
||||
return (nns - 1) * LIBC_IE_TLS + nns * OTHER_IE_TLS + opt_tls;
|
||||
}
|
||||
|
||||
/* This value is chosen so that with default values for the tunables,
|
||||
the computation of dl_tls_static_surplus in
|
||||
_dl_tls_static_surplus_init yields the historic value 1664, for
|
||||
backwards compatibility. */
|
||||
#define LEGACY_TLS (1664 - tls_static_surplus (DEFAULT_NNS, OPTIONAL_TLS))
|
||||
|
||||
/* Calculate the size of the static TLS surplus, when the given
|
||||
number of audit modules are loaded. Must be called after the
|
||||
number of audit modules is known and before static TLS allocation. */
|
||||
@ -74,8 +98,8 @@ _dl_tls_static_surplus_init (size_t naudit)
|
||||
opt_tls = TUNABLE_GET (optional_static_tls, size_t, NULL);
|
||||
#else
|
||||
/* Default values of the tunables. */
|
||||
nns = 4;
|
||||
opt_tls = 512;
|
||||
nns = DEFAULT_NNS;
|
||||
opt_tls = OPTIONAL_TLS;
|
||||
#endif
|
||||
if (nns > DL_NNS)
|
||||
nns = DL_NNS;
|
||||
@ -85,9 +109,8 @@ _dl_tls_static_surplus_init (size_t naudit)
|
||||
nns += naudit;
|
||||
|
||||
GL(dl_tls_static_optional) = opt_tls;
|
||||
GLRO(dl_tls_static_surplus) = ((nns - 1) * LIBC_IE_TLS
|
||||
+ nns * OTHER_IE_TLS
|
||||
+ opt_tls);
|
||||
assert (LEGACY_TLS >= 0);
|
||||
GLRO(dl_tls_static_surplus) = tls_static_surplus (nns, opt_tls) + LEGACY_TLS;
|
||||
}
|
||||
|
||||
/* Out-of-memory handler. */
|
||||
|
42
elf/tst-tls-surplus.c
Normal file
42
elf/tst-tls-surplus.c
Normal file
@ -0,0 +1,42 @@
|
||||
/* Test size of the static TLS surplus reservation for backwards compatibility.
|
||||
Copyright (C) 2020 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/>. */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <support/check.h>
|
||||
#include <support/xdlfcn.h>
|
||||
|
||||
static int do_test (void);
|
||||
#include <support/test-driver.c>
|
||||
|
||||
/* This hack results in a definition of struct rtld_global_ro. Do
|
||||
this after all the other header inclusions, to minimize the
|
||||
impact. */
|
||||
#define SHARED
|
||||
#include <ldsodefs.h>
|
||||
|
||||
static
|
||||
int do_test (void)
|
||||
{
|
||||
/* Avoid introducing a copy relocation due to the hidden alias in
|
||||
ld.so. */
|
||||
struct rtld_global_ro *glro = xdlsym (NULL, "_rtld_global_ro");
|
||||
printf ("info: _dl_tls_static_surplus: %zu\n", glro->_dl_tls_static_surplus);
|
||||
/* Hisoric value: 16 * 100 + 64. */
|
||||
TEST_VERIFY (glro->_dl_tls_static_surplus >= 1664);
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user