Module Name:    src
Committed By:   skrll
Date:           Thu Sep 30 09:11:19 UTC 2010

Modified Files:
        src/libexec/ld.elf_so: headers.c rtld.h
        src/libexec/ld.elf_so/arch/alpha: alpha_reloc.c
        src/sys/arch/alpha/include: elf_machdep.h
        src/sys/sys: exec_elf.h

Log Message:
Introduce a new type Elf_Symindx for use in decoding the symbol hash table
section and allow this type to be overridden.

The ELF specification says it should always be uint32_t (Elf_Word), but
alpha decided to be different (not sure why). Define Elf_Symindx to be
uint64_t on alpha.

Alpha no longer uses non-standard definitions of Elf64_Sword and
Elf64_Word.  Remove the ability to override these types.

Fixes ld.elf_so after Herculean effort from me and martin.


To generate a diff of this commit:
cvs rdiff -u -r1.30 -r1.31 src/libexec/ld.elf_so/headers.c
cvs rdiff -u -r1.92 -r1.93 src/libexec/ld.elf_so/rtld.h
cvs rdiff -u -r1.37 -r1.38 src/libexec/ld.elf_so/arch/alpha/alpha_reloc.c
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/alpha/include/elf_machdep.h
cvs rdiff -u -r1.103 -r1.104 src/sys/sys/exec_elf.h

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/headers.c
diff -u src/libexec/ld.elf_so/headers.c:1.30 src/libexec/ld.elf_so/headers.c:1.31
--- src/libexec/ld.elf_so/headers.c:1.30	Thu Sep 23 13:03:35 2010
+++ src/libexec/ld.elf_so/headers.c	Thu Sep 30 09:11:18 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: headers.c,v 1.30 2010/09/23 13:03:35 joerg Exp $	 */
+/*	$NetBSD: headers.c,v 1.31 2010/09/30 09:11:18 skrll Exp $	 */
 
 /*
  * Copyright 1996 John D. Polstra.
@@ -40,7 +40,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: headers.c,v 1.30 2010/09/23 13:03:35 joerg Exp $");
+__RCSID("$NetBSD: headers.c,v 1.31 2010/09/30 09:11:18 skrll Exp $");
 #endif /* not lint */
 
 #include <err.h>
@@ -138,8 +138,8 @@
 
 		case DT_HASH:
 			{
-				const Elf_Word *hashtab = (const Elf_Word *)
-				(obj->relocbase + dynp->d_un.d_ptr);
+				const Elf_Symindx *hashtab = (const Elf_Symindx *)
+				    (obj->relocbase + dynp->d_un.d_ptr);
 
 				if (hashtab[0] > UINT32_MAX)
 					obj->nbuckets = UINT32_MAX;

Index: src/libexec/ld.elf_so/rtld.h
diff -u src/libexec/ld.elf_so/rtld.h:1.92 src/libexec/ld.elf_so/rtld.h:1.93
--- src/libexec/ld.elf_so/rtld.h:1.92	Fri Aug  6 16:33:17 2010
+++ src/libexec/ld.elf_so/rtld.h	Thu Sep 30 09:11:18 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: rtld.h,v 1.92 2010/08/06 16:33:17 joerg Exp $	 */
+/*	$NetBSD: rtld.h,v 1.93 2010/09/30 09:11:18 skrll Exp $	 */
 
 /*
  * Copyright 1996 John D. Polstra.
@@ -161,12 +161,12 @@
 	Elf_Word        gotsym;		/* First dynamic symbol in GOT */
 #endif
 
-	const Elf_Word *buckets;	/* Hash table buckets array */
+	const Elf_Symindx *buckets;	/* Hash table buckets array */
 	uint32_t        nbuckets;	/* Number of buckets */
 	uint32_t        nbuckets_m;	/* Precomputed for fast remainder */
 	uint8_t         nbuckets_s1;
 	uint8_t         nbuckets_s2;
-	const Elf_Word *chains;		/* Hash table chain array */
+	const Elf_Symindx *chains;	/* Hash table chain array */
 	unsigned long   nchains;	/* Number of chains */
 
 	Search_Path    *rpaths;		/* Search path specified in object */

Index: src/libexec/ld.elf_so/arch/alpha/alpha_reloc.c
diff -u src/libexec/ld.elf_so/arch/alpha/alpha_reloc.c:1.37 src/libexec/ld.elf_so/arch/alpha/alpha_reloc.c:1.38
--- src/libexec/ld.elf_so/arch/alpha/alpha_reloc.c:1.37	Fri Aug  6 16:33:17 2010
+++ src/libexec/ld.elf_so/arch/alpha/alpha_reloc.c	Thu Sep 30 09:11:18 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: alpha_reloc.c,v 1.37 2010/08/06 16:33:17 joerg Exp $	*/
+/*	$NetBSD: alpha_reloc.c,v 1.38 2010/09/30 09:11:18 skrll Exp $	*/
 
 /*
  * Copyright (c) 2001 Wasabi Systems, Inc.
@@ -62,7 +62,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: alpha_reloc.c,v 1.37 2010/08/06 16:33:17 joerg Exp $");
+__RCSID("$NetBSD: alpha_reloc.c,v 1.38 2010/09/30 09:11:18 skrll Exp $");
 #endif /* not lint */
 
 #include <sys/types.h>
@@ -80,7 +80,7 @@
 void _rtld_bind_start(void);
 void _rtld_bind_start_old(void);
 void _rtld_relocate_nonplt_self(Elf_Dyn *, Elf_Addr);
-caddr_t _rtld_bind(const Obj_Entry *, Elf_Word);
+caddr_t _rtld_bind(const Obj_Entry *, Elf_Addr);
 static inline int _rtld_relocate_plt_object(const Obj_Entry *,
     const Elf_Rela *, Elf_Addr *);
 
@@ -476,7 +476,7 @@
 }
 
 caddr_t
-_rtld_bind(const Obj_Entry *obj, Elf_Word reloff)
+_rtld_bind(const Obj_Entry *obj, Elf_Addr reloff)
 {
 	const Elf_Rela *rela = 
 	    (const Elf_Rela *)((const uint8_t *)obj->pltrela + reloff);

Index: src/sys/arch/alpha/include/elf_machdep.h
diff -u src/sys/arch/alpha/include/elf_machdep.h:1.11 src/sys/arch/alpha/include/elf_machdep.h:1.12
--- src/sys/arch/alpha/include/elf_machdep.h:1.11	Sat May 30 05:56:52 2009
+++ src/sys/arch/alpha/include/elf_machdep.h	Thu Sep 30 09:11:19 2010
@@ -1,16 +1,13 @@
-/* $NetBSD: elf_machdep.h,v 1.11 2009/05/30 05:56:52 skrll Exp $ */
+/* $NetBSD: elf_machdep.h,v 1.12 2010/09/30 09:11:19 skrll Exp $ */
 
 #ifndef	_ALPHA_ELF_MACHDEP_H_
 #define	_ALPHA_ELF_MACHDEP_H_
 
 /*
- * Alpha ELF uses different (non-standard) definitions of Elf64_Sword
- * and Elf64_Word.
+ * Alpha ELF uses different (non-standard) definitions for the symbol
+ * hash table section.
  */
-typedef	int64_t		Elf64_Sword;
-#define	ELF64_FSZ_SWORD	8
-typedef	uint64_t	Elf64_Word;
-#define	ELF64_FSZ_WORD	8
+#define	Elf_Symindx	uint64_t
 
 #define	ELF32_MACHDEP_ENDIANNESS	XXX	/* break compilation */
 #define	ELF32_MACHDEP_ID_CASES						\

Index: src/sys/sys/exec_elf.h
diff -u src/sys/sys/exec_elf.h:1.103 src/sys/sys/exec_elf.h:1.104
--- src/sys/sys/exec_elf.h:1.103	Sat Aug 28 21:30:02 2010
+++ src/sys/sys/exec_elf.h	Thu Sep 30 09:11:19 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: exec_elf.h,v 1.103 2010/08/28 21:30:02 joerg Exp $	*/
+/*	$NetBSD: exec_elf.h,v 1.104 2010/09/30 09:11:19 skrll Exp $	*/
 
 /*-
  * Copyright (c) 1994 The NetBSD Foundation, Inc.
@@ -84,14 +84,10 @@
 typedef	int32_t		Elf64_Shalf;
 #define	ELF64_FSZ_SHALF	4
 
-#ifndef ELF64_FSZ_SWORD
 typedef	int32_t		Elf64_Sword;
 #define	ELF64_FSZ_SWORD	4
-#endif /* ELF64_FSZ_SWORD */
-#ifndef ELF64_FSZ_WORD
 typedef	uint32_t	Elf64_Word;
 #define	ELF64_FSZ_WORD	4
-#endif /* ELF64_FSZ_WORD */
 
 typedef	int64_t		Elf64_Sxword;
 #define	ELF64_FSZ_SXWORD 8
@@ -887,6 +883,10 @@
 #define	AuxInfo		Aux64Info
 #endif
 
+#ifndef	Elf_Symindx
+#define	Elf_Symindx	uint32_t
+#endif
+
 #define	ELF32_ST_BIND(info)		ELF_ST_BIND(info)
 #define	ELF32_ST_TYPE(info)		ELF_ST_TYPE(info)
 #define	ELF32_ST_INFO(bind,type)	ELF_ST_INFO(bind,type)

Reply via email to