NetBSD Problem Report #43005

From wiz@yt.nih.at  Thu Mar 18 21:10:10 2010
Return-Path: <wiz@yt.nih.at>
Received: from mail.netbsd.org (mail.netbsd.org [204.152.190.11])
	by www.NetBSD.org (Postfix) with ESMTP id 5630663B11D
	for <gnats-bugs@gnats.netbsd.org>; Thu, 18 Mar 2010 21:10:10 +0000 (UTC)
Message-Id: <20100318211004.55A6139FB32@yt.nih.at>
Date: Thu, 18 Mar 2010 22:10:04 +0100 (CET)
From: Thomas Klausner <wiz@NetBSD.org>
Reply-To: Thomas Klausner <wiz@NetBSD.org>
To: gnats-bugs@gnats.NetBSD.org
Subject: ld.so needs locking
X-Send-Pr-Version: 3.95

>Number:         43005
>Category:       lib
>Synopsis:       ld.so needs locking
>Confidential:   no
>Severity:       critical
>Priority:       high
>Responsible:    lib-bug-people
>State:          closed
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Thu Mar 18 21:15:00 +0000 2010
>Closed-Date:    Fri Apr 02 07:29:13 +0000 2010
>Last-Modified:  Sat Mar 17 18:30:02 +0000 2012
>Originator:     Thomas Klausner
>Release:        NetBSD 5.99.24
>Organization:
Curiosity is the very basis of education and if you tell me that 
curiosity killed the cat, I say only that the cat died nobly.
- Arnold Edinborough
>Environment:


System: NetBSD yt.nih.at 5.99.24 NetBSD 5.99.24 (YT) #40: Sun Mar 14 18:41:13 CET 2010 wiz@yt.nih.at:/archive/cvs/src/sys/arch/amd64/compile/obj/YT amd64
Architecture: x86_64
Machine: amd64
>Description:
Since the introduction of the negative symbol cache, ld.so is less thread
friendly.

This affects e.g. gimp, which most of the time immediately coredumps for me.
>How-To-Repeat:
Update to -current in March, start gimp.

Backtrace with MALLOC_DEBUG in ld.elf_so shows that two threads meet
in imalloc in xmalloc.c:

Program terminated with signal 11, Segmentation fault.
#0  0x00007f7ffdc06f1e in imalloc (nbytes=440) at xmalloc.c:242
242             nextf[bucket] = op->ov_next;
(gdb) bt
#0  0x00007f7ffdc06f1e in imalloc (nbytes=440) at xmalloc.c:242
#1  0x00007f7ffdc074a8 in xmalloc (size=440) at xmalloc.c:460
#2  0x00007f7ffdc06ac5 in _rtld_symlook_default (name=0x437f1a "gegl_config",
    hash=101315287, refobj=0x7f7ffdffa000, defobj_out=0x7f7fffffd0c0,
    in_plt=true) at symbol.c:415
#3  0x00007f7ffdc068c5 in _rtld_find_symdef (symnum=2862,
    refobj=0x7f7ffdffa000, defobj_out=0x7f7fffffd180, in_plt=true)
    at symbol.c:334
#4  0x00007f7ffdc069ce in _rtld_find_plt_symdef (symnum=2862,
    obj=0x7f7ffdffa000, defobj=0x7f7fffffd180, imm=true) at symbol.c:377
#5  0x00007f7ffdc04024 in _rtld_relocate_plt_object (obj=0x7f7ffdffa000,
    rela=0x458ba0, tp=0x7f7fffffd1d0)
    at /usr/src/libexec/ld.elf_so/arch/x86_64/mdreloc.c:266
#6  0x00007f7ffdc03fb6 in _rtld_bind (obj=0x7f7ffdffa000, reloff=931)
    at /usr/src/libexec/ld.elf_so/arch/x86_64/mdreloc.c:294
#7  0x00007f7ffdc03b11 in _rtld_bind_start () from /usr/libexec/ld.elg_so
#8  0x00007f7ff2e8bc55 in idalloc (ptr=<value optimized out>)
    at /archive/cvs/src/lib/libc/stdlib/jemalloc.c:2554
#9  0x0000000000696769 in gimp_gegl_init ()
#10 0x0000000000466ddc in app_run ()
#11 0x0000000000467c38 in main ()

(gdb) thread 6
[Switching to thread 6 (process 342059)]#0  0x00007f7ffdc06f1e in imalloc (
    nbytes=440) at xmalloc.c:242
242             nextf[bucket] = op->ov_next;
(gdb) bt
#0  0x00007f7ffdc06f1e in imalloc (nbytes=440) at xmalloc.c:242
#1  0x00007f7ffdc074a8 in xmalloc (size=440) at xmalloc.c:460
#2  0x00007f7ffdc06ac5 in _rtld_symlook_default (
    name=0x4324a2 "g_strdup_vprintf", hash=116781414, refobj=0x7f7ffdffa000,
    defobj_out=0x7f7fef7ff0a0, in_plt=true) at symbol.c:415
#3  0x00007f7ffdc068c5 in _rtld_find_symdef (symnum=2911,
    refobj=0x7f7ffdffa000, defobj_out=0x7f7fef7ff160, in_plt=true)
    at symbol.c:334
#4  0x00007f7ffdc069ce in _rtld_find_plt_symdef (symnum=2911,
    obj=0x7f7ffdffa000, defobj=0x7f7fef7ff160, imm=true) at symbol.c:377
#5  0x00007f7ffdc04024 in _rtld_relocate_plt_object (obj=0x7f7ffdffa000,
    rela=0x458cf0, tp=0x7f7fef7ff1b0)
    at /usr/src/libexec/ld.elf_so/arch/x86_64/mdreloc.c:266
#6  0x00007f7ffdc03fb6 in _rtld_bind (obj=0x7f7ffdffa000, reloff=945)
    at /usr/src/libexec/ld.elf_so/arch/x86_64/mdreloc.c:294
#7  0x00007f7ffdc03b11 in _rtld_bind_start () from /usr/libexec/ld.elg_so
#8  0x00007f7ffc713080 in ?? ()
#9  0x00007f7ffc713000 in ?? ()
#10 0x00000000000000ec in ?? ()
#11 0x0000000000000000 in ?? ()
>Fix:
Add locking to ld.so.

>Release-Note:

>Audit-Trail:

From: Martin Husemann <martin@duskware.de>
To: gnats-bugs@NetBSD.org
Cc: 
Subject: Re: lib/43005: ld.so needs locking
Date: Thu, 18 Mar 2010 22:27:39 +0100

 We need to add TLS support, atomic changes/retries etc...
 There is no easy way to use regular mutices (obvious) or even spin locks
 (RT-threads).

 Martin

From: Roy Marples <roy@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/43005 CVS commit: src/libexec/ld.elf_so
Date: Thu, 18 Mar 2010 22:17:55 +0000

 Module Name:	src
 Committed By:	roy
 Date:		Thu Mar 18 22:17:55 UTC 2010

 Modified Files:
 	src/libexec/ld.elf_so: Makefile rtld.c rtld.h symbol.c

 Log Message:
 Use alloca(3) instead of local xmalloc for creating our DoneLists.
 This allows threaded programs to use us a little better, PR lib/43005.
 We need to disable SSP when using alloca.


 To generate a diff of this commit:
 cvs rdiff -u -r1.93 -r1.94 src/libexec/ld.elf_so/Makefile
 cvs rdiff -u -r1.129 -r1.130 src/libexec/ld.elf_so/rtld.c
 cvs rdiff -u -r1.89 -r1.90 src/libexec/ld.elf_so/rtld.h
 cvs rdiff -u -r1.51 -r1.52 src/libexec/ld.elf_so/symbol.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

From: Thomas Klausner <wiz@NetBSD.org>
To: gnats-bugs@NetBSD.org
Cc: 
Subject: Re: PR/43005 CVS commit: src/libexec/ld.elf_so
Date: Sun, 21 Mar 2010 20:59:58 +0100

 On Thu, Mar 18, 2010 at 10:20:04PM +0000, Roy Marples wrote:
 > The following reply was made to PR lib/43005; it has been noted by GNATS.
 > 
 > From: Roy Marples <roy@netbsd.org>
 > To: gnats-bugs@gnats.NetBSD.org
 > Cc: 
 > Subject: PR/43005 CVS commit: src/libexec/ld.elf_so
 > Date: Thu, 18 Mar 2010 22:17:55 +0000
 > 
 >  Module Name:	src
 >  Committed By:	roy
 >  Date:		Thu Mar 18 22:17:55 UTC 2010
 >  
 >  Modified Files:
 >  	src/libexec/ld.elf_so: Makefile rtld.c rtld.h symbol.c
 >  
 >  Log Message:
 >  Use alloca(3) instead of local xmalloc for creating our DoneLists.
 >  This allows threaded programs to use us a little better, PR lib/43005.
 >  We need to disable SSP when using alloca.

 Thank you!

 I can now reliably start gimp again.
  Thomas

State-Changed-From-To: open->closed
State-Changed-By: wiz@NetBSD.org
State-Changed-When: Fri, 02 Apr 2010 07:29:13 +0000
State-Changed-Why:
gimp works again, thanks.
If someone feels locking should be added anyway, feel free to reopen
the PR.


From: "Manuel Bouyer" <bouyer@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/43005 CVS commit: [netbsd-5] src
Date: Sat, 17 Mar 2012 18:28:42 +0000

 Module Name:	src
 Committed By:	bouyer
 Date:		Sat Mar 17 18:28:39 UTC 2012

 Modified Files:
 	src/distrib/sets/lists/comp [netbsd-5]: mi
 	src/include [netbsd-5]: link_elf.h
 	src/lib/libc/dlfcn [netbsd-5]: dlfcn_elf.c
 	src/libexec/ld.elf_so [netbsd-5]: Makefile headers.c load.c
 	    map_object.c reloc.c rtld.c rtld.h symbol.c
 	src/libexec/ld.elf_so/arch/alpha [netbsd-5]: alpha_reloc.c
 	src/libexec/ld.elf_so/arch/arm [netbsd-5]: mdreloc.c
 	src/libexec/ld.elf_so/arch/hppa [netbsd-5]: hppa_reloc.c
 	src/libexec/ld.elf_so/arch/i386 [netbsd-5]: mdreloc.c
 	src/libexec/ld.elf_so/arch/m68k [netbsd-5]: mdreloc.c
 	src/libexec/ld.elf_so/arch/mips [netbsd-5]: mips_reloc.c
 	src/libexec/ld.elf_so/arch/powerpc [netbsd-5]: ppc_reloc.c
 	src/libexec/ld.elf_so/arch/sh3 [netbsd-5]: mdreloc.c
 	src/libexec/ld.elf_so/arch/sparc [netbsd-5]: mdreloc.c
 	src/libexec/ld.elf_so/arch/sparc64 [netbsd-5]: mdreloc.c
 	src/libexec/ld.elf_so/arch/vax [netbsd-5]: mdreloc.c
 	src/libexec/ld.elf_so/arch/x86_64 [netbsd-5]: mdreloc.c
 	src/rescue [netbsd-5]: list.ldd
 	src/share/man/man3 [netbsd-5]: Makefile
 	src/sys/sys [netbsd-5]: exec_elf.h
 	src/usr.bin/ldd [netbsd-5]: ldd.c
 Added Files:
 	src/share/man/man3 [netbsd-5]: dl_iterate_phdr.3

 Log Message:
 Pull up following revision(s) via patch (requested by skrll in ticket #1724):
 	rescue/list.ldd: revision 1.4
 	lib/libc/dlfcn/dlfcn_elf.c: revision 1.7
 	libexec/ld.elf_so/arch/mips/mips_reloc.c: revision 1.57
 	distrib/sets/lists/comp/mi: revision 1.1512
 	share/man/man3/Makefile: revision 1.56
 	libexec/ld.elf_so/arch/mips/mips_reloc.c: revision 1.58
 	usr.bin/ldd/ldd.c: revision 1.15
 	libexec/ld.elf_so/rtld.h: revision 1.84
 	share/man/man3/dl_iterate_phdr.3: revision 1.1
 	libexec/ld.elf_so/rtld.c: revision 1.129
 	libexec/ld.elf_so/arch/powerpc/ppc_reloc.c: revision 1.44
 	libexec/ld.elf_so/rtld.h: revision 1.89
 	libexec/ld.elf_so/arch/x86_64/mdreloc.c: revision 1.36
 	libexec/ld.elf_so/map_object.c: revision 1.41
 	libexec/ld.elf_so/arch/x86_64/mdreloc.c: revision 1.37
 	libexec/ld.elf_so/arch/sparc64/mdreloc.c: revision 1.46
 	include/link_elf.h: revision 1.10
 	libexec/ld.elf_so/arch/i386/mdreloc.c: revision 1.29
 	libexec/ld.elf_so/arch/vax/mdreloc.c: revision 1.26
 	libexec/ld.elf_so/arch/alpha/alpha_reloc.c: revision 1.34
 	libexec/ld.elf_so/arch/hppa/hppa_reloc.c: revision 1.31
 	libexec/ld.elf_so/arch/alpha/alpha_reloc.c: revision 1.35
 	libexec/ld.elf_so/Makefile: revision 1.94
 	libexec/ld.elf_so/arch/hppa/hppa_reloc.c: revision 1.32
 	libexec/ld.elf_so/Makefile: revision 1.95
 	libexec/ld.elf_so/arch/arm/mdreloc.c: revision 1.31
 	libexec/ld.elf_so/Makefile: revision 1.96
 	libexec/ld.elf_so/arch/arm/mdreloc.c: revision 1.32
 	libexec/ld.elf_so/reloc.c: revision 1.98
 	libexec/ld.elf_so/arch/arm/mdreloc.c: revision 1.33
 	sys/sys/exec_elf.h: revision 1.106
 	libexec/ld.elf_so/rtld.c: revision 1.130
 	libexec/ld.elf_so/load.c: revision 1.37
 	libexec/ld.elf_so/rtld.c: revision 1.131
 	libexec/ld.elf_so/load.c: revision 1.38
 	libexec/ld.elf_so/rtld.h: revision 1.90
 	libexec/ld.elf_so/headers.c: revision 1.36
 	libexec/ld.elf_so/rtld.h: revision 1.95
 	libexec/ld.elf_so/arch/i386/mdreloc.c: revision 1.30
 	libexec/ld.elf_so/arch/m68k/mdreloc.c: revision 1.25
 	libexec/ld.elf_so/symbol.c: revision 1.50
 	libexec/ld.elf_so/symbol.c: revision 1.51
 	libexec/ld.elf_so/arch/sparc/mdreloc.c: revision 1.43
 	libexec/ld.elf_so/symbol.c: revision 1.52
 	libexec/ld.elf_so/arch/sh3/mdreloc.c: revision 1.27
 	libexec/ld.elf_so/symbol.c: revision 1.54
 PR/39240: Satoshi Suetake: Don't fail when attempting to resolve weak symbols
 when we are doing immediate binding, leave them alone and they will be dealt
 with later during lazy binding. From skrll@
 Implement negative cache checks for symbol lookups.
 Uses the Donelist idea from FreeBSD.
 Use alloca(3) instead of local xmalloc for creating our DoneLists.
 This allows threaded programs to use us a little better, PR lib/43005.
 Implement dl_iterate_phdr.
 Somewhat taken from FreeBSD. Manual page from OpenBSD.


 To generate a diff of this commit:
 cvs rdiff -u -r1.1201.2.17 -r1.1201.2.18 src/distrib/sets/lists/comp/mi
 cvs rdiff -u -r1.7.28.1 -r1.7.28.2 src/include/link_elf.h
 cvs rdiff -u -r1.5.32.1 -r1.5.32.2 src/lib/libc/dlfcn/dlfcn_elf.c
 cvs rdiff -u -r1.87.2.1 -r1.87.2.2 src/libexec/ld.elf_so/Makefile
 cvs rdiff -u -r1.26.10.1 -r1.26.10.2 src/libexec/ld.elf_so/headers.c
 cvs rdiff -u -r1.35 -r1.35.12.1 src/libexec/ld.elf_so/load.c
 cvs rdiff -u -r1.36.4.2 -r1.36.4.3 src/libexec/ld.elf_so/map_object.c
 cvs rdiff -u -r1.96.4.2 -r1.96.4.3 src/libexec/ld.elf_so/reloc.c
 cvs rdiff -u -r1.123.2.2 -r1.123.2.3 src/libexec/ld.elf_so/rtld.c
 cvs rdiff -u -r1.79.4.3 -r1.79.4.4 src/libexec/ld.elf_so/rtld.h
 cvs rdiff -u -r1.47.4.2 -r1.47.4.3 src/libexec/ld.elf_so/symbol.c
 cvs rdiff -u -r1.31 -r1.31.4.1 src/libexec/ld.elf_so/arch/alpha/alpha_reloc.c
 cvs rdiff -u -r1.28 -r1.28.4.1 src/libexec/ld.elf_so/arch/arm/mdreloc.c
 cvs rdiff -u -r1.27 -r1.27.4.1 src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c
 cvs rdiff -u -r1.26 -r1.26.4.1 src/libexec/ld.elf_so/arch/i386/mdreloc.c
 cvs rdiff -u -r1.22 -r1.22.4.1 src/libexec/ld.elf_so/arch/m68k/mdreloc.c
 cvs rdiff -u -r1.53 -r1.53.4.1 src/libexec/ld.elf_so/arch/mips/mips_reloc.c
 cvs rdiff -u -r1.41 -r1.41.4.1 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c
 cvs rdiff -u -r1.24 -r1.24.4.1 src/libexec/ld.elf_so/arch/sh3/mdreloc.c
 cvs rdiff -u -r1.41 -r1.41.4.1 src/libexec/ld.elf_so/arch/sparc/mdreloc.c
 cvs rdiff -u -r1.43 -r1.43.4.1 src/libexec/ld.elf_so/arch/sparc64/mdreloc.c
 cvs rdiff -u -r1.23 -r1.23.4.1 src/libexec/ld.elf_so/arch/vax/mdreloc.c
 cvs rdiff -u -r1.32 -r1.32.4.1 src/libexec/ld.elf_so/arch/x86_64/mdreloc.c
 cvs rdiff -u -r1.1.2.2 -r1.1.2.3 src/rescue/list.ldd
 cvs rdiff -u -r1.32 -r1.32.2.1 src/share/man/man3/Makefile
 cvs rdiff -u -r0 -r1.2.10.2 src/share/man/man3/dl_iterate_phdr.3
 cvs rdiff -u -r1.95 -r1.95.10.1 src/sys/sys/exec_elf.h
 cvs rdiff -u -r1.2.12.3 -r1.2.12.4 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.

>Unformatted:

NetBSD Home
NetBSD PR Database Search

(Contact us) $NetBSD: query-full-pr,v 1.39 2013/11/01 18:47:49 spz Exp $
$NetBSD: gnats_config.sh,v 1.8 2006/05/07 09:23:38 tsutsui Exp $
Copyright © 1994-2007 The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.