diff options
Diffstat (limited to 'ldso')
-rw-r--r-- | ldso/dynlink.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/ldso/dynlink.c b/ldso/dynlink.c index 967f1fd9..1398ff45 100644 --- a/ldso/dynlink.c +++ b/ldso/dynlink.c @@ -1125,8 +1125,8 @@ static struct dso *load_library(const char *name, struct dso *needed_by) p->tls_id = ++tls_cnt; tls_align = MAXP2(tls_align, p->tls.align); #ifdef TLS_ABOVE_TP - p->tls.offset = tls_offset + ( (tls_align-1) & - -(tls_offset + (uintptr_t)p->tls.image) ); + p->tls.offset = tls_offset + ( (p->tls.align-1) & + (-tls_offset + (uintptr_t)p->tls.image) ); tls_offset = p->tls.offset + p->tls.size; #else tls_offset += p->tls.size + p->tls.align - 1; @@ -1796,7 +1796,8 @@ _Noreturn void __dls3(size_t *sp) app.tls_id = tls_cnt = 1; #ifdef TLS_ABOVE_TP app.tls.offset = GAP_ABOVE_TP; - app.tls.offset += -GAP_ABOVE_TP & (app.tls.align-1); + app.tls.offset += (-GAP_ABOVE_TP + (uintptr_t)app.tls.image) + & (app.tls.align-1); tls_offset = app.tls.offset + app.tls.size; #else tls_offset = app.tls.offset = app.tls.size |