Module Name:    src
Committed By:   joerg
Date:           Fri Mar 25 18:07:07 UTC 2011

Modified Files:
        src/libexec/ld.elf_so: rtld.c rtld.h tls.c
        src/libexec/ld.elf_so/arch/alpha: alpha_reloc.c
        src/libexec/ld.elf_so/arch/arm: mdreloc.c
        src/libexec/ld.elf_so/arch/hppa: hppa_reloc.c
        src/libexec/ld.elf_so/arch/i386: mdreloc.c
        src/libexec/ld.elf_so/arch/m68k: mdreloc.c
        src/libexec/ld.elf_so/arch/mips: mips_reloc.c
        src/libexec/ld.elf_so/arch/powerpc: ppc_reloc.c
        src/libexec/ld.elf_so/arch/sh3: mdreloc.c
        src/libexec/ld.elf_so/arch/sparc: mdreloc.c
        src/libexec/ld.elf_so/arch/sparc64: mdreloc.c
        src/libexec/ld.elf_so/arch/vax: mdreloc.c
        src/libexec/ld.elf_so/arch/x86_64: mdreloc.c
        src/rescue: list.ldd
        src/usr.bin/ldd: ldd.c

Log Message:
Add basic locking to ld.elf_so.


To generate a diff of this commit:
cvs rdiff -u -r1.140 -r1.141 src/libexec/ld.elf_so/rtld.c
cvs rdiff -u -r1.103 -r1.104 src/libexec/ld.elf_so/rtld.h
cvs rdiff -u -r1.3 -r1.4 src/libexec/ld.elf_so/tls.c
cvs rdiff -u -r1.38 -r1.39 src/libexec/ld.elf_so/arch/alpha/alpha_reloc.c
cvs rdiff -u -r1.34 -r1.35 src/libexec/ld.elf_so/arch/arm/mdreloc.c
cvs rdiff -u -r1.38 -r1.39 src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c
cvs rdiff -u -r1.33 -r1.34 src/libexec/ld.elf_so/arch/i386/mdreloc.c
cvs rdiff -u -r1.27 -r1.28 src/libexec/ld.elf_so/arch/m68k/mdreloc.c
cvs rdiff -u -r1.61 -r1.62 src/libexec/ld.elf_so/arch/mips/mips_reloc.c
cvs rdiff -u -r1.48 -r1.49 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c
cvs rdiff -u -r1.29 -r1.30 src/libexec/ld.elf_so/arch/sh3/mdreloc.c
cvs rdiff -u -r1.44 -r1.45 src/libexec/ld.elf_so/arch/sparc/mdreloc.c
cvs rdiff -u -r1.50 -r1.51 src/libexec/ld.elf_so/arch/sparc64/mdreloc.c
cvs rdiff -u -r1.27 -r1.28 src/libexec/ld.elf_so/arch/vax/mdreloc.c
cvs rdiff -u -r1.39 -r1.40 src/libexec/ld.elf_so/arch/x86_64/mdreloc.c
cvs rdiff -u -r1.5 -r1.6 src/rescue/list.ldd
cvs rdiff -u -r1.16 -r1.17 src/usr.bin/ldd/ldd.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/rtld.c
diff -u src/libexec/ld.elf_so/rtld.c:1.140 src/libexec/ld.elf_so/rtld.c:1.141
--- src/libexec/ld.elf_so/rtld.c:1.140	Sun Mar 13 21:08:45 2011
+++ src/libexec/ld.elf_so/rtld.c	Fri Mar 25 18:07:04 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: rtld.c,v 1.140 2011/03/13 21:08:45 joerg Exp $	 */
+/*	$NetBSD: rtld.c,v 1.141 2011/03/25 18:07:04 joerg Exp $	 */
 
 /*
  * Copyright 1996 John D. Polstra.
@@ -40,19 +40,21 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: rtld.c,v 1.140 2011/03/13 21:08:45 joerg Exp $");
+__RCSID("$NetBSD: rtld.c,v 1.141 2011/03/25 18:07:04 joerg Exp $");
 #endif /* not lint */
 
+#include <sys/param.h>
+#include <sys/atomic.h>
+#include <sys/mman.h>
 #include <err.h>
 #include <errno.h>
 #include <fcntl.h>
+#include <lwp.h>
 #include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
-#include <sys/param.h>
-#include <sys/mman.h>
 #include <dirent.h>
 
 #include <ctype.h>
@@ -107,6 +109,8 @@
 char           *__progname;
 char          **environ;
 
+static volatile bool _rtld_mutex_may_recurse;
+
 #if defined(RTLD_DEBUG)
 #ifndef __sh__
 extern Elf_Addr _GLOBAL_OFFSET_TABLE_[];
@@ -153,7 +157,10 @@
 		dbg (("calling fini function %s at %p",  obj->path,
 		    (void *)obj->fini));
 		obj->fini_called = 1;
+		/* XXXlocking: exit point */
+		_rtld_mutex_may_recurse = true;
 		(*obj->fini)();
+		_rtld_mutex_may_recurse = false;
 	}
 
 	/* Second pass: objects marked with DF_1_INITFIRST. */
@@ -168,7 +175,10 @@
 		dbg (("calling fini function %s at %p (DF_1_INITFIRST)",
 		    obj->path, (void *)obj->fini));
 		obj->fini_called = 1;
+		/* XXXlocking: exit point */
+		_rtld_mutex_may_recurse = true;
 		(*obj->fini)();
+		_rtld_mutex_may_recurse = false;
 	}
 
         _rtld_objlist_clear(&finilist);
@@ -194,7 +204,10 @@
 		dbg (("calling init function %s at %p (DF_1_INITFIRST)",
 		    obj->path, (void *)obj->init));
 		obj->init_called = 1;
+		/* XXXlocking: exit point */
+		_rtld_mutex_may_recurse = true;
 		(*obj->init)();
+		_rtld_mutex_may_recurse = false;
 	}
 
 	/* Second pass: all other objects. */
@@ -206,7 +219,10 @@
 		dbg (("calling init function %s at %p",  obj->path,
 		    (void *)obj->init));
 		obj->init_called = 1;
+		/* XXXlocking: exit point */
+		_rtld_mutex_may_recurse = true;
 		(*obj->init)();
+		_rtld_mutex_may_recurse = false;
 	}
 
         _rtld_objlist_clear(&initlist);
@@ -619,12 +635,16 @@
 	if (real___mainprog_obj)
 		*real___mainprog_obj = _rtld_objmain;
 
+	_rtld_exclusive_enter();
+
 	dbg(("calling _init functions"));
 	_rtld_call_init_functions();
 
 	dbg(("control at program entry point = %p, obj = %p, exit = %p",
 	     _rtld_objmain->entry, _rtld_objmain, _rtld_exit));
 
+	_rtld_exclusive_exit();
+
 	/*
 	 * Return with the entry point and the exit procedure in at the top
 	 * of stack.
@@ -856,6 +876,8 @@
 	bool nodelete;
 	bool now;
 
+	_rtld_exclusive_enter();
+
 	flags |= (mode & RTLD_GLOBAL) ? _RTLD_GLOBAL : 0;
 	flags |= (mode & RTLD_NOLOAD) ? _RTLD_NOLOAD : 0;
 	
@@ -899,6 +921,8 @@
 	_rtld_debug.r_state = RT_CONSISTENT;
 	_rtld_debug_state();
 
+	_rtld_exclusive_exit();
+
 	return obj;
 }
 
@@ -933,6 +957,14 @@
 }
 #endif
 
+#ifdef __HAVE_FUNCTION_DESCRIPTORS
+#define	lookup_mutex_enter()	_rtld_exclusive_enter()
+#define	lookup_mutex_exit()	_rtld_exclusive_exit()
+#else
+#define	lookup_mutex_enter()	_rtld_shared_enter()
+#define	lookup_mutex_exit()	_rtld_shared_exit()
+#endif
+
 __strong_alias(__dlsym,dlsym)
 void *
 dlsym(void *handle, const char *name)
@@ -943,7 +975,9 @@
 	const Obj_Entry *defobj;
 	void *retaddr;
 	DoneList donelist; 
-	
+
+	lookup_mutex_enter();
+
 	hash = _rtld_elf_hash(name);
 	def = NULL;
 	defobj = NULL;
@@ -960,6 +994,7 @@
 #endif
 		if ((obj = _rtld_obj_from_addr(retaddr)) == NULL) {
 			_rtld_error("Cannot determine caller's shared object");
+			lookup_mutex_exit();
 			return NULL;
 		}
 
@@ -994,9 +1029,11 @@
 		break;
 
 	default:
-		if ((obj = _rtld_dlcheck(handle)) == NULL)
+		if ((obj = _rtld_dlcheck(handle)) == NULL) {
+			lookup_mutex_exit();
 			return NULL;
-		
+		}
+
 		_rtld_donelist_init(&donelist);
 
 		if (obj->mainprog) {
@@ -1021,15 +1058,20 @@
 	}
 	
 	if (def != NULL) {
+		void *p;
 #ifdef __HAVE_FUNCTION_DESCRIPTORS
-		if (ELF_ST_TYPE(def->st_info) == STT_FUNC)
-			return (void *)_rtld_function_descriptor_alloc(defobj, 
-			    def, 0);
+		if (ELF_ST_TYPE(def->st_info) == STT_FUNC) {
+			lookup_mutex_exit();
+			return p;
+		}
 #endif /* __HAVE_FUNCTION_DESCRIPTORS */
-		return defobj->relocbase + def->st_value;
+		p = defobj->relocbase + def->st_value;
+		lookup_mutex_exit();
+		return p;
 	}
 	
 	_rtld_error("Undefined symbol \"%s\"", name);
+	lookup_mutex_exit();
 	return NULL;
 }
 
@@ -1041,7 +1083,9 @@
 	const Elf_Sym *def, *best_def;
 	void *symbol_addr;
 	unsigned long symoffset;
-	
+
+	lookup_mutex_enter();
+
 #ifdef __HAVE_FUNCTION_DESCRIPTORS
 	addr = _rtld_function_descriptor_function(addr);
 #endif /* __HAVE_FUNCTION_DESCRIPTORS */
@@ -1049,6 +1093,7 @@
 	obj = _rtld_obj_from_addr(addr);
 	if (obj == NULL) {
 		_rtld_error("No shared object contains address");
+		lookup_mutex_enter();
 		return 0;
 	}
 	info->dli_fname = obj->path;
@@ -1096,6 +1141,7 @@
 		    best_def, 0);
 #endif /* __HAVE_FUNCTION_DESCRIPTORS */
 
+	lookup_mutex_exit();
 	return 1;
 }
 
@@ -1106,6 +1152,8 @@
 	const Obj_Entry *obj;
 	void *retaddr;
 
+	_rtld_shared_enter();
+
 	if (handle == RTLD_SELF) {
 #ifdef __powerpc__
 		retaddr = hackish_return_address();
@@ -1114,11 +1162,13 @@
 #endif
 		if ((obj = _rtld_obj_from_addr(retaddr)) == NULL) {
 			_rtld_error("Cannot determine caller's shared object");
+			_rtld_shared_exit();
 			return -1;
 		}
 	} else {
 		if ((obj = _rtld_dlcheck(handle)) == NULL) {
 			_rtld_error("Invalid handle");
+			_rtld_shared_exit();
 			return -1;
 		}
 	}
@@ -1134,9 +1184,11 @@
 
 	default:
 		_rtld_error("Invalid request");
+		_rtld_shared_exit();
 		return -1;
 	}
 
+	_rtld_shared_exit();
 	return 0;
 }
 
@@ -1148,6 +1200,8 @@
 	const Obj_Entry *obj;
 	int error = 0;
 
+	_rtld_shared_enter();
+
 	for (obj = _rtld_objlist;  obj != NULL;  obj = obj->next) {
 		phdr_info.dlpi_addr = (Elf_Addr)obj->relocbase;
 		phdr_info.dlpi_name = STAILQ_FIRST(&obj->names) ?
@@ -1164,11 +1218,13 @@
 		phdr_info.dlpi_adds = _rtld_objloads;
 		phdr_info.dlpi_subs = _rtld_objloads - _rtld_objcount;
 
+		/* XXXlocking: exit point */
 		error = callback(&phdr_info, sizeof(phdr_info), param);
 		if (error)
 			break;
 	}
 
+	_rtld_shared_exit();
 	return error;
 }
 
@@ -1278,3 +1334,117 @@
 		xfree(elm);
 	}
 }
+
+#define	RTLD_EXCLUSIVE_MASK	0x80000000U
+static volatile unsigned int _rtld_mutex;
+static volatile unsigned int _rtld_waiter_exclusive;
+static volatile unsigned int _rtld_waiter_shared;
+
+void
+_rtld_shared_enter(void)
+{
+	unsigned int cur;
+	lwpid_t waiter, self = 0;
+
+	membar_enter();
+
+	for (;;) {
+		cur = _rtld_mutex;
+		/*
+		 * First check if we are currently not exclusively locked.
+		 */
+		if ((cur & RTLD_EXCLUSIVE_MASK) == 0) {
+			/* Yes, so increment use counter */
+			if (atomic_cas_uint(&_rtld_mutex, cur, cur + 1) != cur)
+				continue;
+			return;
+		}
+		/*
+		 * Someone has an exclusive lock.  Puts us on the waiter list.
+		 */
+		if (!self)
+			self = _lwp_self();
+		if (cur == (self | RTLD_EXCLUSIVE_MASK)) {
+			if (_rtld_mutex_may_recurse)
+				return;
+			_rtld_error("dead lock detected");
+			_rtld_die();
+		}
+		waiter = atomic_swap_uint(&_rtld_waiter_shared, self);
+		/*
+		 * Check for race against _rtld_exclusive_exit before sleeping.
+		 */
+		if ((_rtld_mutex & RTLD_EXCLUSIVE_MASK) ||
+		    _rtld_waiter_exclusive)
+			_lwp_park(NULL, -1, __UNVOLATILE(&_rtld_mutex), NULL);
+		/* Try to remove us from the waiter list. */
+		atomic_cas_uint(&_rtld_waiter_shared, self, 0);
+		if (waiter)
+			_lwp_unpark(waiter, __UNVOLATILE(&_rtld_mutex));
+	}
+}
+
+void
+_rtld_shared_exit(void)
+{
+	lwpid_t waiter;
+
+	/*
+	 * Shared lock taken after an exclusive lock.
+	 * Just assume this is a partial recursion.
+	 */
+	if (_rtld_mutex & RTLD_EXCLUSIVE_MASK)
+		return;
+
+	/*
+	 * Wakeup LWPs waiting for an exclusive lock if this is the last
+	 * LWP on the shared lock.
+	 */
+	if (atomic_dec_uint_nv(&_rtld_mutex))
+		return;
+	if ((waiter = _rtld_waiter_exclusive) != 0)
+		_lwp_unpark(waiter, __UNVOLATILE(&_rtld_mutex));
+
+	membar_exit();
+}
+
+void
+_rtld_exclusive_enter(void)
+{
+	lwpid_t waiter, self = _lwp_self();
+	unsigned int locked_value = (unsigned int)self | RTLD_EXCLUSIVE_MASK;
+	unsigned int cur;
+
+	membar_enter();
+
+	for (;;) {
+		if (atomic_cas_uint(&_rtld_mutex, 0, locked_value) == 0)
+			break;
+		waiter = atomic_swap_uint(&_rtld_waiter_exclusive, self);
+		cur = _rtld_mutex;
+		if (cur == locked_value) {
+			_rtld_error("dead lock detected");
+			_rtld_die();
+		}
+		if (cur)
+			_lwp_park(NULL, -1, __UNVOLATILE(&_rtld_mutex), NULL);
+		atomic_cas_uint(&_rtld_waiter_exclusive, self, 0);
+		if (waiter)
+			_lwp_unpark(waiter, __UNVOLATILE(&_rtld_mutex));
+	}
+}
+
+void
+_rtld_exclusive_exit(void)
+{
+	lwpid_t waiter;
+
+	_rtld_mutex = 0;
+	if ((waiter = _rtld_waiter_exclusive) != 0)
+		_lwp_unpark(waiter, __UNVOLATILE(&_rtld_mutex));
+
+	if ((waiter = _rtld_waiter_shared) != 0)
+		_lwp_unpark(waiter, __UNVOLATILE(&_rtld_mutex));
+
+	membar_exit();
+}

Index: src/libexec/ld.elf_so/rtld.h
diff -u src/libexec/ld.elf_so/rtld.h:1.103 src/libexec/ld.elf_so/rtld.h:1.104
--- src/libexec/ld.elf_so/rtld.h:1.103	Sat Mar 12 22:54:36 2011
+++ src/libexec/ld.elf_so/rtld.h	Fri Mar 25 18:07:04 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: rtld.h,v 1.103 2011/03/12 22:54:36 joerg Exp $	 */
+/*	$NetBSD: rtld.h,v 1.104 2011/03/25 18:07:04 joerg Exp $	 */
 
 /*
  * Copyright 1996 John D. Polstra.
@@ -312,6 +312,11 @@
 Objlist_Entry *_rtld_objlist_find(Objlist *, const Obj_Entry *);
 void _rtld_ref_dag(Obj_Entry *);
 
+void _rtld_shared_enter(void);
+void _rtld_shared_exit(void);
+void _rtld_exclusive_enter(void);
+void _rtld_exclusive_exit(void);
+
 /* expand.c */
 size_t _rtld_expand_path(char *, size_t, const char *, const char *,\
     const char *);

Index: src/libexec/ld.elf_so/tls.c
diff -u src/libexec/ld.elf_so/tls.c:1.3 src/libexec/ld.elf_so/tls.c:1.4
--- src/libexec/ld.elf_so/tls.c:1.3	Sat Mar 12 07:43:53 2011
+++ src/libexec/ld.elf_so/tls.c	Fri Mar 25 18:07:04 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: tls.c,v 1.3 2011/03/12 07:43:53 matt Exp $	*/
+/*	$NetBSD: tls.c,v 1.4 2011/03/25 18:07:04 joerg Exp $	*/
 /*-
  * Copyright (c) 2011 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: tls.c,v 1.3 2011/03/12 07:43:53 matt Exp $");
+__RCSID("$NetBSD: tls.c,v 1.4 2011/03/25 18:07:04 joerg Exp $");
 
 #include <sys/param.h>
 #include <sys/ucontext.h>
@@ -39,6 +39,8 @@
 
 #if defined(__HAVE_TLS_VARIANT_I) || defined(__HAVE_TLS_VARIANT_II)
 
+static struct tls_tcb *_rtld_tls_allocate_locked(void);
+
 #ifndef TLS_DTV_OFFSET
 #define	TLS_DTV_OFFSET	0
 #endif
@@ -59,6 +61,8 @@
 	struct tls_tcb *tcb = tls;
 	void **dtv, **new_dtv;
 
+	_rtld_exclusive_enter();
+
 	dtv = tcb->tcb_dtv;
 
 	if (__predict_false(DTV_GENERATION(dtv) != _rtld_tls_dtv_generation)) {
@@ -78,6 +82,8 @@
 	if (__predict_false(dtv[idx] == NULL))
 		dtv[idx] = _rtld_tls_module_allocate(idx);
 
+	_rtld_exclusive_exit();
+
 	return (uint8_t *)dtv[idx] + offset;
 }
 
@@ -94,7 +100,7 @@
 	    sizeof(void *));
 #endif
 
-	tcb = _rtld_tls_allocate();
+	tcb = _rtld_tls_allocate_locked();
 #ifdef __HAVE___LWP_SETTCB
 	__lwp_settcb(tcb);
 #else
@@ -102,8 +108,8 @@
 #endif
 }
 
-struct tls_tcb *
-_rtld_tls_allocate(void)
+static struct tls_tcb *
+_rtld_tls_allocate_locked(void)
 {
 	Obj_Entry *obj;
 	struct tls_tcb *tcb;
@@ -138,12 +144,26 @@
 	return tcb;
 }
 
+struct tls_tcb *
+_rtld_tls_allocate(void)
+{
+	struct tls_tcb *tcb;
+
+	_rtld_exclusive_enter();
+	tcb = _rtld_tls_allocate_locked();
+	_rtld_exclusive_exit();
+
+	return tcb;
+}
+
 void
 _rtld_tls_free(struct tls_tcb *tcb)
 {
 	size_t i, max_index;
 	uint8_t *p;
 
+	_rtld_exclusive_enter();
+
 	max_index = DTV_MAX_INDEX(tcb->tcb_dtv);
 	for (i = 1; i <= max_index; ++i)
 		xfree(tcb->tcb_dtv[i]);
@@ -155,6 +175,8 @@
 	p = (uint8_t *)tcb - _rtld_tls_static_space;
 #endif
 	xfree(p);
+
+	_rtld_exclusive_exit();
 }
 
 void *

Index: src/libexec/ld.elf_so/arch/alpha/alpha_reloc.c
diff -u src/libexec/ld.elf_so/arch/alpha/alpha_reloc.c:1.38 src/libexec/ld.elf_so/arch/alpha/alpha_reloc.c:1.39
--- src/libexec/ld.elf_so/arch/alpha/alpha_reloc.c:1.38	Thu Sep 30 09:11:18 2010
+++ src/libexec/ld.elf_so/arch/alpha/alpha_reloc.c	Fri Mar 25 18:07:04 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: alpha_reloc.c,v 1.38 2010/09/30 09:11:18 skrll Exp $	*/
+/*	$NetBSD: alpha_reloc.c,v 1.39 2011/03/25 18:07:04 joerg Exp $	*/
 
 /*
  * Copyright (c) 2001 Wasabi Systems, Inc.
@@ -62,7 +62,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: alpha_reloc.c,v 1.38 2010/09/30 09:11:18 skrll Exp $");
+__RCSID("$NetBSD: alpha_reloc.c,v 1.39 2011/03/25 18:07:04 joerg Exp $");
 #endif /* not lint */
 
 #include <sys/types.h>
@@ -483,9 +483,11 @@
 	Elf_Addr result = 0; /* XXX gcc */
 	int err;
 
+	_rtld_shared_enter();
 	err = _rtld_relocate_plt_object(obj, rela, &result);
 	if (err)
 		_rtld_die();
+	_rtld_shared_exit();
 
 	return (caddr_t)result;
 }

Index: src/libexec/ld.elf_so/arch/arm/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/arm/mdreloc.c:1.34 src/libexec/ld.elf_so/arch/arm/mdreloc.c:1.35
--- src/libexec/ld.elf_so/arch/arm/mdreloc.c:1.34	Fri Aug  6 16:33:17 2010
+++ src/libexec/ld.elf_so/arch/arm/mdreloc.c	Fri Mar 25 18:07:05 2011
@@ -1,8 +1,8 @@
-/*	$NetBSD: mdreloc.c,v 1.34 2010/08/06 16:33:17 joerg Exp $	*/
+/*	$NetBSD: mdreloc.c,v 1.35 2011/03/25 18:07:05 joerg Exp $	*/
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.34 2010/08/06 16:33:17 joerg Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.35 2011/03/25 18:07:05 joerg Exp $");
 #endif /* not lint */
 
 #include <sys/types.h>
@@ -254,9 +254,11 @@
 	Elf_Addr new_value = 0;	/* XXX gcc */
 	int err;
 
+	_rtld_shared_enter();
 	err = _rtld_relocate_plt_object(obj, rel, &new_value);
 	if (err)
 		_rtld_die();
+	_rtld_shared_exit();
 
 	return (caddr_t)new_value;
 }

Index: src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c
diff -u src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c:1.38 src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c:1.39
--- src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c:1.38	Thu Mar 17 22:07:52 2011
+++ src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c	Fri Mar 25 18:07:05 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: hppa_reloc.c,v 1.38 2011/03/17 22:07:52 skrll Exp $	*/
+/*	$NetBSD: hppa_reloc.c,v 1.39 2011/03/25 18:07:05 joerg Exp $	*/
 
 /*-
  * Copyright (c) 2002, 2004 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: hppa_reloc.c,v 1.38 2011/03/17 22:07:52 skrll Exp $");
+__RCSID("$NetBSD: hppa_reloc.c,v 1.39 2011/03/25 18:07:05 joerg Exp $");
 #endif /* not lint */
 
 #include <stdlib.h>
@@ -639,9 +639,11 @@
 	
 	assert(ELF_R_SYM(rela->r_info) != 0);
 
+	_rtld_shared_enter();
 	err = _rtld_relocate_plt_object(obj, rela, &new_value); 
 	if (err)
 		_rtld_die();
+	_rtld_shared_exit();
 
 	return (caddr_t)new_value;
 }

Index: src/libexec/ld.elf_so/arch/i386/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/i386/mdreloc.c:1.33 src/libexec/ld.elf_so/arch/i386/mdreloc.c:1.34
--- src/libexec/ld.elf_so/arch/i386/mdreloc.c:1.33	Sat Mar 12 22:54:36 2011
+++ src/libexec/ld.elf_so/arch/i386/mdreloc.c	Fri Mar 25 18:07:05 2011
@@ -1,8 +1,8 @@
-/*	$NetBSD: mdreloc.c,v 1.33 2011/03/12 22:54:36 joerg Exp $	*/
+/*	$NetBSD: mdreloc.c,v 1.34 2011/03/25 18:07:05 joerg Exp $	*/
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.33 2011/03/12 22:54:36 joerg Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.34 2011/03/25 18:07:05 joerg Exp $");
 #endif /* not lint */
 
 #include <sys/types.h>
@@ -236,9 +236,11 @@
 
 	new_value = 0;	/* XXX gcc */
 
+	_rtld_shared_enter();
 	err = _rtld_relocate_plt_object(obj, rel, &new_value);
 	if (err)
 		_rtld_die();
+	_rtld_shared_exit();
 
 	return (caddr_t)new_value;
 }

Index: src/libexec/ld.elf_so/arch/m68k/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/m68k/mdreloc.c:1.27 src/libexec/ld.elf_so/arch/m68k/mdreloc.c:1.28
--- src/libexec/ld.elf_so/arch/m68k/mdreloc.c:1.27	Fri Aug  6 16:33:18 2010
+++ src/libexec/ld.elf_so/arch/m68k/mdreloc.c	Fri Mar 25 18:07:05 2011
@@ -1,13 +1,13 @@
-/*	$NetBSD: mdreloc.c,v 1.27 2010/08/06 16:33:18 joerg Exp $	*/
+/*	$NetBSD: mdreloc.c,v 1.28 2011/03/25 18:07:05 joerg Exp $	*/
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.27 2010/08/06 16:33:18 joerg Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.28 2011/03/25 18:07:05 joerg Exp $");
 #endif /* not lint */
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.27 2010/08/06 16:33:18 joerg Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.28 2011/03/25 18:07:05 joerg Exp $");
 #endif /* not lint */
 
 #include <sys/types.h>
@@ -204,9 +204,11 @@
 
 	result = 0;	/* XXX gcc */
 
+	_rtld_shared_enter();
 	err = _rtld_relocate_plt_object(obj, rela, &result);
 	if (err)
 		_rtld_die();
+	_rtld_shared_exit();
 
 	return (caddr_t)result;
 }

Index: src/libexec/ld.elf_so/arch/mips/mips_reloc.c
diff -u src/libexec/ld.elf_so/arch/mips/mips_reloc.c:1.61 src/libexec/ld.elf_so/arch/mips/mips_reloc.c:1.62
--- src/libexec/ld.elf_so/arch/mips/mips_reloc.c:1.61	Tue Mar 15 07:40:52 2011
+++ src/libexec/ld.elf_so/arch/mips/mips_reloc.c	Fri Mar 25 18:07:05 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: mips_reloc.c,v 1.61 2011/03/15 07:40:52 matt Exp $	*/
+/*	$NetBSD: mips_reloc.c,v 1.62 2011/03/25 18:07:05 joerg Exp $	*/
 
 /*
  * Copyright 1997 Michael L. Hitch <mhi...@montana.edu>
@@ -30,7 +30,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: mips_reloc.c,v 1.61 2011/03/15 07:40:52 matt Exp $");
+__RCSID("$NetBSD: mips_reloc.c,v 1.62 2011/03/25 18:07:05 joerg Exp $");
 #endif /* not lint */
 
 #include <sys/types.h>
@@ -505,9 +505,11 @@
 	Elf_Addr new_value = 0;	/* XXX gcc */
 	int err;
 
+	_rtld_shared_enter();
 	err = _rtld_relocate_plt_object(obj, a0, &new_value);
 	if (err)
 		_rtld_die();
+	_rtld_shared_exit();
 
 	return (caddr_t)new_value;
 }

Index: src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c
diff -u src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.48 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.49
--- src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.48	Sat Mar 12 07:43:53 2011
+++ src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c	Fri Mar 25 18:07:06 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: ppc_reloc.c,v 1.48 2011/03/12 07:43:53 matt Exp $	*/
+/*	$NetBSD: ppc_reloc.c,v 1.49 2011/03/25 18:07:06 joerg Exp $	*/
 
 /*-
  * Copyright (C) 1998	Tsubai Masanari
@@ -30,7 +30,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: ppc_reloc.c,v 1.48 2011/03/12 07:43:53 matt Exp $");
+__RCSID("$NetBSD: ppc_reloc.c,v 1.49 2011/03/25 18:07:06 joerg Exp $");
 #endif /* not lint */
 
 #include <stdarg.h>
@@ -397,9 +397,11 @@
 
 	new_value = 0;	/* XXX gcc */
 
+	_rtld_shared_enter();
 	err = _rtld_relocate_plt_object(obj, rela, reloff, &new_value); 
 	if (err)
 		_rtld_die();
+	_rtld_shared_exit();
 
 	return (caddr_t)new_value;
 }

Index: src/libexec/ld.elf_so/arch/sh3/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/sh3/mdreloc.c:1.29 src/libexec/ld.elf_so/arch/sh3/mdreloc.c:1.30
--- src/libexec/ld.elf_so/arch/sh3/mdreloc.c:1.29	Sat Mar 12 22:54:36 2011
+++ src/libexec/ld.elf_so/arch/sh3/mdreloc.c	Fri Mar 25 18:07:06 2011
@@ -1,13 +1,13 @@
-/*	$NetBSD: mdreloc.c,v 1.29 2011/03/12 22:54:36 joerg Exp $	*/
+/*	$NetBSD: mdreloc.c,v 1.30 2011/03/25 18:07:06 joerg Exp $	*/
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.29 2011/03/12 22:54:36 joerg Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.30 2011/03/25 18:07:06 joerg Exp $");
 #endif /* not lint */
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.29 2011/03/12 22:54:36 joerg Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.30 2011/03/25 18:07:06 joerg Exp $");
 #endif /* not lint */
 
 #include <sys/types.h>
@@ -244,9 +244,11 @@
 
 	new_value = 0;	/* XXX gcc */
 
+	_rtld_shared_enter();
 	err = _rtld_relocate_plt_object(obj, rela, &new_value);
 	if (err)
 		_rtld_die();
+	_rtld_shared_exit();
 
 	return (caddr_t)new_value;
 }

Index: src/libexec/ld.elf_so/arch/sparc/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/sparc/mdreloc.c:1.44 src/libexec/ld.elf_so/arch/sparc/mdreloc.c:1.45
--- src/libexec/ld.elf_so/arch/sparc/mdreloc.c:1.44	Fri Aug  6 16:33:18 2010
+++ src/libexec/ld.elf_so/arch/sparc/mdreloc.c	Fri Mar 25 18:07:06 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: mdreloc.c,v 1.44 2010/08/06 16:33:18 joerg Exp $	*/
+/*	$NetBSD: mdreloc.c,v 1.45 2011/03/25 18:07:06 joerg Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2002 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.44 2010/08/06 16:33:18 joerg Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.45 2011/03/25 18:07:06 joerg Exp $");
 #endif /* not lint */
 
 #include <errno.h>
@@ -325,9 +325,11 @@
 
 	value = 0;	/* XXX gcc */
 
+	_rtld_shared_enter();
 	err = _rtld_relocate_plt_object(obj, rela, &value);
 	if (err)
 		_rtld_die();
+	_rtld_shared_exit();
 
 	return (caddr_t)value;
 }

Index: src/libexec/ld.elf_so/arch/sparc64/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/sparc64/mdreloc.c:1.50 src/libexec/ld.elf_so/arch/sparc64/mdreloc.c:1.51
--- src/libexec/ld.elf_so/arch/sparc64/mdreloc.c:1.50	Fri Sep 24 12:00:10 2010
+++ src/libexec/ld.elf_so/arch/sparc64/mdreloc.c	Fri Mar 25 18:07:06 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: mdreloc.c,v 1.50 2010/09/24 12:00:10 skrll Exp $	*/
+/*	$NetBSD: mdreloc.c,v 1.51 2011/03/25 18:07:06 joerg Exp $	*/
 
 /*-
  * Copyright (c) 2000 Eduardo Horvath.
@@ -32,7 +32,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.50 2010/09/24 12:00:10 skrll Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.51 2011/03/25 18:07:06 joerg Exp $");
 #endif /* not lint */
 
 #include <errno.h>
@@ -471,9 +471,11 @@
 		rela -= 4;
 	}
 
+	_rtld_shared_enter();
 	err = _rtld_relocate_plt_object(obj, rela, &result);
 	if (err)
 		_rtld_die();
+	_rtld_shared_exit();
 
 	return (caddr_t)result;
 }

Index: src/libexec/ld.elf_so/arch/vax/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/vax/mdreloc.c:1.27 src/libexec/ld.elf_so/arch/vax/mdreloc.c:1.28
--- src/libexec/ld.elf_so/arch/vax/mdreloc.c:1.27	Fri Aug  6 16:33:19 2010
+++ src/libexec/ld.elf_so/arch/vax/mdreloc.c	Fri Mar 25 18:07:07 2011
@@ -1,13 +1,13 @@
-/*	$NetBSD: mdreloc.c,v 1.27 2010/08/06 16:33:19 joerg Exp $	*/
+/*	$NetBSD: mdreloc.c,v 1.28 2011/03/25 18:07:07 joerg Exp $	*/
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.27 2010/08/06 16:33:19 joerg Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.28 2011/03/25 18:07:07 joerg Exp $");
 #endif /* not lint */
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.27 2010/08/06 16:33:19 joerg Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.28 2011/03/25 18:07:07 joerg Exp $");
 #endif /* not lint */
 
 #include <sys/types.h>
@@ -187,9 +187,11 @@
 
 	result = 0;	/* XXX gcc */
 
+	_rtld_shared_enter();
 	err = _rtld_relocate_plt_object(obj, rela, &result);
 	if (err)
 		_rtld_die();
+	_rtld_shared_exit();
 
 	return (caddr_t)result;
 }

Index: src/libexec/ld.elf_so/arch/x86_64/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/x86_64/mdreloc.c:1.39 src/libexec/ld.elf_so/arch/x86_64/mdreloc.c:1.40
--- src/libexec/ld.elf_so/arch/x86_64/mdreloc.c:1.39	Sat Mar 12 22:54:36 2011
+++ src/libexec/ld.elf_so/arch/x86_64/mdreloc.c	Fri Mar 25 18:07:07 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: mdreloc.c,v 1.39 2011/03/12 22:54:36 joerg Exp $	*/
+/*	$NetBSD: mdreloc.c,v 1.40 2011/03/25 18:07:07 joerg Exp $	*/
 
 /*
  * Copyright (c) 2001 Wasabi Systems, Inc.
@@ -68,7 +68,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.39 2011/03/12 22:54:36 joerg Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.40 2011/03/25 18:07:07 joerg Exp $");
 #endif /* not lint */
 
 #include <sys/types.h>
@@ -335,9 +335,11 @@
 
 	new_value = 0; /* XXX GCC4 */
 
+	_rtld_shared_enter();
 	error = _rtld_relocate_plt_object(obj, rela, &new_value);
 	if (error)
 		_rtld_die();
+	_rtld_shared_exit();
 
 	return (caddr_t)new_value;
 }

Index: src/rescue/list.ldd
diff -u src/rescue/list.ldd:1.5 src/rescue/list.ldd:1.6
--- src/rescue/list.ldd:1.5	Wed Mar  9 23:10:07 2011
+++ src/rescue/list.ldd	Fri Mar 25 18:07:07 2011
@@ -1,4 +1,4 @@
-#	$NetBSD: list.ldd,v 1.5 2011/03/09 23:10:07 joerg Exp $
+#	$NetBSD: list.ldd,v 1.6 2011/03/25 18:07:07 joerg Exp $
 
 PROG	ldd
 
@@ -10,4 +10,7 @@
 SPECIAL ldd	keepsymbols	_rtld_xforms _rtld_objmain
 SPECIAL ldd	keepsymbols	_rtld_objtail _rtld_objlist
 SPECIAL ldd	keepsymbols	_rtld_objcount _rtld_objloads
+SPECIAL ldd	keepsymbols	_rtld_shared_enter _rtld_shared_exit
+SPECIAL ldd	keepsymbols	_rtld_exclusive_enter _rtld_exclusive_exit
+
 SPECIAL ldd	keepsymbols	print_needed main_local main_progname

Index: src/usr.bin/ldd/ldd.c
diff -u src/usr.bin/ldd/ldd.c:1.16 src/usr.bin/ldd/ldd.c:1.17
--- src/usr.bin/ldd/ldd.c:1.16	Wed Mar  9 23:10:08 2011
+++ src/usr.bin/ldd/ldd.c	Fri Mar 25 18:07:07 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: ldd.c,v 1.16 2011/03/09 23:10:08 joerg Exp $	*/
+/*	$NetBSD: ldd.c,v 1.17 2011/03/25 18:07:07 joerg Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2000 The NetBSD Foundation, Inc.
@@ -62,7 +62,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: ldd.c,v 1.16 2011/03/09 23:10:08 joerg Exp $");
+__RCSID("$NetBSD: ldd.c,v 1.17 2011/03/25 18:07:07 joerg Exp $");
 #endif /* not lint */
 
 #include <sys/types.h>
@@ -313,3 +313,23 @@
 		msg = "Fatal error";
 	xerrx(1, "%s", msg);
 }
+
+void
+_rtld_shared_enter(void)
+{
+}
+
+void
+_rtld_shared_exit(void)
+{
+}
+
+void
+_rtld_exclusive_enter(void)
+{
+}
+
+void
+_rtld_exclusive_exit(void)
+{
+}

Reply via email to