Browse Source

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.
Rich Felker 5 months ago
parent
commit
e17b9d7474
1 changed files with 1 additions and 1 deletions
  1. 1 1
      ldso/dynlink.c

+ 1 - 1
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) {