From 4064f77d2f550762cbf220fec7c26a8ce4219ea4 Mon Sep 17 00:00:00 2001 From: Alexander Egorenkov Date: Sun, 8 Aug 2021 11:19:52 +0200 Subject: [PATCH] src/rtld/dl-tls.c: Fix TLS offsets computation for s390 arch rtld_determine_tlsoffsets() didn't handle s390 arch properly by falling back to the default case. If TLS_TCB_AT_TP is 1, then set offset to -1. From glibc's sysdeps/s390/nptl/tls.h: ------------------------------------- /* The TCB can have any size and the memory following the address the thread pointer points to is unspecified. Allocate the TCB there. */ define TLS_TCB_AT_TP 1 define TLS_DTV_AT_TP 0 This lead to the following error: --------------------------------- prelink-rtld: error while loading shared libraries: /lib64/libc.so.6: cannot handle TLS data Signed-off-by: Alexander Egorenkov --- src/rtld/dl-tls.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/rtld/dl-tls.c b/src/rtld/dl-tls.c index 280cee45f950..29422dcfd25e 100644 --- a/src/rtld/dl-tls.c +++ b/src/rtld/dl-tls.c @@ -143,6 +143,11 @@ rtld_determine_tlsoffsets (int e_machine, struct r_scope_elem *search_list) tls_tcb_size = 0; break; + case EM_S390: + tls_tcb_at_tp = 1; + tls_tcb_size = -1; + break; + default: /* Hope there's no TLS! */ for (i = 0; i < search_list->r_nlist; i++) -- 2.31.1