aboutsummaryrefslogtreecommitdiff
path: root/elf/dl-tls.c
diff options
context:
space:
mode:
authorSzabolcs Nagy <szabolcs.nagy@arm.com>2020-07-07 10:49:11 +0100
committerSzabolcs Nagy <szabolcs.nagy@arm.com>2020-07-08 17:32:56 +0100
commit17796419b5fd694348cceb65c3f77601faae082c (patch)
tree077996aa8d9b0151191a812928de0b8d10225c2d /elf/dl-tls.c
parent0c7b002fac12dcb2f53ba83ee56bb3b5d2439447 (diff)
downloadglibc-17796419b5fd694348cceb65c3f77601faae082c.zip
glibc-17796419b5fd694348cceb65c3f77601faae082c.tar.gz
glibc-17796419b5fd694348cceb65c3f77601faae082c.tar.bz2
rtld: Account static TLS surplus for audit modules
The new static TLS surplus size computation is surplus_tls = 192 * (nns-1) + 144 * nns + 512 where nns is controlled via the rtld.nns tunable. This commit accounts audit modules too so nns = rtld.nns + audit modules. rtld.nns should only include the namespaces required by the application, namespaces for audit modules are accounted on top of that so audit modules don't use up the static TLS that is reserved for the application. This allows loading many audit modules without tuning rtld.nns or using up static TLS, and it fixes FAIL: elf/tst-auditmany Note that DL_NNS is currently a hard upper limit for nns, and if rtld.nns + audit modules go over the limit that's a fatal error. By default rtld.nns is 4 which allows 12 audit modules. Counting the audit modules is based on existing audit string parsing code, we cannot use GLRO(dl_naudit) before the modules are actually loaded.
Diffstat (limited to 'elf/dl-tls.c')
-rw-r--r--elf/dl-tls.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/elf/dl-tls.c b/elf/dl-tls.c
index 924ee5d..4e7b10e 100644
--- a/elf/dl-tls.c
+++ b/elf/dl-tls.c
@@ -49,7 +49,10 @@
that affects the size of the static TLS and by default it's small enough
not to cause problems with existing applications. The limit is not
enforced or checked: it is the user's responsibility to increase rtld.nns
- if more dlmopen namespaces are used. */
+ if more dlmopen namespaces are used.
+
+ 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 192
@@ -60,8 +63,11 @@
/* Size of additional surplus TLS, placeholder for TLS optimizations. */
#define OPT_SURPLUS_TLS 512
+/* 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. */
void
-_dl_tls_static_surplus_init (void)
+_dl_tls_static_surplus_init (size_t naudit)
{
size_t nns;
@@ -73,6 +79,11 @@ _dl_tls_static_surplus_init (void)
#endif
if (nns > DL_NNS)
nns = DL_NNS;
+ if (DL_NNS - nns < naudit)
+ _dl_fatal_printf ("Failed loading %lu audit modules, %lu are supported.\n",
+ (unsigned long) naudit, (unsigned long) (DL_NNS - nns));
+ nns += naudit;
+
GLRO(dl_tls_static_surplus) = ((nns - 1) * LIBC_IE_TLS
+ nns * OTHER_IE_TLS
+ OPT_SURPLUS_TLS);