svn commit: r317189 - stable/11/libexec/rtld-elf/aarch64

Andrew Turner andrew at FreeBSD.org
Thu Apr 20 12:48:03 UTC 2017


Author: andrew
Date: Thu Apr 20 12:48:01 2017
New Revision: 317189
URL: https://svnweb.freebsd.org/changeset/base/317189

Log:
  MFC r312764:
  Pull the R_AARCH64_TLSDESC code out into a common function and use them in
  both the plt and non-plt case.
  
  This fixes an issue where libraries built with LLD can fail with
  "Unhandled relocation 1031"

Modified:
  stable/11/libexec/rtld-elf/aarch64/reloc.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/libexec/rtld-elf/aarch64/reloc.c
==============================================================================
--- stable/11/libexec/rtld-elf/aarch64/reloc.c	Thu Apr 20 11:52:10 2017	(r317188)
+++ stable/11/libexec/rtld-elf/aarch64/reloc.c	Thu Apr 20 12:48:01 2017	(r317189)
@@ -184,6 +184,18 @@ rtld_tlsdesc_handle(struct tls_data *tls
 	return (tlsdesc->index);
 }
 
+static void
+reloc_tlsdesc(Obj_Entry *obj, const Elf_Rela *rela, Elf_Addr *where)
+{
+	if (ELF_R_SYM(rela->r_info) == 0) {
+		where[0] = (Elf_Addr)_rtld_tlsdesc;
+		where[1] = obj->tlsoffset + rela->r_addend;
+	} else {
+		where[0] = (Elf_Addr)_rtld_tlsdesc_dynamic;
+		where[1] = (Elf_Addr)reloc_tlsdesc_alloc(obj, rela);
+	}
+}
+
 /*
  * Process the PLT relocations.
  */
@@ -204,14 +216,7 @@ reloc_plt(Obj_Entry *obj)
 			*where += (Elf_Addr)obj->relocbase;
 			break;
 		case R_AARCH64_TLSDESC:
-			if (ELF_R_SYM(rela->r_info) == 0) {
-				where[0] = (Elf_Addr)_rtld_tlsdesc;
-				where[1] = obj->tlsoffset + rela->r_addend;
-			} else {
-				where[0] = (Elf_Addr)_rtld_tlsdesc_dynamic;
-				where[1] = (Elf_Addr)reloc_tlsdesc_alloc(obj,
-				    rela);
-			}
+			reloc_tlsdesc(obj, rela, where);
 			break;
 		default:
 			_rtld_error("Unknown relocation type %u in PLT",
@@ -361,6 +366,9 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry 
 				return (-1);
 			}
 			break;
+		case R_AARCH64_TLSDESC:
+			reloc_tlsdesc(obj, rela, where);
+			break;
 		case R_AARCH64_TLS_TPREL64:
 			def = find_symdef(symnum, obj, &defobj, flags, cache,
 			    lockstate);


More information about the svn-src-all mailing list