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) +{ +}