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

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

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

Log Message:
R_ARM_TLS_TPOFF32 needs to adjust the existing value, not blindly
overwrite it.


To generate a diff of this commit:
cvs rdiff -u -r1.44 -r1.45 src/libexec/ld.elf_so/arch/arm/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/arm/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/arm/mdreloc.c:1.44 src/libexec/ld.elf_so/arch/arm/mdreloc.c:1.45
--- src/libexec/ld.elf_so/arch/arm/mdreloc.c:1.44	Tue Apr  3 21:10:27 2018
+++ src/libexec/ld.elf_so/arch/arm/mdreloc.c	Tue Jun 16 21:02:20 2020
@@ -1,8 +1,8 @@
-/*	$NetBSD: mdreloc.c,v 1.44 2018/04/03 21:10:27 joerg Exp $	*/
+/*	$NetBSD: mdreloc.c,v 1.45 2020/06/16 21:02:20 joerg Exp $	*/
 
 #include 
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.44 2018/04/03 21:10:27 joerg Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.45 2020/06/16 21:02:20 joerg Exp $");
 #endif /* not lint */
 
 #include 
@@ -232,8 +232,11 @@ _rtld_relocate_nonplt_objects(Obj_Entry 
 			_rtld_tls_offset_allocate(obj))
 return -1;
 
-			tmp = (Elf_Addr)def->st_value + defobj->tlsoffset +
-			sizeof(struct tls_tcb);
+			if (__predict_true(RELOC_ALIGNED_P(where)))
+tmp = *where;
+			else
+tmp = load_ptr(where);
+			tmp += (Elf_Addr)def->st_value + defobj->tlsoffset + sizeof(struct tls_tcb);
 			if (__predict_true(RELOC_ALIGNED_P(where)))
 *where = tmp;
 			else



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

2017-06-20 Thread Joerg Sonnenberger
Module Name:src
Committed By:   joerg
Date:   Tue Jun 20 12:41:49 UTC 2017

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

Log Message:
Expand symnum, GCC's uninitialized used tracking is too imprecise.


To generate a diff of this commit:
cvs rdiff -u -r1.40 -r1.41 src/libexec/ld.elf_so/arch/arm/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/arm/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/arm/mdreloc.c:1.40 src/libexec/ld.elf_so/arch/arm/mdreloc.c:1.41
--- src/libexec/ld.elf_so/arch/arm/mdreloc.c:1.40	Tue Jun 20 11:01:18 2017
+++ src/libexec/ld.elf_so/arch/arm/mdreloc.c	Tue Jun 20 12:41:49 2017
@@ -1,8 +1,8 @@
-/*	$NetBSD: mdreloc.c,v 1.40 2017/06/20 11:01:18 joerg Exp $	*/
+/*	$NetBSD: mdreloc.c,v 1.41 2017/06/20 12:41:49 joerg Exp $	*/
 
 #include 
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.40 2017/06/20 11:01:18 joerg Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.41 2017/06/20 12:41:49 joerg Exp $");
 #endif /* not lint */
 
 #include 
@@ -128,15 +128,17 @@ _rtld_relocate_nonplt_objects(Obj_Entry 
 "%s: R_ARM_PC24 relocation @ %p to %s failed "
 "(displacement %ld (%#lx) out of range)",
 obj->path, where,
-obj->strtab + obj->symtab[symnum].st_name,
+obj->strtab + obj->symtab[
+ELF_R_SYM(rel->r_info)].st_name,
 (long) tmp, (long) tmp);
 return -1;
 			}
 			tmp >>= 2;
 			*where = (*where & 0xff00) | (tmp & 0x00ff);
 			rdbg(("PC24 %s in %s --> %p @ %p in %s",
-			obj->strtab + obj->symtab[symnum].st_name,
-			obj->path, (void *)*where, where, defobj->path));
+			obj->strtab + obj->symtab[ELF_R_SYM(rel->r_info)]
+			.st_name, obj->path, (void *)*where, where,
+			defobj->path));
 			break;
 		}
 #endif
@@ -160,8 +162,9 @@ _rtld_relocate_nonplt_objects(Obj_Entry 
 store_ptr(where, tmp);
 			}
 			rdbg(("ABS32/GLOB_DAT %s in %s --> %p @ %p in %s",
-			obj->strtab + obj->symtab[symnum].st_name,
-			obj->path, (void *)tmp, where, defobj->path));
+			obj->strtab + obj->symtab[ELF_R_SYM(rel->r_info)]
+			.st_name, obj->path, (void *)tmp, where,
+			defobj->path));
 			break;
 
 		case R_TYPE(RELATIVE):	/* word32 B + A */
@@ -201,8 +204,8 @@ _rtld_relocate_nonplt_objects(Obj_Entry 
 store_ptr(where, tmp);
 
 			rdbg(("TLS_DTPOFF32 %s in %s --> %p",
-			obj->strtab + obj->symtab[symnum].st_name,
-			obj->path, (void *)tmp));
+			obj->strtab + obj->symtab[ELF_R_SYM(rel->r_info)]
+			.st_name, obj->path, (void *)tmp));
 
 			break;
 		case R_TYPE(TLS_DTPMOD32):
@@ -213,8 +216,8 @@ _rtld_relocate_nonplt_objects(Obj_Entry 
 store_ptr(where, tmp);
 
 			rdbg(("TLS_DTPMOD32 %s in %s --> %p",
-			obj->strtab + obj->symtab[symnum].st_name,
-			obj->path, (void *)tmp));
+			obj->strtab + obj->symtab[ELF_R_SYM(rel->r_info)]
+			.st_name, obj->path, (void *)tmp));
 
 			break;
 
@@ -230,8 +233,8 @@ _rtld_relocate_nonplt_objects(Obj_Entry 
 			else
 store_ptr(where, tmp);
 			rdbg(("TLS_TPOFF32 %s in %s --> %p",
-			obj->strtab + obj->symtab[symnum].st_name,
-			obj->path, (void *)tmp));
+			obj->strtab + obj->symtab[ELF_R_SYM(rel->r_info)]
+			.st_name, obj->path, (void *)tmp));
 			break;
 
 		default:



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

2017-06-20 Thread Joerg Sonnenberger
Module Name:src
Committed By:   joerg
Date:   Tue Jun 20 11:01:18 UTC 2017

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

Log Message:
Drop symbol number from default branch diagnostic, it isn't set at this
point and most likely not valid either.


To generate a diff of this commit:
cvs rdiff -u -r1.39 -r1.40 src/libexec/ld.elf_so/arch/arm/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/arm/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/arm/mdreloc.c:1.39 src/libexec/ld.elf_so/arch/arm/mdreloc.c:1.40
--- src/libexec/ld.elf_so/arch/arm/mdreloc.c:1.39	Mon Jun 19 11:57:01 2017
+++ src/libexec/ld.elf_so/arch/arm/mdreloc.c	Tue Jun 20 11:01:18 2017
@@ -1,8 +1,8 @@
-/*	$NetBSD: mdreloc.c,v 1.39 2017/06/19 11:57:01 joerg Exp $	*/
+/*	$NetBSD: mdreloc.c,v 1.40 2017/06/20 11:01:18 joerg Exp $	*/
 
 #include 
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.39 2017/06/19 11:57:01 joerg Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.40 2017/06/20 11:01:18 joerg Exp $");
 #endif /* not lint */
 
 #include 
@@ -236,11 +236,10 @@ _rtld_relocate_nonplt_objects(Obj_Entry 
 
 		default:
 			rdbg(("sym = %lu, type = %lu, offset = %p, "
-			"contents = %p, symbol = %s",
+			"contents = %p",
 			(u_long)ELF_R_SYM(rel->r_info),
 			(u_long)ELF_R_TYPE(rel->r_info),
-			(void *)rel->r_offset, (void *)load_ptr(where),
-			obj->strtab + obj->symtab[symnum].st_name));
+			(void *)rel->r_offset, (void *)load_ptr(where)));
 			_rtld_error("%s: Unsupported relocation type %ld "
 			"in non-PLT relocations",
 			obj->path, (u_long) ELF_R_TYPE(rel->r_info));



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

2013-12-02 Thread Matt Thomas
Module Name:src
Committed By:   matt
Date:   Tue Dec  3 00:19:56 UTC 2013

Modified Files:
src/libexec/ld.elf_so/arch/arm: rtld_start.S

Log Message:
Don't use GOT relocations.  Use PC relative for the GOT and GOTOFF for
_DYNAMIC.  Make thumb friendly.


To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/libexec/ld.elf_so/arch/arm/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/arm/rtld_start.S
diff -u src/libexec/ld.elf_so/arch/arm/rtld_start.S:1.11 src/libexec/ld.elf_so/arch/arm/rtld_start.S:1.12
--- src/libexec/ld.elf_so/arch/arm/rtld_start.S:1.11	Mon Aug 13 02:53:25 2012
+++ src/libexec/ld.elf_so/arch/arm/rtld_start.S	Tue Dec  3 00:19:56 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: rtld_start.S,v 1.11 2012/08/13 02:53:25 matt Exp $	*/
+/*	$NetBSD: rtld_start.S,v 1.12 2013/12/03 00:19:56 matt Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2002 The NetBSD Foundation, Inc.
@@ -31,55 +31,51 @@
 
 #include 
 
-RCSID("$NetBSD: rtld_start.S,v 1.11 2012/08/13 02:53:25 matt Exp $")
+RCSID("$NetBSD: rtld_start.S,v 1.12 2013/12/03 00:19:56 matt Exp $")
 
-	.text
-	.align	0
-	.globl	_rtld_start
-	.type	_rtld_start,%function
-_rtld_start:
+ENTRY_NP(_rtld_start)
 	sub	sp, sp, #8		/* make room for obj_main & exit proc */
-	mov	r4, r0			/* save ps_strings */
-
-	ldr	sl, .L2
-	ldr	r5, .L2+4
-	ldr	r0, .L2+8
-.L1:
-	add	sl, pc, sl
-	ldr	r5, [sl, r5]
-	ldr	r0, [sl, r0]
+	movs	r4, r0			/* save ps_strings */
 
-	sub	r1, sl, r5		/* relocbase */
-	add	r0, r1, r0		/* &_DYNAMIC */
+	ldr	r6, .Lgot
+	ldr	r5, .Ldynamic
+	add	r6, r6, pc		/* r6 = &GOT[0]; pc = &LPIC1; */
+	adds	r0, r6, r5		/* arg0 = &_DYNAMIC */
+.LPIC1:
+	ldr	r5, [r6]		/* GOT[0] = &_DYNAMIC */
+	subs	r5, r0, r5		/* relocbase = GOT[0] - &_DYNAMIC */
+	movs	r1, r5			/* arg1 = relocabase */
 	bl	_rtld_relocate_nonplt_self
 
-	sub	r1, sl, r5		/* relocbase */
+	movs	r1, r5			/* relocbase */
 	mov	r0, sp			/* sp */
 	bl	_rtld			/* call the shared loader */
-	mov	r3, r0			/* save entry point */
+	movs	r3, r0			/* save entry point */
 
+#ifdef __thumb__
+	ldr	r2, [sp, #0]		/* pop r2 = cleanup */
+	ldr	r1, [sp, #4]		/* pop r1 = obj_main */
+	add	sp, sp, #8
+#else
 	ldr	r2, [sp], #4		/* pop r2 = cleanup */
 	ldr	r1, [sp], #4		/* pop r1 = obj_main */
-	mov	r0, r4			/* restore ps_strings */
-#ifdef _ARM_ARCH_4T
-	bx	r3			/* jump to the entry point */
-#else
-	mov	pc, r3			/* jump to the entry point */
 #endif
-.L2:
-	.word	_GLOBAL_OFFSET_TABLE_ - (.L1+8)
-	.word	_GLOBAL_OFFSET_TABLE_(GOT)
-	.word	_DYNAMIC(GOT)
+	movs	r0, r4			/* restore ps_strings */
+	RETr(r3)
 
 	.align	0
-	.globl	_rtld_bind_start
-	.type	_rtld_bind_start,%function
+.Lgot:
+	.word	_GLOBAL_OFFSET_TABLE_ - .LPIC1
+.Ldynamic:
+	.word	_DYNAMIC(GOTOFF)
+END(_rtld_start)
+
 /*
  *	stack[0] = RA
  *	ip = &GOT[n+3]
  *	lr = &GOT[2]
  */
-_rtld_bind_start:
+ARM_ENTRY_NP(_rtld_bind_start)
 	stmdb	sp!,{r0-r4,sl,fp}	/* 8 byte aligned (lr already saved) */
 
 	sub	r1, ip, lr		/* r1 = 4 * (n + 1) */
@@ -95,9 +91,5 @@ _rtld_bind_start:
 	mov	ip, r0			/* save new address */
 
 	ldmia	sp!,{r0-r4,sl,fp,lr}	/* restore the stack */
-#ifdef _ARM_ARCH_4T
-	bx	ip			/* jump to the new address */
-#else
-	mov	pc, ip			/* jump to the new address */
-#endif
-
+	RETr(ip)			/* jump to the new address */
+END(_rtld_bind_start)



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

2013-05-03 Thread Nick Hudson
Module Name:src
Committed By:   skrll
Date:   Fri May  3 09:37:17 UTC 2013

Modified Files:
src/libexec/ld.elf_so/arch/arm: Makefile.inc

Log Message:
Provide a default LDELFSO_MACHINE_ARCH. hi matt!

atf-run works again - the init/fini stuff didn't get run otherwise.


To generate a diff of this commit:
cvs rdiff -u -r1.17 -r1.18 src/libexec/ld.elf_so/arch/arm/Makefile.inc

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/arm/Makefile.inc
diff -u src/libexec/ld.elf_so/arch/arm/Makefile.inc:1.17 src/libexec/ld.elf_so/arch/arm/Makefile.inc:1.18
--- src/libexec/ld.elf_so/arch/arm/Makefile.inc:1.17	Sat Apr 27 06:25:03 2013
+++ src/libexec/ld.elf_so/arch/arm/Makefile.inc	Fri May  3 09:37:17 2013
@@ -1,4 +1,6 @@
-#	$NetBSD: Makefile.inc,v 1.17 2013/04/27 06:25:03 matt Exp $
+#	$NetBSD: Makefile.inc,v 1.18 2013/05/03 09:37:17 skrll Exp $
+
+LDELFSO_MACHINE_ARCH?=	${MACHINE_ARCH}
 
 SRCS+=		rtld_start.S mdreloc.c
 



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

2013-04-26 Thread Matt Thomas
Module Name:src
Committed By:   matt
Date:   Sat Apr 27 06:25:03 UTC 2013

Modified Files:
src/libexec/ld.elf_so/arch/arm: Makefile.inc

Log Message:
Changes for MKCOMPAT for earm.


To generate a diff of this commit:
cvs rdiff -u -r1.16 -r1.17 src/libexec/ld.elf_so/arch/arm/Makefile.inc

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/arm/Makefile.inc
diff -u src/libexec/ld.elf_so/arch/arm/Makefile.inc:1.16 src/libexec/ld.elf_so/arch/arm/Makefile.inc:1.17
--- src/libexec/ld.elf_so/arch/arm/Makefile.inc:1.16	Wed Apr 24 22:37:20 2013
+++ src/libexec/ld.elf_so/arch/arm/Makefile.inc	Sat Apr 27 06:25:03 2013
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile.inc,v 1.16 2013/04/24 22:37:20 matt Exp $
+#	$NetBSD: Makefile.inc,v 1.17 2013/04/27 06:25:03 matt Exp $
 
 SRCS+=		rtld_start.S mdreloc.c
 
@@ -6,7 +6,7 @@ SRCS+=		rtld_start.S mdreloc.c
 CPPFLAGS+=	-fpic
 
 CPPFLAGS+=	-DELFSIZE=32
-.if !empty(MACHINE_ARCH:Mearm*)
+.if !empty(LDELFSO_MACHINE_ARCH:Mearm*)
 CPPFLAGS+=	-DHAVE_INITFINI_ARRAY
 SRCS+=		find_exidx.c
 .endif



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

2013-04-25 Thread Matt Thomas
Module Name:src
Committed By:   matt
Date:   Thu Apr 25 13:15:26 UTC 2013

Modified Files:
src/libexec/ld.elf_so/arch/arm: find_exidx.c

Log Message:
Use relocbase, not mapbase.


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/libexec/ld.elf_so/arch/arm/find_exidx.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/arm/find_exidx.c
diff -u src/libexec/ld.elf_so/arch/arm/find_exidx.c:1.1 src/libexec/ld.elf_so/arch/arm/find_exidx.c:1.2
--- src/libexec/ld.elf_so/arch/arm/find_exidx.c:1.1	Wed Apr 24 22:32:29 2013
+++ src/libexec/ld.elf_so/arch/arm/find_exidx.c	Thu Apr 25 13:15:26 2013
@@ -29,7 +29,7 @@
 
 #include 
 #ifndef lint
-__RCSID("$NetBSD: find_exidx.c,v 1.1 2013/04/24 22:32:29 matt Exp $");
+__RCSID("$NetBSD: find_exidx.c,v 1.2 2013/04/25 13:15:26 matt Exp $");
 #endif /* not lint */
 
 #include "debug.h"
@@ -62,7 +62,7 @@ __gnu_Unwind_Find_exidx(_Unwind_Ptr pc, 
 	 * need to see if the address matches a PT_LOAD section.
 	 */
 	if (obj != NULL && obj->exidx_start != NULL) {
-		va -= (vaddr_t)obj->mapbase;
+		va -= (vaddr_t)obj->relocbase;
 		const Elf_Phdr *ph = obj->phdr;
 		const Elf_Phdr * const phlimit = ph + obj->phsize / sizeof(*ph);
 		for (; ph < phlimit; ph++) {



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

2013-04-24 Thread Matt Thomas
Module Name:src
Committed By:   matt
Date:   Wed Apr 24 22:32:29 UTC 2013

Added Files:
src/libexec/ld.elf_so/arch/arm: find_exidx.c

Log Message:
Add a ld.elf_so internals version of __gnu_Unwind_Find_exidx for that the
libgcc EHABI can find the exception tables for a supplied PC.


To generate a diff of this commit:
cvs rdiff -u -r0 -r1.1 src/libexec/ld.elf_so/arch/arm/find_exidx.c

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

Added files:

Index: src/libexec/ld.elf_so/arch/arm/find_exidx.c
diff -u /dev/null src/libexec/ld.elf_so/arch/arm/find_exidx.c:1.1
--- /dev/null	Wed Apr 24 22:32:30 2013
+++ src/libexec/ld.elf_so/arch/arm/find_exidx.c	Wed Apr 24 22:32:29 2013
@@ -0,0 +1,86 @@
+/*-
+ * Copyright (c) 2013 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Matt Thomas of 3am Software Foundry.
+ *
+ * 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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: find_exidx.c,v 1.1 2013/04/24 22:32:29 matt Exp $");
+#endif /* not lint */
+
+#include "debug.h"
+#include "rtld.h"
+
+_Unwind_Ptr
+__gnu_Unwind_Find_exidx(_Unwind_Ptr pc, int * pcount)
+{
+	const Obj_Entry *obj;
+	_Unwind_Ptr start = NULL;
+	int count = 0;
+
+	dbg(("__gnu_Unwind_Find_exidx"));
+
+	_rtld_shared_enter();
+
+	vaddr_t va = (vaddr_t)pc; 
+	for (obj = _rtld_objlist; obj != NULL; obj = obj->next) {
+		/*
+		 * If the address we are looking for is inside this object,
+		 * we've found the object to inspect.
+		 */
+		if ((vaddr_t)obj->mapbase <= va
+		&& va < (vaddr_t)obj->mapbase + obj->mapsize)
+			break;
+	}
+
+	/*
+	 * If we found an object and it has some exception data, we 
+	 * need to see if the address matches a PT_LOAD section.
+	 */
+	if (obj != NULL && obj->exidx_start != NULL) {
+		va -= (vaddr_t)obj->mapbase;
+		const Elf_Phdr *ph = obj->phdr;
+		const Elf_Phdr * const phlimit = ph + obj->phsize / sizeof(*ph);
+		for (; ph < phlimit; ph++) {
+			if (ph->p_type == PT_LOAD
+			&& ph->p_vaddr <= va
+			&& va < ph->p_vaddr + ph->p_memsz) {
+count = obj->exidx_sz / 8;
+start = obj->exidx_start;
+break;
+			}
+		}
+	}
+
+	_rtld_shared_exit();
+
+	/*
+	 * deal with the return values.
+	 */
+	*pcount = count;
+	return start;
+}



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

2013-01-22 Thread Matt Thomas
Module Name:src
Committed By:   matt
Date:   Wed Jan 23 02:31:54 UTC 2013

Modified Files:
src/libexec/ld.elf_so/arch/arm: Makefile.inc

Log Message:
Handle CPUFLAGS being empty


To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/libexec/ld.elf_so/arch/arm/Makefile.inc

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/arm/Makefile.inc
diff -u src/libexec/ld.elf_so/arch/arm/Makefile.inc:1.14 src/libexec/ld.elf_so/arch/arm/Makefile.inc:1.15
--- src/libexec/ld.elf_so/arch/arm/Makefile.inc:1.14	Wed Jan 23 02:18:50 2013
+++ src/libexec/ld.elf_so/arch/arm/Makefile.inc	Wed Jan 23 02:31:54 2013
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile.inc,v 1.14 2013/01/23 02:18:50 matt Exp $
+#	$NetBSD: Makefile.inc,v 1.15 2013/01/23 02:31:54 matt Exp $
 
 SRCS+=		rtld_start.S mdreloc.c
 
@@ -7,7 +7,7 @@ CPPFLAGS+=	-fpic
 
 CPPFLAGS+=	-DELFSIZE=32
 .if ${MACHINE_ARCH} == "earm" || ${MACHINE_ARCH} == "earmeb" \
-|| (!empty(CFLAGS) && ${CFLAGS:Mabi=aapcs} != "")
+|| (!empty(CPUFLAGS) && ${CPUFLAGS:M-mabi=aapcs*} != "")
 CPPFLAGS+=	-DHAVE_INITFINI_ARRAY
 .endif
 



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

2013-01-22 Thread Matt Thomas
Module Name:src
Committed By:   matt
Date:   Wed Jan 23 02:18:50 UTC 2013

Modified Files:
src/libexec/ld.elf_so/arch/arm: Makefile.inc

Log Message:
Make sure CFLAGS is not empty.


To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 src/libexec/ld.elf_so/arch/arm/Makefile.inc

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/arm/Makefile.inc
diff -u src/libexec/ld.elf_so/arch/arm/Makefile.inc:1.13 src/libexec/ld.elf_so/arch/arm/Makefile.inc:1.14
--- src/libexec/ld.elf_so/arch/arm/Makefile.inc:1.13	Tue Jan 22 22:49:09 2013
+++ src/libexec/ld.elf_so/arch/arm/Makefile.inc	Wed Jan 23 02:18:50 2013
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile.inc,v 1.13 2013/01/22 22:49:09 matt Exp $
+#	$NetBSD: Makefile.inc,v 1.14 2013/01/23 02:18:50 matt Exp $
 
 SRCS+=		rtld_start.S mdreloc.c
 
@@ -6,8 +6,8 @@ SRCS+=		rtld_start.S mdreloc.c
 CPPFLAGS+=	-fpic
 
 CPPFLAGS+=	-DELFSIZE=32
-.if ${MACHINE_ARCH} == "earm" || ${MACHINE_ARCH} == "earmeb" || \
-  ${CFLAGS:Mabi=aapcs} != ""
+.if ${MACHINE_ARCH} == "earm" || ${MACHINE_ARCH} == "earmeb" \
+|| (!empty(CFLAGS) && ${CFLAGS:Mabi=aapcs} != "")
 CPPFLAGS+=	-DHAVE_INITFINI_ARRAY
 .endif
 



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

2013-01-22 Thread Matt Thomas
Module Name:src
Committed By:   matt
Date:   Tue Jan 22 22:49:09 UTC 2013

Modified Files:
src/libexec/ld.elf_so/arch/arm: Makefile.inc

Log Message:
If you are using aapcs, you must be using INITFINI


To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/libexec/ld.elf_so/arch/arm/Makefile.inc

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/arm/Makefile.inc
diff -u src/libexec/ld.elf_so/arch/arm/Makefile.inc:1.12 src/libexec/ld.elf_so/arch/arm/Makefile.inc:1.13
--- src/libexec/ld.elf_so/arch/arm/Makefile.inc:1.12	Wed Aug 15 03:46:07 2012
+++ src/libexec/ld.elf_so/arch/arm/Makefile.inc	Tue Jan 22 22:49:09 2013
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile.inc,v 1.12 2012/08/15 03:46:07 matt Exp $
+#	$NetBSD: Makefile.inc,v 1.13 2013/01/22 22:49:09 matt Exp $
 
 SRCS+=		rtld_start.S mdreloc.c
 
@@ -6,7 +6,8 @@ SRCS+=		rtld_start.S mdreloc.c
 CPPFLAGS+=	-fpic
 
 CPPFLAGS+=	-DELFSIZE=32
-.if ${MACHINE_ARCH} == "earm" || ${MACHINE_ARCH} == "earmeb"
+.if ${MACHINE_ARCH} == "earm" || ${MACHINE_ARCH} == "earmeb" || \
+  ${CFLAGS:Mabi=aapcs} != ""
 CPPFLAGS+=	-DHAVE_INITFINI_ARRAY
 .endif
 



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

2012-08-12 Thread Matt Thomas
Module Name:src
Committed By:   matt
Date:   Mon Aug 13 02:53:25 UTC 2012

Modified Files:
src/libexec/ld.elf_so/arch/arm: rtld_start.S

Log Message:
Add a comment for EABI.  Use "pop" instructions to save one instruction.


To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/libexec/ld.elf_so/arch/arm/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/arm/rtld_start.S
diff -u src/libexec/ld.elf_so/arch/arm/rtld_start.S:1.10 src/libexec/ld.elf_so/arch/arm/rtld_start.S:1.11
--- src/libexec/ld.elf_so/arch/arm/rtld_start.S:1.10	Wed Nov 11 14:15:41 2009
+++ src/libexec/ld.elf_so/arch/arm/rtld_start.S	Mon Aug 13 02:53:25 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: rtld_start.S,v 1.10 2009/11/11 14:15:41 skrll Exp $	*/
+/*	$NetBSD: rtld_start.S,v 1.11 2012/08/13 02:53:25 matt Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2002 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include 
 
-RCSID("$NetBSD: rtld_start.S,v 1.10 2009/11/11 14:15:41 skrll Exp $")
+RCSID("$NetBSD: rtld_start.S,v 1.11 2012/08/13 02:53:25 matt Exp $")
 
 	.text
 	.align	0
@@ -58,9 +58,8 @@ _rtld_start:
 	bl	_rtld			/* call the shared loader */
 	mov	r3, r0			/* save entry point */
 
-	ldr	r2, [sp, #0]		/* r2 = cleanup */
-	ldr	r1, [sp, #4]		/* r1 = obj_main */
-	add	sp, sp, #8		/* restore stack */
+	ldr	r2, [sp], #4		/* pop r2 = cleanup */
+	ldr	r1, [sp], #4		/* pop r1 = obj_main */
 	mov	r0, r4			/* restore ps_strings */
 #ifdef _ARM_ARCH_4T
 	bx	r3			/* jump to the entry point */
@@ -81,7 +80,7 @@ _rtld_start:
  *	lr = &GOT[2]
  */
 _rtld_bind_start:
-	stmdb	sp!,{r0-r4,sl,fp}
+	stmdb	sp!,{r0-r4,sl,fp}	/* 8 byte aligned (lr already saved) */
 
 	sub	r1, ip, lr		/* r1 = 4 * (n + 1) */
 	sub	r1, r1, #4		/* r1 = 4 * n */



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

2011-04-12 Thread Matt Thomas
Module Name:src
Committed By:   matt
Date:   Tue Apr 12 16:40:04 UTC 2011

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

Log Message:
Add support for TLS relocations.
>From Joerg Sonnenberger


To generate a diff of this commit:
cvs rdiff -u -r1.35 -r1.36 src/libexec/ld.elf_so/arch/arm/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/arm/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/arm/mdreloc.c:1.35 src/libexec/ld.elf_so/arch/arm/mdreloc.c:1.36
--- src/libexec/ld.elf_so/arch/arm/mdreloc.c:1.35	Fri Mar 25 18:07:05 2011
+++ src/libexec/ld.elf_so/arch/arm/mdreloc.c	Tue Apr 12 16:40:04 2011
@@ -1,8 +1,8 @@
-/*	$NetBSD: mdreloc.c,v 1.35 2011/03/25 18:07:05 joerg Exp $	*/
+/*	$NetBSD: mdreloc.c,v 1.36 2011/04/12 16:40:04 matt Exp $	*/
 
 #include 
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.35 2011/03/25 18:07:05 joerg Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.36 2011/04/12 16:40:04 matt Exp $");
 #endif /* not lint */
 
 #include 
@@ -179,6 +179,61 @@
 			rdbg(("COPY (avoid in main)"));
 			break;
 
+#ifdef __HAVE_TLS_VARIANT_I
+		case R_TYPE(TLS_DTPOFF32):
+			def = _rtld_find_symdef(symnum, obj, &defobj, false);
+			if (def == NULL)
+return -1;
+
+			tmp = (Elf_Addr)(def->st_value);
+			if (__predict_true(RELOC_ALIGNED_P(where)))
+*where = tmp;
+			else
+store_ptr(where, tmp);
+
+			rdbg(("TLS_DTPOFF32 %s in %s --> %p",
+			obj->strtab + obj->symtab[symnum].st_name,
+			obj->path, (void *)tmp));
+
+			break;
+		case R_TYPE(TLS_DTPMOD32):
+			def = _rtld_find_symdef(symnum, obj, &defobj, false);
+			if (def == NULL)
+return -1;
+
+			tmp = (Elf_Addr)(defobj->tlsindex);
+			if (__predict_true(RELOC_ALIGNED_P(where)))
+*where = tmp;
+			else
+store_ptr(where, tmp);
+
+			rdbg(("TLS_DTPMOD32 %s in %s --> %p",
+			obj->strtab + obj->symtab[symnum].st_name,
+			obj->path, (void *)tmp));
+
+			break;
+
+		case R_TYPE(TLS_TPOFF32):
+			def = _rtld_find_symdef(symnum, obj, &defobj, false);
+			if (def == NULL)
+return -1;
+
+			if (!defobj->tls_done &&
+			_rtld_tls_offset_allocate(obj))
+return -1;
+
+			tmp = (Elf_Addr)def->st_value + defobj->tlsoffset +
+			sizeof(struct tls_tcb);
+			if (__predict_true(RELOC_ALIGNED_P(where)))
+*where = tmp;
+			else
+store_ptr(where, tmp);
+			rdbg(("TLS_TPOFF32 %s in %s --> %p",
+			obj->strtab + obj->symtab[symnum].st_name,
+			obj->path, (void *)tmp));
+			break;
+#endif /* __HAVE_TLS_VARIANT_I */
+
 		default:
 			rdbg(("sym = %lu, type = %lu, offset = %p, "
 			"contents = %p, symbol = %s",



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

2010-01-14 Thread Nick Hudson
Module Name:src
Committed By:   skrll
Date:   Thu Jan 14 12:12:07 UTC 2010

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

Log Message:
Make DEBUG build compile.


To generate a diff of this commit:
cvs rdiff -u -r1.32 -r1.33 src/libexec/ld.elf_so/arch/arm/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/arm/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/arm/mdreloc.c:1.32 src/libexec/ld.elf_so/arch/arm/mdreloc.c:1.33
--- src/libexec/ld.elf_so/arch/arm/mdreloc.c:1.32	Thu Jan 14 11:57:06 2010
+++ src/libexec/ld.elf_so/arch/arm/mdreloc.c	Thu Jan 14 12:12:07 2010
@@ -1,8 +1,8 @@
-/*	$NetBSD: mdreloc.c,v 1.32 2010/01/14 11:57:06 skrll Exp $	*/
+/*	$NetBSD: mdreloc.c,v 1.33 2010/01/14 12:12:07 skrll Exp $	*/
 
 #include 
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.32 2010/01/14 11:57:06 skrll Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.33 2010/01/14 12:12:07 skrll Exp $");
 #endif /* not lint */
 
 #include 
@@ -227,7 +227,7 @@
 	const Obj_Entry *defobj;
 	unsigned long info = rel->r_info;
 
-	assert(ELF_R_TYPE(info) == R_TYPE(JMP_SLOT));
+	assert(ELF_R_TYPE(info) == R_TYPE(JUMP_SLOT));
 
 	def = _rtld_find_plt_symdef(ELF_R_SYM(info), obj, &defobj, tp != NULL);
 	if (__predict_false(def == NULL))



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

2009-11-11 Thread Nick Hudson
Module Name:src
Committed By:   skrll
Date:   Wed Nov 11 14:15:41 UTC 2009

Modified Files:
src/libexec/ld.elf_so/arch/arm: rtld_start.S

Log Message:
Add RCSID


To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/libexec/ld.elf_so/arch/arm/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/arm/rtld_start.S
diff -u src/libexec/ld.elf_so/arch/arm/rtld_start.S:1.9 src/libexec/ld.elf_so/arch/arm/rtld_start.S:1.10
--- src/libexec/ld.elf_so/arch/arm/rtld_start.S:1.9	Mon Apr 28 20:23:03 2008
+++ src/libexec/ld.elf_so/arch/arm/rtld_start.S	Wed Nov 11 14:15:41 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: rtld_start.S,v 1.9 2008/04/28 20:23:03 martin Exp $	*/
+/*	$NetBSD: rtld_start.S,v 1.10 2009/11/11 14:15:41 skrll Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2002 The NetBSD Foundation, Inc.
@@ -31,6 +31,8 @@
 
 #include 
 
+RCSID("$NetBSD: rtld_start.S,v 1.10 2009/11/11 14:15:41 skrll Exp $")
+
 	.text
 	.align	0
 	.globl	_rtld_start