fix tls offsets when p_vaddr%p_align != 0 on TLS_ABOVE_TP targets
authorSzabolcs Nagy <nsz@port70.net>
Mon, 13 May 2019 18:47:11 +0000 (18:47 +0000)
committerRich Felker <dalias@aerifal.cx>
Fri, 17 May 2019 01:48:39 +0000 (21:48 -0400)
commita60b9e06861e56c0810bae0249b421e1758d281a
tree94cfc88638aa6a872e29be5df6690588e5a7275c
parent6104dae9088da7ffd9346671be867a43a4b03295
fix tls offsets when p_vaddr%p_align != 0 on TLS_ABOVE_TP targets

currently the bfd linker does not seem to create tls segments where
p_vaddr%p_align != 0, but this is valid in ELF and then the runtime
computed tls offset must satisfy

  offset%p_align == (base+p_vaddr)%p_align

and in case of local exec tls (main executable) the smallest such
offset must be used (otherwise it is incompatible with the offset
computed by the static linker). the !TLS_ABOVE_TP case is handled
correctly (the offset is negative then in the formula).

the ldso code for TLS_ABOVE_TP is changed so the static tls offset
of each module satisfies the formula.
ldso/dynlink.c
src/env/__init_tls.c