Module Name:    src
Committed By:   matt
Date:           Wed Apr 24 22:37:21 UTC 2013

Modified Files:
        src/libexec/ld.elf_so: Makefile headers.c rtld.h symbol.c
        src/libexec/ld.elf_so/arch/arm: Makefile.inc

Log Message:
Add support for PT_ARM_EXIDX and __gnu_Unwind_Find_exidx for libgcc's support
of the ARM EHABI.


To generate a diff of this commit:
cvs rdiff -u -r1.115 -r1.116 src/libexec/ld.elf_so/Makefile
cvs rdiff -u -r1.43 -r1.44 src/libexec/ld.elf_so/headers.c
cvs rdiff -u -r1.110 -r1.111 src/libexec/ld.elf_so/rtld.h
cvs rdiff -u -r1.61 -r1.62 src/libexec/ld.elf_so/symbol.c
cvs rdiff -u -r1.15 -r1.16 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/Makefile
diff -u src/libexec/ld.elf_so/Makefile:1.115 src/libexec/ld.elf_so/Makefile:1.116
--- src/libexec/ld.elf_so/Makefile:1.115	Fri Apr  5 20:16:40 2013
+++ src/libexec/ld.elf_so/Makefile	Wed Apr 24 22:37:20 2013
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile,v 1.115 2013/04/05 20:16:40 christos Exp $
+#	$NetBSD: Makefile,v 1.116 2013/04/24 22:37:20 matt Exp $
 #
 # NOTE: when changing ld.so, ensure that ldd still compiles.
 #
@@ -91,6 +91,9 @@ CPPFLAGS+=	-DCOMBRELOC
 #CPPFLAGS+=	-DDEBUG
 #CPPFLAGS+=	-DRTLD_DEBUG
 #CPPFLAGS+=	-DRTLD_DEBUG_RELOC
+.if !empty(MACHINE_ARCH:Mearm*)
+CPPFLAGS+=	-I${NETBSDSRCDIR}/lib/libexecinfo
+.endif
 #DBG=		-g
 COPTS=		-O3 -fomit-frame-pointer
 

Index: src/libexec/ld.elf_so/headers.c
diff -u src/libexec/ld.elf_so/headers.c:1.43 src/libexec/ld.elf_so/headers.c:1.44
--- src/libexec/ld.elf_so/headers.c:1.43	Wed Aug 15 03:46:06 2012
+++ src/libexec/ld.elf_so/headers.c	Wed Apr 24 22:37:20 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: headers.c,v 1.43 2012/08/15 03:46:06 matt Exp $	 */
+/*	$NetBSD: headers.c,v 1.44 2013/04/24 22:37:20 matt Exp $	 */
 
 /*
  * Copyright 1996 John D. Polstra.
@@ -40,7 +40,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: headers.c,v 1.43 2012/08/15 03:46:06 matt Exp $");
+__RCSID("$NetBSD: headers.c,v 1.44 2013/04/24 22:37:20 matt Exp $");
 #endif /* not lint */
 
 #include <err.h>
@@ -414,6 +414,12 @@ _rtld_digest_phdr(const Elf_Phdr *phdr, 
 			obj->tlsinit = (void *)(uintptr_t)ph->p_vaddr;
 			break;
 #endif
+#ifdef __ARM_EABI__
+		case PT_ARM_EXIDX:
+			obj->exidx_start = (void *)(uintptr_t)vaddr;
+			obj->exidx_sz = ph->p_memsz;
+			break;
+#endif
 		}
 	}
 	assert(nsegs == 2);

Index: src/libexec/ld.elf_so/rtld.h
diff -u src/libexec/ld.elf_so/rtld.h:1.110 src/libexec/ld.elf_so/rtld.h:1.111
--- src/libexec/ld.elf_so/rtld.h:1.110	Wed Aug 15 03:46:06 2012
+++ src/libexec/ld.elf_so/rtld.h	Wed Apr 24 22:37:20 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: rtld.h,v 1.110 2012/08/15 03:46:06 matt Exp $	 */
+/*	$NetBSD: rtld.h,v 1.111 2013/04/24 22:37:20 matt Exp $	 */
 
 /*
  * Copyright 1996 John D. Polstra.
@@ -46,6 +46,10 @@
 #include "rtldenv.h"
 #include "link.h"
 
+#ifdef __ARM_EABI__
+#include "unwind.h"
+#endif
+
 #if defined(_RTLD_SOURCE)
 
 #ifndef	RTLD_DEFAULT_LIBRARY_PATH
@@ -284,6 +288,10 @@ typedef struct Struct_Obj_Entry {
 	size_t		init_arraysz;	/* # of entries in it */
 	fptr_t		*fini_array;	/* start of fini array */
 	size_t		fini_arraysz;	/* # of entries in it */
+#ifdef __ARM_EABI__
+	_Unwind_Ptr	exidx_start;
+	size_t		exidx_sz;
+#endif
 } Obj_Entry;
 
 typedef struct Struct_DoneList {
@@ -340,6 +348,14 @@ __dso_public int dl_iterate_phdr(int (*)
 
 __dso_public void *_dlauxinfo(void) __pure;
 
+#ifdef __ARM_EABI__
+/*
+ * This is used by libgcc to find the start and length of the exception table
+ * associated with a PC.
+ */
+__dso_public _Unwind_Ptr __gnu_Unwind_Find_exidx(_Unwind_Ptr, int *);
+#endif
+
 /* These aren't exported */
 void _rtld_error(const char *, ...)
      __attribute__((__format__(__printf__,1,2)));

Index: src/libexec/ld.elf_so/symbol.c
diff -u src/libexec/ld.elf_so/symbol.c:1.61 src/libexec/ld.elf_so/symbol.c:1.62
--- src/libexec/ld.elf_so/symbol.c:1.61	Wed Aug 15 03:46:07 2012
+++ src/libexec/ld.elf_so/symbol.c	Wed Apr 24 22:37:20 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: symbol.c,v 1.61 2012/08/15 03:46:07 matt Exp $	 */
+/*	$NetBSD: symbol.c,v 1.62 2013/04/24 22:37:20 matt Exp $	 */
 
 /*
  * Copyright 1996 John D. Polstra.
@@ -40,7 +40,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: symbol.c,v 1.61 2012/08/15 03:46:07 matt Exp $");
+__RCSID("$NetBSD: symbol.c,v 1.62 2013/04/24 22:37:20 matt Exp $");
 #endif /* not lint */
 
 #include <err.h>
@@ -101,6 +101,9 @@ _rtld_is_exported(const Elf_Sym *def)
 		(fptr_t)___tls_get_addr,
 #endif
 #endif
+#ifdef __ARM_EABI__
+		(fptr_t)__gnu_Unwind_Find_exidx,	/* for gcc EHABI */
+#endif
 		NULL
 	};
 	int i;

Index: src/libexec/ld.elf_so/arch/arm/Makefile.inc
diff -u src/libexec/ld.elf_so/arch/arm/Makefile.inc:1.15 src/libexec/ld.elf_so/arch/arm/Makefile.inc:1.16
--- src/libexec/ld.elf_so/arch/arm/Makefile.inc:1.15	Wed Jan 23 02:31:54 2013
+++ src/libexec/ld.elf_so/arch/arm/Makefile.inc	Wed Apr 24 22:37:20 2013
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile.inc,v 1.15 2013/01/23 02:31:54 matt Exp $
+#	$NetBSD: Makefile.inc,v 1.16 2013/04/24 22:37:20 matt Exp $
 
 SRCS+=		rtld_start.S mdreloc.c
 
@@ -6,9 +6,9 @@ SRCS+=		rtld_start.S mdreloc.c
 CPPFLAGS+=	-fpic
 
 CPPFLAGS+=	-DELFSIZE=32
-.if ${MACHINE_ARCH} == "earm" || ${MACHINE_ARCH} == "earmeb" \
-    || (!empty(CPUFLAGS) && ${CPUFLAGS:M-mabi=aapcs*} != "")
+.if !empty(MACHINE_ARCH:Mearm*)
 CPPFLAGS+=	-DHAVE_INITFINI_ARRAY
+SRCS+=		find_exidx.c
 .endif
 
 LDFLAGS+=	-Wl,-e,_rtld_start

Reply via email to