CVS commit: src/libexec/ld.elf_so/arch/aarch64

2022-12-03 Thread Nick Hudson
Module Name:src
Committed By:   skrll
Date:   Sat Dec  3 09:10:40 UTC 2022

Modified Files:
src/libexec/ld.elf_so/arch/aarch64: mdreloc.c

Log Message:
Whitespace. NFC.


To generate a diff of this commit:
cvs rdiff -u -r1.16 -r1.17 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/libexec/ld.elf_so/arch/aarch64/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.16 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.17
--- src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.16	Tue Jun 21 06:52:17 2022
+++ src/libexec/ld.elf_so/arch/aarch64/mdreloc.c	Sat Dec  3 09:10:40 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: mdreloc.c,v 1.16 2022/06/21 06:52:17 skrll Exp $ */
+/* $NetBSD: mdreloc.c,v 1.17 2022/12/03 09:10:40 skrll Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -60,7 +60,7 @@
 
 #include 
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.16 2022/06/21 06:52:17 skrll Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.17 2022/12/03 09:10:40 skrll Exp $");
 #endif /* not lint */
 
 #include 
@@ -288,15 +288,14 @@ _rtld_relocate_nonplt_objects(Obj_Entry 
 			rdbg(("TLS_DTPREL %s in %s --> %p",
 			obj->strtab + obj->symtab[symnum].st_name,
 			obj->path, (void *)*where));
-
 			break;
+
 		case R_TLS_TYPE(TLS_DTPMOD):
 			*where = (Elf_Addr)(defobj->tlsindex);
 
 			rdbg(("TLS_DTPMOD %s in %s --> %p",
 			obj->strtab + obj->symtab[symnum].st_name,
 			obj->path, (void *)*where));
-
 			break;
 
 		case R_TLS_TYPE(TLS_TPREL):



CVS commit: src/libexec/ld.elf_so/arch/aarch64

2022-12-03 Thread Nick Hudson
Module Name:src
Committed By:   skrll
Date:   Sat Dec  3 09:10:40 UTC 2022

Modified Files:
src/libexec/ld.elf_so/arch/aarch64: mdreloc.c

Log Message:
Whitespace. NFC.


To generate a diff of this commit:
cvs rdiff -u -r1.16 -r1.17 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.



CVS commit: src/libexec/ld.elf_so/arch/aarch64

2020-06-16 Thread Joerg Sonnenberger
Module Name:src
Committed By:   joerg
Date:   Tue Jun 16 21:01:30 UTC 2020

Modified Files:
src/libexec/ld.elf_so/arch/aarch64: mdreloc.c

Log Message:
Honor addend for R_AARCH64_TLS_TPREL relocation.


To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/libexec/ld.elf_so/arch/aarch64/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.13 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.14
--- src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.13	Fri Jan 18 11:59:03 2019
+++ src/libexec/ld.elf_so/arch/aarch64/mdreloc.c	Tue Jun 16 21:01:30 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: mdreloc.c,v 1.13 2019/01/18 11:59:03 skrll Exp $ */
+/* $NetBSD: mdreloc.c,v 1.14 2020/06/16 21:01:30 joerg Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -60,7 +60,7 @@
 
 #include 
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.13 2019/01/18 11:59:03 skrll Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.14 2020/06/16 21:01:30 joerg Exp $");
 #endif /* not lint */
 
 #include 
@@ -296,8 +296,9 @@ _rtld_relocate_nonplt_objects(Obj_Entry 
 			_rtld_tls_offset_allocate(obj))
 return -1;
 
-			*where = (Elf_Addr)def->st_value + defobj->tlsoffset +
-			sizeof(struct tls_tcb);
+			*where = (Elf_Addr)(def->st_value + defobj->tlsoffset +
+			rela->r_addend + sizeof(struct tls_tcb));
+
 			rdbg(("TLS_TPREL %s in %s --> %p in %s",
 			obj->strtab + obj->symtab[symnum].st_name,
 			obj->path, (void *)*where, defobj->path));



CVS commit: src/libexec/ld.elf_so/arch/aarch64

2020-06-16 Thread Joerg Sonnenberger
Module Name:src
Committed By:   joerg
Date:   Tue Jun 16 21:01:30 UTC 2020

Modified Files:
src/libexec/ld.elf_so/arch/aarch64: mdreloc.c

Log Message:
Honor addend for R_AARCH64_TLS_TPREL relocation.


To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.



CVS commit: src/libexec/ld.elf_so/arch/aarch64

2019-01-18 Thread Nick Hudson
Module Name:src
Committed By:   skrll
Date:   Fri Jan 18 11:59:04 UTC 2019

Modified Files:
src/libexec/ld.elf_so/arch/aarch64: mdreloc.c rtld_start.S

Log Message:
Adapt https://svnweb.freebsd.org/base?view=revision=342113 to
NetBSD.

This brings us resolving for dynamically loaded libraries and makes
tests/libexec/ld.elf_so/t_thread_local_dtor pass.

With suggestions from joerg@


To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c
cvs rdiff -u -r1.3 -r1.4 src/libexec/ld.elf_so/arch/aarch64/rtld_start.S

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/libexec/ld.elf_so/arch/aarch64/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.12 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.13
--- src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.12	Fri Nov 23 11:26:05 2018
+++ src/libexec/ld.elf_so/arch/aarch64/mdreloc.c	Fri Jan 18 11:59:03 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: mdreloc.c,v 1.12 2018/11/23 11:26:05 skrll Exp $ */
+/* $NetBSD: mdreloc.c,v 1.13 2019/01/18 11:59:03 skrll Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -60,7 +60,7 @@
 
 #include 
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.12 2018/11/23 11:26:05 skrll Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.13 2019/01/18 11:59:03 skrll Exp $");
 #endif /* not lint */
 
 #include 
@@ -70,17 +70,16 @@ __RCSID("$NetBSD: mdreloc.c,v 1.12 2018/
 #include "rtld.h"
 
 struct tls_data {
-	int64_t index;
-	Obj_Entry *obj;
-	const Elf_Rela *rela;
+	size_t		td_tlsindex;
+	Elf_Addr	td_tlsoffs;
 };
 
 void _rtld_bind_start(void);
 void _rtld_relocate_nonplt_self(Elf_Dyn *, Elf_Addr);
 Elf_Addr _rtld_bind(const Obj_Entry *, Elf_Word);
-void *_rtld_tlsdesc(void *);
+void *_rtld_tlsdesc_static(void *);
+void *_rtld_tlsdesc_undef(void *);
 void *_rtld_tlsdesc_dynamic(void *);
-int64_t _rtld_tlsdesc_handle(struct tls_data *, u_int);
 
 /*
  * AARCH64 PLT looks like this;
@@ -117,67 +116,63 @@ _rtld_setup_pltgot(const Obj_Entry *obj)
 }
 
 static struct tls_data *
-_rtld_tlsdesc_alloc(Obj_Entry *obj, const Elf_Rela *rela)
+_rtld_tlsdesc_alloc(size_t tlsindex, Elf_Addr offs)
 {
 	struct tls_data *tlsdesc;
 
 	tlsdesc = xmalloc(sizeof(*tlsdesc));
-	tlsdesc->index = -1;
-	tlsdesc->obj = obj;
-	tlsdesc->rela = rela;
+	tlsdesc->td_tlsindex = tlsindex;
+	tlsdesc->td_tlsoffs = offs;
 
 	return tlsdesc;
 }
 
-static int64_t
-_rtld_tlsdesc_handle_locked(struct tls_data *tlsdesc, u_int flags)
+static void
+_rtld_tlsdesc_fill(const Obj_Entry *obj, const Elf_Rela *rela, Elf_Addr *where, u_int flags)
 {
-	const Elf_Rela *rela;
 	const Elf_Sym *def;
 	const Obj_Entry *defobj;
-	Obj_Entry *obj;
-
-	rela = tlsdesc->rela;
-	obj = tlsdesc->obj;
-
-	def = _rtld_find_symdef(ELF_R_SYM(rela->r_info), obj, , flags);
-	if (def == NULL)
-		_rtld_die();
-
-	tlsdesc->index = defobj->tlsoffset + def->st_value + rela->r_addend +
-	sizeof(struct tls_tcb);
+	Elf_Addr offs = 0;
+	unsigned long symnum = ELF_R_SYM(rela->r_info);
 
-	return tlsdesc->index;
-}
-
-int64_t
-_rtld_tlsdesc_handle(struct tls_data *tlsdesc, u_int flags)
-{
-	sigset_t mask;
+	if (symnum != 0) {
+		def = _rtld_find_symdef(ELF_R_SYM(rela->r_info), obj, ,
+		flags);
+		if (def == NULL)
+			_rtld_die();
+		if (def == &_rtld_sym_zero) {
+			/* Weak undefined thread variable */
+			where[0] = (Elf_Addr)_rtld_tlsdesc_undef;
+			where[1] = rela->r_addend;
 
-	/* We have already found the index, return it */
-	if (tlsdesc->index >= 0)
-		return tlsdesc->index;
-
-	_rtld_exclusive_enter();
-	/* tlsdesc->index may have been set by another thread */
-	if (tlsdesc->index == -1)
-		_rtld_tlsdesc_handle_locked(tlsdesc, flags);
-	_rtld_exclusive_exit();
+			rdbg(("TLSDESC %s (weak) in %s --> %p",
+			obj->strtab + obj->symtab[symnum].st_name,
+			obj->path, (void *)where[1]));
 
-	return tlsdesc->index;
-}
+			return;
+		}
+		offs = def->st_value;
+	} else {
+		defobj = obj;
+	}
+	offs += rela->r_addend;
 
-static void
-_rtld_tlsdesc_fill(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 +
+	if (defobj->tls_done) {
+		/* Variable is in initialy allocated TLS segment */
+		where[0] = (Elf_Addr)_rtld_tlsdesc_static;
+		where[1] = defobj->tlsoffset + offs +
 		sizeof(struct tls_tcb);
+
+		rdbg(("TLSDESC %s --> %p static",
+		obj->path, (void *)where[1]));
 	} else {
+		/* TLS offset is unknown at load time, use dynamic resolving */
 		where[0] = (Elf_Addr)_rtld_tlsdesc_dynamic;
-		where[1] = (Elf_Addr)_rtld_tlsdesc_alloc(obj, rela);
+		where[1] = (Elf_Addr)_rtld_tlsdesc_alloc(defobj->tlsindex, offs);
+
+		rdbg(("TLSDESC %s in %s --> %p dynamic (%zu, %p)",
+		obj->strtab + obj->symtab[symnum].st_name,
+		obj->path, (void *)where[1], defobj->tlsindex, (void *)offs));
 	}
 }
 
@@ -276,7 

CVS commit: src/libexec/ld.elf_so/arch/aarch64

2019-01-18 Thread Nick Hudson
Module Name:src
Committed By:   skrll
Date:   Fri Jan 18 11:59:04 UTC 2019

Modified Files:
src/libexec/ld.elf_so/arch/aarch64: mdreloc.c rtld_start.S

Log Message:
Adapt https://svnweb.freebsd.org/base?view=revision=342113 to
NetBSD.

This brings us resolving for dynamically loaded libraries and makes
tests/libexec/ld.elf_so/t_thread_local_dtor pass.

With suggestions from joerg@


To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c
cvs rdiff -u -r1.3 -r1.4 src/libexec/ld.elf_so/arch/aarch64/rtld_start.S

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.



CVS commit: src/libexec/ld.elf_so/arch/aarch64

2018-11-23 Thread Nick Hudson
Module Name:src
Committed By:   skrll
Date:   Fri Nov 23 11:26:05 UTC 2018

Modified Files:
src/libexec/ld.elf_so/arch/aarch64: mdreloc.c

Log Message:
Fix RTLD_DEBUG_RELOC build


To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/libexec/ld.elf_so/arch/aarch64/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.11 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.12
--- src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.11	Fri Nov 23 10:59:20 2018
+++ src/libexec/ld.elf_so/arch/aarch64/mdreloc.c	Fri Nov 23 11:26:05 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: mdreloc.c,v 1.11 2018/11/23 10:59:20 skrll Exp $ */
+/* $NetBSD: mdreloc.c,v 1.12 2018/11/23 11:26:05 skrll Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -60,7 +60,7 @@
 
 #include 
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.11 2018/11/23 10:59:20 skrll Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.12 2018/11/23 11:26:05 skrll Exp $");
 #endif /* not lint */
 
 #include 
@@ -215,7 +215,7 @@ _rtld_relocate_nonplt_objects(Obj_Entry 
 	for (const Elf_Rela *rela = obj->rela; rela < obj->relalim; rela++) {
 		Elf_Addr*where;
 		Elf_Addr	tmp;
-		unsigned long	symnum;
+		unsigned long	symnum = ULONG_MAX;
 
 		where = (Elf_Addr *)(obj->relocbase + rela->r_offset);
 
@@ -310,12 +310,11 @@ _rtld_relocate_nonplt_objects(Obj_Entry 
 
 		default:
 			rdbg(("sym = %lu, type = %lu, offset = %p, "
-			"addend = %p, contents = %p, symbol = %s",
+			"addend = %p, contents = %p",
 			(u_long)ELF_R_SYM(rela->r_info),
 			(u_long)ELF_R_TYPE(rela->r_info),
 			(void *)rela->r_offset, (void *)rela->r_addend,
-			(void *)*where,
-			obj->strtab + obj->symtab[symnum].st_name));
+			(void *)*where));
 			_rtld_error("%s: Unsupported relocation type %ld "
 			"in non-PLT relocations",
 			obj->path, (u_long) ELF_R_TYPE(rela->r_info));



CVS commit: src/libexec/ld.elf_so/arch/aarch64

2018-11-23 Thread Nick Hudson
Module Name:src
Committed By:   skrll
Date:   Fri Nov 23 11:26:05 UTC 2018

Modified Files:
src/libexec/ld.elf_so/arch/aarch64: mdreloc.c

Log Message:
Fix RTLD_DEBUG_RELOC build


To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.



CVS commit: src/libexec/ld.elf_so/arch/aarch64

2018-11-23 Thread Nick Hudson
Module Name:src
Committed By:   skrll
Date:   Fri Nov 23 10:59:20 UTC 2018

Modified Files:
src/libexec/ld.elf_so/arch/aarch64: mdreloc.c

Log Message:
Trailing whitespace


To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.



CVS commit: src/libexec/ld.elf_so/arch/aarch64

2018-11-23 Thread Nick Hudson
Module Name:src
Committed By:   skrll
Date:   Fri Nov 23 10:59:20 UTC 2018

Modified Files:
src/libexec/ld.elf_so/arch/aarch64: mdreloc.c

Log Message:
Trailing whitespace


To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/libexec/ld.elf_so/arch/aarch64/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.10 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.11
--- src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.10	Thu Sep 20 19:02:22 2018
+++ src/libexec/ld.elf_so/arch/aarch64/mdreloc.c	Fri Nov 23 10:59:20 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: mdreloc.c,v 1.10 2018/09/20 19:02:22 jakllsch Exp $ */
+/* $NetBSD: mdreloc.c,v 1.11 2018/11/23 10:59:20 skrll Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -60,7 +60,7 @@
 
 #include 
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.10 2018/09/20 19:02:22 jakllsch Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.11 2018/11/23 10:59:20 skrll Exp $");
 #endif /* not lint */
 
 #include 
@@ -439,7 +439,7 @@ _rtld_relocate_plt_objects(const Obj_Ent
 {
 	const Elf_Rela *rela;
 	int err = 0;
-	
+
 	for (rela = obj->pltrela; rela < obj->pltrelalim; rela++) {
 		err = _rtld_relocate_plt_object(obj, rela, NULL);
 		if (err)



CVS commit: src/libexec/ld.elf_so/arch/aarch64

2018-09-20 Thread Jonathan A. Kollasch
Module Name:src
Committed By:   jakllsch
Date:   Thu Sep 20 19:02:22 UTC 2018

Modified Files:
src/libexec/ld.elf_so/arch/aarch64: mdreloc.c

Log Message:
Revise previous to not deadlock.


To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/libexec/ld.elf_so/arch/aarch64/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.9 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.10
--- src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.9	Thu Sep 20 18:41:05 2018
+++ src/libexec/ld.elf_so/arch/aarch64/mdreloc.c	Thu Sep 20 19:02:22 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: mdreloc.c,v 1.9 2018/09/20 18:41:05 jakllsch Exp $ */
+/* $NetBSD: mdreloc.c,v 1.10 2018/09/20 19:02:22 jakllsch Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -60,7 +60,7 @@
 
 #include 
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.9 2018/09/20 18:41:05 jakllsch Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.10 2018/09/20 19:02:22 jakllsch Exp $");
 #endif /* not lint */
 
 #include 
@@ -412,7 +412,7 @@ _rtld_relocate_plt_object(const Obj_Entr
 		if (ELF_R_SYM(rela->r_info) != 0) {
 			struct tls_data *tlsdesc = (struct tls_data *)where[1];
 			if (tlsdesc->index == -1)
-_rtld_tlsdesc_handle(tlsdesc, SYMLOOK_IN_PLT);
+_rtld_tlsdesc_handle_locked(tlsdesc, SYMLOOK_IN_PLT);
 		}
 		break;
 	}



CVS commit: src/libexec/ld.elf_so/arch/aarch64

2018-09-20 Thread Jonathan A. Kollasch
Module Name:src
Committed By:   jakllsch
Date:   Thu Sep 20 19:02:22 UTC 2018

Modified Files:
src/libexec/ld.elf_so/arch/aarch64: mdreloc.c

Log Message:
Revise previous to not deadlock.


To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.



CVS commit: src/libexec/ld.elf_so/arch/aarch64

2018-09-20 Thread Jonathan A. Kollasch
Module Name:src
Committed By:   jakllsch
Date:   Thu Sep 20 18:41:05 UTC 2018

Modified Files:
src/libexec/ld.elf_so/arch/aarch64: mdreloc.c rtld_start.S

Log Message:
Improve support for R_AARCH64_TLSDESC relocations.

In large part from FreeBSD.


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c
cvs rdiff -u -r1.2 -r1.3 src/libexec/ld.elf_so/arch/aarch64/rtld_start.S

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.



CVS commit: src/libexec/ld.elf_so/arch/aarch64

2018-09-20 Thread Jonathan A. Kollasch
Module Name:src
Committed By:   jakllsch
Date:   Thu Sep 20 18:41:05 UTC 2018

Modified Files:
src/libexec/ld.elf_so/arch/aarch64: mdreloc.c rtld_start.S

Log Message:
Improve support for R_AARCH64_TLSDESC relocations.

In large part from FreeBSD.


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c
cvs rdiff -u -r1.2 -r1.3 src/libexec/ld.elf_so/arch/aarch64/rtld_start.S

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/libexec/ld.elf_so/arch/aarch64/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.8 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.9
--- src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.8	Mon Jul 16 00:29:37 2018
+++ src/libexec/ld.elf_so/arch/aarch64/mdreloc.c	Thu Sep 20 18:41:05 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: mdreloc.c,v 1.8 2018/07/16 00:29:37 christos Exp $ */
+/* $NetBSD: mdreloc.c,v 1.9 2018/09/20 18:41:05 jakllsch Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -29,9 +29,38 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
+/*-
+ * Copyright (c) 2014-2015 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * Portions of this software were developed by Andrew Turner
+ * under sponsorship from the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *notice, this list of conditions and the following disclaimer in the
+ *documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
 #include 
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.8 2018/07/16 00:29:37 christos Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.9 2018/09/20 18:41:05 jakllsch Exp $");
 #endif /* not lint */
 
 #include 
@@ -40,10 +69,18 @@ __RCSID("$NetBSD: mdreloc.c,v 1.8 2018/0
 #include "debug.h"
 #include "rtld.h"
 
+struct tls_data {
+	int64_t index;
+	Obj_Entry *obj;
+	const Elf_Rela *rela;
+};
+
 void _rtld_bind_start(void);
 void _rtld_relocate_nonplt_self(Elf_Dyn *, Elf_Addr);
 Elf_Addr _rtld_bind(const Obj_Entry *, Elf_Word);
 void *_rtld_tlsdesc(void *);
+void *_rtld_tlsdesc_dynamic(void *);
+int64_t _rtld_tlsdesc_handle(struct tls_data *, u_int);
 
 /*
  * AARCH64 PLT looks like this;
@@ -79,6 +116,71 @@ _rtld_setup_pltgot(const Obj_Entry *obj)
 	obj->pltgot[2] = (Elf_Addr) &_rtld_bind_start;
 }
 
+static struct tls_data *
+_rtld_tlsdesc_alloc(Obj_Entry *obj, const Elf_Rela *rela)
+{
+	struct tls_data *tlsdesc;
+
+	tlsdesc = xmalloc(sizeof(*tlsdesc));
+	tlsdesc->index = -1;
+	tlsdesc->obj = obj;
+	tlsdesc->rela = rela;
+
+	return tlsdesc;
+}
+
+static int64_t
+_rtld_tlsdesc_handle_locked(struct tls_data *tlsdesc, u_int flags)
+{
+	const Elf_Rela *rela;
+	const Elf_Sym *def;
+	const Obj_Entry *defobj;
+	Obj_Entry *obj;
+
+	rela = tlsdesc->rela;
+	obj = tlsdesc->obj;
+
+	def = _rtld_find_symdef(ELF_R_SYM(rela->r_info), obj, , flags);
+	if (def == NULL)
+		_rtld_die();
+
+	tlsdesc->index = defobj->tlsoffset + def->st_value + rela->r_addend +
+	sizeof(struct tls_tcb);
+
+	return tlsdesc->index;
+}
+
+int64_t
+_rtld_tlsdesc_handle(struct tls_data *tlsdesc, u_int flags)
+{
+	sigset_t mask;
+
+	/* We have already found the index, return it */
+	if (tlsdesc->index >= 0)
+		return tlsdesc->index;
+
+	_rtld_exclusive_enter();
+	/* tlsdesc->index may have been set by another thread */
+	if (tlsdesc->index == -1)
+		_rtld_tlsdesc_handle_locked(tlsdesc, flags);
+	_rtld_exclusive_exit();
+
+	return tlsdesc->index;
+}
+
+static void
+_rtld_tlsdesc_fill(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 +
+		sizeof(struct tls_tcb);
+	} else {
+		where[0] = (Elf_Addr)_rtld_tlsdesc_dynamic;
+		where[1] = (Elf_Addr)_rtld_tlsdesc_alloc(obj, rela);
+	}
+}
+
 void
 

CVS commit: src/libexec/ld.elf_so/arch/aarch64

2018-07-15 Thread Christos Zoulas
Module Name:src
Committed By:   christos
Date:   Mon Jul 16 00:29:37 UTC 2018

Modified Files:
src/libexec/ld.elf_so/arch/aarch64: mdreloc.c

Log Message:
Initialize new_value to account for bogus return from the function.


To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/libexec/ld.elf_so/arch/aarch64/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.7 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.8
--- src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.7	Sun Feb  4 16:49:51 2018
+++ src/libexec/ld.elf_so/arch/aarch64/mdreloc.c	Sun Jul 15 20:29:37 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: mdreloc.c,v 1.7 2018/02/04 21:49:51 skrll Exp $ */
+/* $NetBSD: mdreloc.c,v 1.8 2018/07/16 00:29:37 christos Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include 
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.7 2018/02/04 21:49:51 skrll Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.8 2018/07/16 00:29:37 christos Exp $");
 #endif /* not lint */
 
 #include 
@@ -311,7 +311,7 @@ Elf_Addr
 _rtld_bind(const Obj_Entry *obj, Elf_Word relaidx)
 {
 	const Elf_Rela *rela = obj->pltrela + relaidx;
-	Elf_Addr new_value;
+	Elf_Addr new_value = 0;
 
 	_rtld_shared_enter();
 	int err = _rtld_relocate_plt_object(obj, rela, _value);



CVS commit: src/libexec/ld.elf_so/arch/aarch64

2018-07-15 Thread Christos Zoulas
Module Name:src
Committed By:   christos
Date:   Mon Jul 16 00:29:37 UTC 2018

Modified Files:
src/libexec/ld.elf_so/arch/aarch64: mdreloc.c

Log Message:
Initialize new_value to account for bogus return from the function.


To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.



CVS commit: src/libexec/ld.elf_so/arch/aarch64

2018-02-04 Thread Nick Hudson
Module Name:src
Committed By:   skrll
Date:   Sun Feb  4 21:49:51 UTC 2018

Modified Files:
src/libexec/ld.elf_so/arch/aarch64: mdreloc.c rtld_start.S

Log Message:
Various fixes / changes from Ryo Shimizu / Toru Nishimura to make this
work.

_rtld_call_ifunc copied from other rela platforms by me - not tested in
any way.


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c
cvs rdiff -u -r1.1 -r1.2 src/libexec/ld.elf_so/arch/aarch64/rtld_start.S

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.



CVS commit: src/libexec/ld.elf_so/arch/aarch64

2018-02-04 Thread Nick Hudson
Module Name:src
Committed By:   skrll
Date:   Sun Feb  4 21:49:51 UTC 2018

Modified Files:
src/libexec/ld.elf_so/arch/aarch64: mdreloc.c rtld_start.S

Log Message:
Various fixes / changes from Ryo Shimizu / Toru Nishimura to make this
work.

_rtld_call_ifunc copied from other rela platforms by me - not tested in
any way.


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c
cvs rdiff -u -r1.1 -r1.2 src/libexec/ld.elf_so/arch/aarch64/rtld_start.S

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/libexec/ld.elf_so/arch/aarch64/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.6 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.7
--- src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.6	Mon Aug 28 06:59:25 2017
+++ src/libexec/ld.elf_so/arch/aarch64/mdreloc.c	Sun Feb  4 21:49:51 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: mdreloc.c,v 1.6 2017/08/28 06:59:25 nisimura Exp $ */
+/* $NetBSD: mdreloc.c,v 1.7 2018/02/04 21:49:51 skrll Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include 
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.6 2017/08/28 06:59:25 nisimura Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.7 2018/02/04 21:49:51 skrll Exp $");
 #endif /* not lint */
 
 #include 
@@ -43,6 +43,7 @@ __RCSID("$NetBSD: mdreloc.c,v 1.6 2017/0
 void _rtld_bind_start(void);
 void _rtld_relocate_nonplt_self(Elf_Dyn *, Elf_Addr);
 Elf_Addr _rtld_bind(const Obj_Entry *, Elf_Word);
+void *_rtld_tlsdesc(void *);
 
 /*
  * AARCH64 PLT looks like this;
@@ -81,23 +82,23 @@ _rtld_setup_pltgot(const Obj_Entry *obj)
 void
 _rtld_relocate_nonplt_self(Elf_Dyn *dynp, Elf_Addr relocbase)
 {
-	const Elf_Rel *rel = 0, *rellim;
-	Elf_Addr relsz = 0;
+	const Elf_Rela *rela = 0, *relalim;
+	Elf_Addr relasz = 0;
 	Elf_Addr *where;
 
 	for (; dynp->d_tag != DT_NULL; dynp++) {
 		switch (dynp->d_tag) {
-		case DT_REL:
-			rel = (const Elf_Rel *)(relocbase + dynp->d_un.d_ptr);
+		case DT_RELA:
+			rela = (const Elf_Rela *)(relocbase + dynp->d_un.d_ptr);
 			break;
-		case DT_RELSZ:
-			relsz = dynp->d_un.d_val;
+		case DT_RELASZ:
+			relasz = dynp->d_un.d_val;
 			break;
 		}
 	}
-	rellim = (const Elf_Rel *)((const uint8_t *)rel + relsz);
-	for (; rel < rellim; rel++) {
-		where = (Elf_Addr *)(relocbase + rel->r_offset);
+	relalim = (const Elf_Rela *)((const uint8_t *)rela + relasz);
+	for (; rela < relalim; rela++) {
+		where = (Elf_Addr *)(relocbase + rela->r_offset);
 		*where += (Elf_Addr)relocbase;
 	}
 }
@@ -117,8 +118,8 @@ _rtld_relocate_nonplt_objects(Obj_Entry 
 		where = (Elf_Addr *)(obj->relocbase + rela->r_offset);
 
 		switch (ELF_R_TYPE(rela->r_info)) {
-		case R_TYPE(ABS64):	/* word B + S + A */
-		case R_TYPE(GLOB_DAT):	/* word B + S */
+		case R_TYPE(ABS64):	/* word S + A */
+		case R_TYPE(GLOB_DAT):	/* word S + A */
 		case R_TLS_TYPE(TLS_DTPREL):
 		case R_TLS_TYPE(TLS_DTPMOD):
 		case R_TLS_TYPE(TLS_TPREL):
@@ -139,8 +140,8 @@ _rtld_relocate_nonplt_objects(Obj_Entry 
 		case R_TYPE(NONE):
 			break;
 
-		case R_TYPE(ABS64):	/* word B + S + A */
-		case R_TYPE(GLOB_DAT):	/* word B + S */
+		case R_TYPE(ABS64):	/* word S + A */
+		case R_TYPE(GLOB_DAT):	/* word S + A */
 			tmp = (Elf_Addr)defobj->relocbase + def->st_value +
 			rela->r_addend;
 			if (*where != tmp)
@@ -225,28 +226,61 @@ _rtld_relocate_plt_lazy(Obj_Entry *obj)
 	if (!obj->relocbase)
 		return 0;
 
-	for (const Elf_Rel *rel = obj->pltrel; rel < obj->pltrellim; rel++) {
-		Elf_Addr *where = (Elf_Addr *)(obj->relocbase + rel->r_offset);
+	for (const Elf_Rela *rela = obj->pltrela; rela < obj->pltrelalim; rela++) {
+		Elf_Addr *where = (Elf_Addr *)(obj->relocbase + rela->r_offset);
 
-		assert(ELF_R_TYPE(rel->r_info) == R_TYPE(JUMP_SLOT));
+		assert((ELF_R_TYPE(rela->r_info) == R_TYPE(JUMP_SLOT)) ||
+		(ELF_R_TYPE(rela->r_info) == R_TYPE(TLSDESC)));
 
-		/* Just relocate the GOT slots pointing into the PLT */
-		*where += (Elf_Addr)obj->relocbase;
-		rdbg(("fixup !main in %s --> %p", obj->path, (void *)*where));
+		switch (ELF_R_TYPE(rela->r_info)) {
+		case R_TYPE(JUMP_SLOT):
+			/* Just relocate the GOT slots pointing into the PLT */
+			*where += (Elf_Addr)obj->relocbase;
+			rdbg(("fixup !main in %s --> %p", obj->path, (void *)*where));
+			break;
+		case R_TYPE(TLSDESC):
+			assert(ELF_R_SYM(rela->r_info) == 0);	/* XXX */
+			if (ELF_R_SYM(rela->r_info) == 0) {
+where[0] = (Elf_Addr)_rtld_tlsdesc;
+where[1] = obj->tlsoffset + rela->r_addend + sizeof(struct tls_tcb);
+			}
+			break;
+		}
 	}
 
 	return 0;
 }
 
+void
+_rtld_call_ifunc(Obj_Entry *obj, sigset_t *mask, u_int cur_objgen)
+{
+	const Elf_Rela *rela;
+	Elf_Addr *where, target;
+
+	while (obj->ifunc_remaining > 0 && _rtld_objgen == cur_objgen) {
+		rela = obj->pltrelalim - obj->ifunc_remaining;
+		--obj->ifunc_remaining;
+		if (ELF_R_TYPE(rela->r_info) == R_TYPE(IRELATIVE)) {
+			where 

CVS commit: src/libexec/ld.elf_so/arch/aarch64

2017-08-28 Thread Tohru Nishimura
Module Name:src
Committed By:   nisimura
Date:   Mon Aug 28 06:59:26 UTC 2017

Modified Files:
src/libexec/ld.elf_so/arch/aarch64: mdreloc.c

Log Message:
explain AARCH64 PLT design


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.



CVS commit: src/libexec/ld.elf_so/arch/aarch64

2017-08-28 Thread Tohru Nishimura
Module Name:src
Committed By:   nisimura
Date:   Mon Aug 28 06:59:26 UTC 2017

Modified Files:
src/libexec/ld.elf_so/arch/aarch64: mdreloc.c

Log Message:
explain AARCH64 PLT design


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/libexec/ld.elf_so/arch/aarch64/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.5 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.6
--- src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.5	Wed Aug 23 09:17:48 2017
+++ src/libexec/ld.elf_so/arch/aarch64/mdreloc.c	Mon Aug 28 06:59:25 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: mdreloc.c,v 1.5 2017/08/23 09:17:48 nisimura Exp $ */
+/* $NetBSD: mdreloc.c,v 1.6 2017/08/28 06:59:25 nisimura Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include 
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.5 2017/08/23 09:17:48 nisimura Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.6 2017/08/28 06:59:25 nisimura Exp $");
 #endif /* not lint */
 
 #include 
@@ -44,9 +44,36 @@ void _rtld_bind_start(void);
 void _rtld_relocate_nonplt_self(Elf_Dyn *, Elf_Addr);
 Elf_Addr _rtld_bind(const Obj_Entry *, Elf_Word);
 
+/*
+ * AARCH64 PLT looks like this;
+ *
+ *	PLT HEADER <8 instructions>
+ *	PLT ENTRY #0 <4 instructions>
+ *	PLT ENTRY #1 <4 instructions>
+ *	.
+ *	.
+ *	PLT ENTRY #n <4 instructions>
+ *
+ * PLT HEADER
+ *	stp  x16, x30, [sp, #-16]!
+ *	adrp x16, (GOT+16)
+ *	ldr  x17, [x16, #PLT_GOT+0x10]
+ *	add  x16, x16, #PLT_GOT+0x10
+ *	br   x17
+ *	nop
+ *	nop
+ *	nop
+ *
+ * PLT ENTRY #n
+ *	adrp x16, PLTGOT + n * 8
+ *	ldr  x17, [x16, PLTGOT + n * 8]
+ *	add  x16, x16, :lo12:PLTGOT + n * 8
+ *	br   x17
+ */
 void
 _rtld_setup_pltgot(const Obj_Entry *obj)
 {
+
 	obj->pltgot[1] = (Elf_Addr) obj;
 	obj->pltgot[2] = (Elf_Addr) &_rtld_bind_start;
 }



CVS commit: src/libexec/ld.elf_so/arch/aarch64

2017-08-23 Thread Tohru Nishimura
Module Name:src
Committed By:   nisimura
Date:   Wed Aug 23 09:17:48 UTC 2017

Modified Files:
src/libexec/ld.elf_so/arch/aarch64: mdreloc.c

Log Message:
- avoid caddr_t. use Elf_Addr instead.
- iron out rdbg() errors.


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/libexec/ld.elf_so/arch/aarch64/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.4 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.5
--- src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.4	Thu Aug 10 19:03:25 2017
+++ src/libexec/ld.elf_so/arch/aarch64/mdreloc.c	Wed Aug 23 09:17:48 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: mdreloc.c,v 1.4 2017/08/10 19:03:25 joerg Exp $ */
+/* $NetBSD: mdreloc.c,v 1.5 2017/08/23 09:17:48 nisimura Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include 
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.4 2017/08/10 19:03:25 joerg Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.5 2017/08/23 09:17:48 nisimura Exp $");
 #endif /* not lint */
 
 #include 
@@ -42,7 +42,7 @@ __RCSID("$NetBSD: mdreloc.c,v 1.4 2017/0
 
 void _rtld_bind_start(void);
 void _rtld_relocate_nonplt_self(Elf_Dyn *, Elf_Addr);
-caddr_t _rtld_bind(const Obj_Entry *, Elf_Word);
+Elf_Addr _rtld_bind(const Obj_Entry *, Elf_Word);
 
 void
 _rtld_setup_pltgot(const Obj_Entry *obj)
@@ -84,11 +84,10 @@ _rtld_relocate_nonplt_objects(Obj_Entry 
 
 	for (const Elf_Rela *rela = obj->rela; rela < obj->relalim; rela++) {
 		Elf_Addr*where;
-		unsigned long	 symnum;
-		Elf_Addr	 addend;
+		Elf_Addr	tmp;
+		unsigned long	symnum;
 
 		where = (Elf_Addr *)(obj->relocbase + rela->r_offset);
-		addend = rela->r_addend;
 
 		switch (ELF_R_TYPE(rela->r_info)) {
 		case R_TYPE(ABS64):	/* word B + S + A */
@@ -115,17 +114,19 @@ _rtld_relocate_nonplt_objects(Obj_Entry 
 
 		case R_TYPE(ABS64):	/* word B + S + A */
 		case R_TYPE(GLOB_DAT):	/* word B + S */
-			*where = addend + (Elf_Addr)defobj->relocbase +
-			def->st_value;
+			tmp = (Elf_Addr)defobj->relocbase + def->st_value +
+			rela->r_addend;
+			if (*where != tmp)
+*where = tmp;
 			rdbg(("ABS64/GLOB_DAT %s in %s --> %p @ %p in %s",
 			obj->strtab + obj->symtab[symnum].st_name,
 			obj->path, (void *)tmp, where, defobj->path));
 			break;
 
 		case R_TYPE(RELATIVE):	/* word B + A */
-			*where = addend + (Elf_Addr)obj->relocbase;
+			*where = (Elf_Addr)(obj->relocbase + rela->r_addend);
 			rdbg(("RELATIVE in %s --> %p", obj->path,
-			(void *)tmp));
+			(void *)*where));
 			break;
 
 		case R_TYPE(COPY):
@@ -145,11 +146,11 @@ _rtld_relocate_nonplt_objects(Obj_Entry 
 			break;
 
 		case R_TLS_TYPE(TLS_DTPREL):
-			*where = addend + (Elf_Addr)(def->st_value);
+			*where = (Elf_Addr)(def->st_value + rela->r_addend);
 
-			rdbg(("TLS_DTPOFF32 %s in %s --> %p",
+			rdbg(("TLS_DTPREL %s in %s --> %p",
 			obj->strtab + obj->symtab[symnum].st_name,
-			obj->path, (void *)tmp));
+			obj->path, (void *)*where));
 
 			break;
 		case R_TLS_TYPE(TLS_DTPMOD):
@@ -157,7 +158,7 @@ _rtld_relocate_nonplt_objects(Obj_Entry 
 
 			rdbg(("TLS_DTPMOD %s in %s --> %p",
 			obj->strtab + obj->symtab[symnum].st_name,
-			obj->path, (void *)tmp));
+			obj->path, (void *)*where));
 
 			break;
 
@@ -168,17 +169,18 @@ _rtld_relocate_nonplt_objects(Obj_Entry 
 
 			*where = (Elf_Addr)def->st_value + defobj->tlsoffset +
 			sizeof(struct tls_tcb);
-			rdbg(("TLS_TPOFF32 %s in %s --> %p",
+			rdbg(("TLS_TPREL %s in %s --> %p in %s",
 			obj->strtab + obj->symtab[symnum].st_name,
-			obj->path, (void *)tmp));
+			obj->path, (void *)*where, defobj->path));
 			break;
 
 		default:
 			rdbg(("sym = %lu, type = %lu, offset = %p, "
-			"contents = %p, symbol = %s",
+			"addend = %p, contents = %p, symbol = %s",
 			(u_long)ELF_R_SYM(rela->r_info),
 			(u_long)ELF_R_TYPE(rela->r_info),
-			(void *)rela->r_offset, *where,
+			(void *)rela->r_offset, (void *)rela->r_addend,
+			(void *)*where,
 			obj->strtab + obj->symtab[symnum].st_name));
 			_rtld_error("%s: Unsupported relocation type %ld "
 			"in non-PLT relocations",
@@ -244,7 +246,7 @@ _rtld_relocate_plt_object(const Obj_Entr
 	return 0;
 }
 
-caddr_t
+Elf_Addr
 _rtld_bind(const Obj_Entry *obj, Elf_Word reloff)
 {
 	const Elf_Rel *rel = obj->pltrel + reloff;
@@ -256,7 +258,7 @@ _rtld_bind(const Obj_Entry *obj, Elf_Wor
 		_rtld_die();
 	_rtld_shared_exit();
 
-	return (caddr_t)new_value;
+	return new_value;
 }
 int
 _rtld_relocate_plt_objects(const Obj_Entry *obj)



CVS commit: src/libexec/ld.elf_so/arch/aarch64

2017-08-23 Thread Tohru Nishimura
Module Name:src
Committed By:   nisimura
Date:   Wed Aug 23 09:17:48 UTC 2017

Modified Files:
src/libexec/ld.elf_so/arch/aarch64: mdreloc.c

Log Message:
- avoid caddr_t. use Elf_Addr instead.
- iron out rdbg() errors.


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.