git: 166b390bc586 - stable/13 - libc: include rtld.h into static implementations of rtld interface
Konstantin Belousov
kib at FreeBSD.org
Fri Apr 23 11:14:52 UTC 2021
The branch stable/13 has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=166b390bc5869f5ac0f534291f49ff98e9291b42
commit 166b390bc5869f5ac0f534291f49ff98e9291b42
Author: Konstantin Belousov <kib at FreeBSD.org>
AuthorDate: 2021-04-05 03:41:46 +0000
Commit: Konstantin Belousov <kib at FreeBSD.org>
CommitDate: 2021-04-23 11:14:07 +0000
libc: include rtld.h into static implementations of rtld interface
(cherry picked from commit 7f7489eba391a858b3930a34e7749d642b374c5c)
---
lib/libc/Makefile | 8 +++++
lib/libc/gen/Makefile.inc | 3 ++
lib/libc/gen/dlfcn.c | 1 +
lib/libc/gen/tls.c | 76 ++++++++++++++++++++++++-----------------------
lib/libdl/Makefile | 7 +++++
5 files changed, 58 insertions(+), 37 deletions(-)
diff --git a/lib/libc/Makefile b/lib/libc/Makefile
index d93091530721..958270e6ddf5 100644
--- a/lib/libc/Makefile
+++ b/lib/libc/Makefile
@@ -68,6 +68,14 @@ LIBADD+= ssp_nonshared
# Extras that live in either libc.a or libc_nonshared.a
LIBC_NONSHARED_SRCS=
+RTLD_ELF_DIR=${SRCTOP}/libexec/rtld-elf
+.if exists(${RTLD_ELF_DIR}/${MACHINE_ARCH:S/powerpc64le/powerpc64/})
+RTLD_ARCH= ${MACHINE_ARCH:S/powerpc64le/powerpc64/}
+.else
+RTLD_ARCH= ${MACHINE_CPUARCH}
+.endif
+RTLD_HDRS= -I${RTLD_ELF_DIR}/${RTLD_ARCH} -I${RTLD_ELF_DIR}
+
# Define (empty) variables so that make doesn't give substitution
# errors if the included makefiles don't change these:
MDSRCS=
diff --git a/lib/libc/gen/Makefile.inc b/lib/libc/gen/Makefile.inc
index 0ab717600e56..aa9a4c0cbf67 100644
--- a/lib/libc/gen/Makefile.inc
+++ b/lib/libc/gen/Makefile.inc
@@ -172,6 +172,9 @@ SRCS+= __getosreldate.c \
CFLAGS.arc4random.c= -I${SRCTOP}/sys -I${SRCTOP}/sys/crypto/chacha20
+CFLAGS.dlfcn.c= ${RTLD_HDRS}
+CFLAGS.tls.c= ${RTLD_HDRS}
+
.PATH: ${SRCTOP}/contrib/libc-pwcache
SRCS+= pwcache.c pwcache.h
diff --git a/lib/libc/gen/dlfcn.c b/lib/libc/gen/dlfcn.c
index 6047f7ddd4d7..16afdb6bf5d1 100644
--- a/lib/libc/gen/dlfcn.c
+++ b/lib/libc/gen/dlfcn.c
@@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$");
#include "namespace.h"
#include <pthread.h>
#include "un-namespace.h"
+#include "rtld.h"
#include "libc_private.h"
#include "reentrant.h"
diff --git a/lib/libc/gen/tls.c b/lib/libc/gen/tls.c
index 719391130827..2a64b5266f4a 100644
--- a/lib/libc/gen/tls.c
+++ b/lib/libc/gen/tls.c
@@ -41,6 +41,7 @@
#include <elf.h>
#include <unistd.h>
+#include "rtld.h"
#include "libc_private.h"
#define tls_assert(cond) ((cond) ? (void) 0 : \
@@ -96,10 +97,10 @@ void __libc_free_tls(void *tls, size_t tcbsize, size_t tcbalign);
#ifndef PIC
-static size_t tls_static_space;
-static size_t tls_init_size;
-static size_t tls_init_align;
-static void *tls_init;
+static size_t libc_tls_static_space;
+static size_t libc_tls_init_size;
+static size_t libc_tls_init_align;
+static void *libc_tls_init;
#endif
#ifdef __i386__
@@ -124,7 +125,7 @@ __libc_tls_get_addr(void *ti __unused)
#ifndef PIC
static void *
-malloc_aligned(size_t size, size_t align)
+libc_malloc_aligned(size_t size, size_t align)
{
void *mem, *res;
@@ -138,7 +139,7 @@ malloc_aligned(size_t size, size_t align)
}
static void
-free_aligned(void *ptr)
+libc_free_aligned(void *ptr)
{
void *mem;
uintptr_t x;
@@ -188,8 +189,6 @@ free_aligned(void *ptr)
* [5] I'm not able to validate "values are biased" assertions.
*/
-#define TLS_TCB_SIZE (2 * sizeof(void *))
-
/*
* Return pointer to allocated TLS block
*/
@@ -201,12 +200,13 @@ get_tls_block_ptr(void *tcb, size_t tcbsize)
/* Compute fragments sizes. */
extra_size = tcbsize - TLS_TCB_SIZE;
#if defined(__aarch64__) || defined(__arm__)
- post_size = roundup2(TLS_TCB_SIZE, tls_init_align) - TLS_TCB_SIZE;
+ post_size = roundup2(TLS_TCB_SIZE, libc_tls_init_align) - TLS_TCB_SIZE;
#else
post_size = 0;
#endif
tls_block_size = tcbsize + post_size;
- pre_size = roundup2(tls_block_size, tls_init_align) - tls_block_size;
+ pre_size = roundup2(tls_block_size, libc_tls_init_align) -
+ tls_block_size;
return ((char *)tcb - pre_size - extra_size);
}
@@ -225,7 +225,7 @@ __libc_free_tls(void *tcb, size_t tcbsize, size_t tcbalign __unused)
tls = (Elf_Addr **)tcb;
dtv = tls[0];
__je_bootstrap_free(dtv);
- free_aligned(get_tls_block_ptr(tcb, tcbsize));
+ libc_free_aligned(get_tls_block_ptr(tcb, tcbsize));
}
/*
@@ -259,21 +259,22 @@ __libc_allocate_tls(void *oldtcb, size_t tcbsize, size_t tcbalign)
return (oldtcb);
tls_assert(tcbalign >= TLS_TCB_ALIGN);
- maxalign = MAX(tcbalign, tls_init_align);
+ maxalign = MAX(tcbalign, libc_tls_init_align);
/* Compute fragmets sizes. */
extra_size = tcbsize - TLS_TCB_SIZE;
#if defined(__aarch64__) || defined(__arm__)
- post_size = roundup2(TLS_TCB_SIZE, tls_init_align) - TLS_TCB_SIZE;
+ post_size = roundup2(TLS_TCB_SIZE, libc_tls_init_align) - TLS_TCB_SIZE;
#else
post_size = 0;
#endif
tls_block_size = tcbsize + post_size;
- pre_size = roundup2(tls_block_size, tls_init_align) - tls_block_size;
- tls_block_size += pre_size + tls_static_space;
+ pre_size = roundup2(tls_block_size, libc_tls_init_align) -
+ tls_block_size;
+ tls_block_size += pre_size + libc_tls_static_space;
/* Allocate whole TLS block */
- tls_block = malloc_aligned(tls_block_size, maxalign);
+ tls_block = libc_malloc_aligned(tls_block_size, maxalign);
if (tls_block == NULL) {
tls_msg("__libc_allocate_tls: Out of memory.\n");
abort();
@@ -285,7 +286,7 @@ __libc_allocate_tls(void *oldtcb, size_t tcbsize, size_t tcbalign)
if (oldtcb != NULL) {
memcpy(tls_block, get_tls_block_ptr(oldtcb, tcbsize),
tls_block_size);
- free_aligned(oldtcb);
+ libc_free_aligned(oldtcb);
/* Adjust the DTV. */
dtv = tcb[0];
@@ -302,8 +303,8 @@ __libc_allocate_tls(void *oldtcb, size_t tcbsize, size_t tcbalign)
dtv[1] = 1; /* Segments count. */
dtv[2] = (Elf_Addr)(tls + DTV_OFFSET);
- if (tls_init_size > 0)
- memcpy(tls, tls_init, tls_init_size);
+ if (libc_tls_init_size > 0)
+ memcpy(tls, libc_tls_init, libc_tls_init_size);
}
return (tcb);
@@ -329,13 +330,13 @@ __libc_free_tls(void *tcb, size_t tcbsize __unused, size_t tcbalign)
* Figure out the size of the initial TLS block so that we can
* find stuff which ___tls_get_addr() allocated dynamically.
*/
- tcbalign = MAX(tcbalign, tls_init_align);
- size = roundup2(tls_static_space, tcbalign);
+ tcbalign = MAX(tcbalign, libc_tls_init_align);
+ size = roundup2(libc_tls_static_space, tcbalign);
dtv = ((Elf_Addr**)tcb)[1];
tlsend = (Elf_Addr) tcb;
tlsstart = tlsend - size;
- free_aligned((void*)tlsstart);
+ libc_free_aligned((void*)tlsstart);
__je_bootstrap_free(dtv);
}
@@ -350,12 +351,12 @@ __libc_allocate_tls(void *oldtls, size_t tcbsize, size_t tcbalign)
Elf_Addr *dtv;
Elf_Addr segbase, oldsegbase;
- tcbalign = MAX(tcbalign, tls_init_align);
- size = roundup2(tls_static_space, tcbalign);
+ tcbalign = MAX(tcbalign, libc_tls_init_align);
+ size = roundup2(libc_tls_static_space, tcbalign);
if (tcbsize < 2 * sizeof(Elf_Addr))
tcbsize = 2 * sizeof(Elf_Addr);
- tls = malloc_aligned(size + tcbsize, tcbalign);
+ tls = libc_malloc_aligned(size + tcbsize, tcbalign);
if (tls == NULL) {
tls_msg("__libc_allocate_tls: Out of memory.\n");
abort();
@@ -373,16 +374,16 @@ __libc_allocate_tls(void *oldtls, size_t tcbsize, size_t tcbalign)
dtv[0] = 1;
dtv[1] = 1;
- dtv[2] = segbase - tls_static_space;
+ dtv[2] = segbase - libc_tls_static_space;
if (oldtls) {
/*
* Copy the static TLS block over whole.
*/
oldsegbase = (Elf_Addr) oldtls;
- memcpy((void *)(segbase - tls_static_space),
- (const void *)(oldsegbase - tls_static_space),
- tls_static_space);
+ memcpy((void *)(segbase - libc_tls_static_space),
+ (const void *)(oldsegbase - libc_tls_static_space),
+ libc_tls_static_space);
/*
* We assume that this block was the one we created with
@@ -390,10 +391,11 @@ __libc_allocate_tls(void *oldtls, size_t tcbsize, size_t tcbalign)
*/
_rtld_free_tls(oldtls, 2*sizeof(Elf_Addr), sizeof(Elf_Addr));
} else {
- memcpy((void *)(segbase - tls_static_space),
- tls_init, tls_init_size);
- memset((void *)(segbase - tls_static_space + tls_init_size),
- 0, tls_static_space - tls_init_size);
+ memcpy((void *)(segbase - libc_tls_static_space),
+ libc_tls_init, libc_tls_init_size);
+ memset((void *)(segbase - libc_tls_static_space +
+ libc_tls_init_size), 0,
+ libc_tls_static_space - libc_tls_init_size);
}
return (void*) segbase;
@@ -457,11 +459,11 @@ _init_tls(void)
for (i = 0; (unsigned) i < phnum; i++) {
if (phdr[i].p_type == PT_TLS) {
- tls_static_space = roundup2(phdr[i].p_memsz,
+ libc_tls_static_space = roundup2(phdr[i].p_memsz,
phdr[i].p_align);
- tls_init_size = phdr[i].p_filesz;
- tls_init_align = phdr[i].p_align;
- tls_init = (void*) phdr[i].p_vaddr;
+ libc_tls_init_size = phdr[i].p_filesz;
+ libc_tls_init_align = phdr[i].p_align;
+ libc_tls_init = (void *)phdr[i].p_vaddr;
break;
}
}
diff --git a/lib/libdl/Makefile b/lib/libdl/Makefile
index d91547352de4..c37449691e0b 100644
--- a/lib/libdl/Makefile
+++ b/lib/libdl/Makefile
@@ -6,6 +6,13 @@ SHLIB_MAJOR=1
.PATH: ${SRCTOP}/lib/libc/gen
CFLAGS+=-I${SRCTOP}/lib/libc/include
+RTLD_ELF_DIR=${SRCTOP}/libexec/rtld-elf
+.if exists(${RTLD_ELF_DIR}/${MACHINE_ARCH:S/powerpc64le/powerpc64/})
+RTLD_ARCH= ${MACHINE_ARCH:S/powerpc64le/powerpc64/}
+.else
+RTLD_ARCH= ${MACHINE_CPUARCH}
+.endif
+CFLAGS+= -I${RTLD_ELF_DIR}/${RTLD_ARCH} -I${RTLD_ELF_DIR}
CFLAGS+=-DIN_LIBDL
LDFLAGS+=-Wl,-F,libc.so.7
VERSION_DEF=${SRCTOP}/lib/libc/Versions.def
More information about the dev-commits-src-branches
mailing list