about summary refs log tree commit diff
path: root/ldso
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2023-11-06 21:50:37 -0500
committerRich Felker <dalias@aerifal.cx>2023-11-06 21:50:37 -0500
commite17b9d74740df413fae2502c0010591c7998c40d (patch)
treeae0b33838861229d904615fd67efee3535d94054 /ldso
parent039d3c34f2e3578a8b7ada42f89213b844aa7a4e (diff)
downloadmusl-e17b9d74740df413fae2502c0010591c7998c40d.tar.gz
musl-e17b9d74740df413fae2502c0010591c7998c40d.tar.xz
musl-e17b9d74740df413fae2502c0010591c7998c40d.zip
ldso: fix TLSDESC addend processing on archs with backwards descriptors
presently this only affects 32-bit arm. despite correctly reversing
the function pointer and argument fields based on the
TLSDESC_BACKWARDS macro, we did not read the addend from the
swapped-order argument field, so nonzero addends were lost, producing
wrong runtime addresses for TLS objects needing an addend.

based on report and patch by Rui Ueyama.
Diffstat (limited to 'ldso')
-rw-r--r--ldso/dynlink.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/ldso/dynlink.c b/ldso/dynlink.c
index 6ba51b0a..324aa859 100644
--- a/ldso/dynlink.c
+++ b/ldso/dynlink.c
@@ -517,7 +517,7 @@ static void do_relocs(struct dso *dso, size_t *rel, size_t rel_size, size_t stri
 			break;
 #endif
 		case REL_TLSDESC:
-			if (stride<3) addend = reloc_addr[1];
+			if (stride<3) addend = reloc_addr[!TLSDESC_BACKWARDS];
 			if (def.dso->tls_id > static_tls_cnt) {
 				struct td_index *new = malloc(sizeof *new);
 				if (!new) {