diff options
author | Ulrich Drepper <drepper@redhat.com> | 2002-02-07 08:44:37 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2002-02-07 08:44:37 +0000 |
commit | cd30b01ee9cdefd2e6f81b1c25ee6897243706fc (patch) | |
tree | 39d460bf6b86baf4199f85a9f26d64913b82992e /sysdeps/generic/dl-tls.c | |
parent | 8d4b5a8a50fad0ed1005380aa8d1c13dcfdab08d (diff) | |
download | glibc-cd30b01ee9cdefd2e6f81b1c25ee6897243706fc.tar glibc-cd30b01ee9cdefd2e6f81b1c25ee6897243706fc.tar.gz glibc-cd30b01ee9cdefd2e6f81b1c25ee6897243706fc.tar.bz2 glibc-cd30b01ee9cdefd2e6f81b1c25ee6897243706fc.zip |
Update.
2002-02-07 Ulrich Drepper <drepper@redhat.com>
* sysdeps/generic/dl-tls.c (_dl_determine_tlsoffset): Account for
alignment of the TCB and store total size and alignment of static
TLS block in _dl_tls_static_size and _dl_tls_static_align.
tls_index is a typedef.
* sysdeps/generic/ldsodefs.h: Declare _dl_tls_static_size and
_dl_tls_static_align.
* sysdeps/i386/dl-tls.h: tls_index is a typedef.
* elf/dl-support.c: Define _dl_tls_static_size and
_dl_tls_static_align.
Diffstat (limited to 'sysdeps/generic/dl-tls.c')
-rw-r--r-- | sysdeps/generic/dl-tls.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/sysdeps/generic/dl-tls.c b/sysdeps/generic/dl-tls.c index 729adf0040..1b16bd58f4 100644 --- a/sysdeps/generic/dl-tls.c +++ b/sysdeps/generic/dl-tls.c @@ -103,7 +103,21 @@ _dl_determine_tlsoffset (struct link_map *firstp) /* The thread descriptor (pointed to by the thread pointer) has its own alignment requirement. Adjust the static TLS size - appropriately. */ + and TLS offsets appropriately. */ + if (offset % TLS_TCB_ALIGN != 0) + { + size_t add = TLS_TCB_ALIGN - offset % TLS_TCB_ALIGN; + + /* XXX If the offset stored is negative we must subtract here. */ + offset += add; + + runp = firstp; + do + runp->l_tls_offset += add; + while ((runp = runp->l_tls_nextimage) != firstp); + } + + GL(dl_tls_static_size) = offset + TLS_TCB_SIZE; # elif TLS_DTV_AT_TP struct link_map *lastp; @@ -121,10 +135,17 @@ _dl_determine_tlsoffset (struct link_map *firstp) offset = roundup (offset + lastp->l_tls_blocksize, runp->l_tls_align); runp->l_tls_offset = offset; + + lastp = runp; } + + GL(dl_tls_static_size) = offset + lastp->l_tls_blocksize; # else # error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" # endif + + /* The alignment requirement for the static TLS block. */ + GL(dl_tls_static_align) = MAX (TLS_TCB_ALIGN, max_align); } @@ -136,7 +157,7 @@ _dl_determine_tlsoffset (struct link_map *firstp) it. Users of the IA-64 form have to provide adequate definitions of the following macros. */ # ifndef GET_ADDR_ARGS -# define GET_ADDR_ARGS struct tls_index *ti +# define GET_ADDR_ARGS tls_index *ti # endif # ifndef GET_ADDR_MODULE # define GET_ADDR_MODULE ti->ti_module |