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:
(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.