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 <[email protected]>
@@ -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)
+{
+}