Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 27 Nov 2020 19:03:36 +0200
From:      Konstantin Belousov <kostikbel@gmail.com>
To:        Lev Serebryakov <lev@freebsd.org>
Cc:        FreeBSD Stable <freebsd-stable@freebsd.org>
Subject:   Re: 12-STABLE try to init thead-using libraries before threads and program crashes
Message-ID:  <X8ExaEliVSyArp0H@kib.kiev.ua>
In-Reply-To: <f6099be9-14d3-71b5-3a54-bd875f834926@FreeBSD.org>
References:  <f6099be9-14d3-71b5-3a54-bd875f834926@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, Nov 27, 2020 at 06:03:13PM +0300, Lev Serebryakov wrote:
>=20
>  I have locally-built net/samba413 port on 12-STABLE (r367937) which cras=
hes in library initialization code due to wrong library initialization orde=
r:
>=20
> (No debugging symbols found in /usr/local/bin/testparm)
> (gdb) b  _libpthread_init
> Function "_libpthread_init" not defined.
> Make breakpoint pending on future shared library load? (y or [n]) y
> Breakpoint 1 (_libpthread_init) pending.
> (gdb) run
> Starting program: /usr/local/bin/testparm
>=20
> Program received signal SIGSEGV, Segmentation fault.
> thr_malloc_lock (curthread=3D0x801e077d0) at /usr/src/lib/libthr/thread/t=
hr_malloc.c:66
> 66              curthread->locklevel++;
> (gdb) bt
> #0  thr_malloc_lock (curthread=3D0x801e077d0) at /usr/src/lib/libthr/thre=
ad/thr_malloc.c:66
> #1  __thr_calloc (num=3D1, size=3D96) at /usr/src/lib/libthr/thread/thr_m=
alloc.c:88
> #2  0x0000000801474843 in mutex_init (mutex=3D0x801072008, mutex_attr=3D<=
optimized out>, calloc_cb=3D<optimized out>) at /usr/src/lib/libthr/thread/=
thr_mutex.c:295
> #3  __Tthr_mutex_init (mutex=3D0x801072008, mutex_attr=3D<optimized out>)=
 at /usr/src/lib/libthr/thread/thr_mutex.c:395
> #4  0x00000008016d62fc in ?? () from /usr/local/lib/libgnutls.so.30
> #5  0x00000008016cfcb3 in ?? () from /usr/local/lib/libgnutls.so.30
> #6  0x00000008016d0077 in ?? () from /usr/local/lib/libgnutls.so.30
> #7  0x000000080103730d in objlist_call_init (list=3D<optimized out>, lock=
state=3D<optimized out>) at /usr/src/libexec/rtld-elf/rtld.c:2823
> #8  0x000000080103603d in _rtld (sp=3D0x7fffffffeb58, exit_proc=3D0x7ffff=
fffeb20, objp=3D0x7fffffffeb28) at /usr/src/libexec/rtld-elf/rtld.c:811
> #9  0x00000008010338c9 in rtld_start () at /usr/src/libexec/rtld-elf/amd6=
4/rtld_start.S:39
> #10 0x0000000000000000 in ?? ()
> (gdb)
>=20
>  Please note, that `_libpthread_init` HAS BEEN NOT CALLED before `_Tthr_m=
utex_init`.
>=20
>  Looks like some corner-case problem in rtld?
>=20
>  Link command for this program is:
>=20
> [3517/3660] Linking bin/default/source3/utils/testparm
> runner ['cc', 'source3/utils/testparm.c.41.o', '-o/wrkdirs/usr/ports/net/=
samba413/work/samba-4.13.1/bin/default/source3/utils/testparm', '-Wl,-Bstat=
ic', '-Wl,-Bdynamic', '-L/wrkdirs/usr/ports/net/samba413/work/samba-4.13.1/=
bin/default/source4/heimdal_build', '-L/wrkdirs/usr/ports/net/samba413/work=
/samba-4.13.1/bin/default/source4/lib/events', '-L/wrkdirs/usr/ports/net/sa=
mba413/work/samba-4.13.1/bin/default/lib/tdb_wrap', '-L/wrkdirs/usr/ports/n=
et/samba413/work/samba-4.13.1/bin/default/libcli/security', '-L/wrkdirs/usr=
/ports/net/samba413/work/samba-4.13.1/bin/default/librpc', '-L/wrkdirs/usr/=
ports/net/samba413/work/samba-4.13.1/bin/default/libcli/registry', '-L/wrkd=
irs/usr/ports/net/samba413/work/samba-4.13.1/bin/default/lib', '-L/wrkdirs/=
usr/ports/net/samba413/work/samba-4.13.1/bin/default/lib/dbwrap', '-L/wrkdi=
rs/usr/ports/net/samba413/work/samba-4.13.1/bin/default/lib/socket', '-L/wr=
kdirs/usr/ports/net/samba413/work/samba-4.13.1/bin/default/lib/param', '-L/=
wrkdirs/usr/ports/net/sam
> ba413/work/samba-4.13.1/bin/default/lib/messaging', '-L/wrkdirs/usr/ports=
/net/samba413/work/samba-4.13.1/bin/default/lib/util', '-L/wrkdirs/usr/port=
s/net/samba413/work/samba-4.13.1/bin/default/libcli/util', '-L/wrkdirs/usr/=
ports/net/samba413/work/samba-4.13.1/bin/default/lib/replace', '-L/wrkdirs/=
usr/ports/net/samba413/work/samba-4.13.1/bin/default/source3', '-L/usr/loca=
l/lib', '-L/usr/local/lib', '-L/usr/local/lib', '-L/usr/local/lib', '-L/usr=
/local/lib', '-L/usr/local/lib', '-lpopt-samba3-samba4', '-lsmbconf', '-lre=
place-samba4', '-lsamba-errors', '-lcmdline-contexts-samba4', '-lsamba-util=
', '-lsamba3-util-samba4', '-lmessages-dgm-samba4', '-lsys-rw-samba4', '-lm=
essages-util-samba4', '-liov-buf-samba4', '-lsamba-hostconfig', '-lsocket-b=
locking-samba4', '-linterfaces-samba4', '-ldbwrap-samba4', '-ltevent-util',=
 '-lsamba-sockets-samba4', '-lutil-reg-samba4', '-lutil-tdb-samba4', '-lndr=
', '-ltalloc-report-printf-samba4', '-lserver-id-db-samba4', '-lsamba-clust=
er-support-samba4', '-lC
> HARSET3-samba4', '-lsamba-security-samba4', '-lsmbd-s
> him-samba4', '-lsamba-debug-samba4', '-lgenrand-samba4', '-ltime-basic-sa=
mba4', '-lutil-setid-samba4', '-lmsghdr-samba4', '-lserver-role-samba4', '-=
ltdb-wrap-samba4', '-levents-samba4', '-lndr-nbt', '-lroken-samba4', '-lexe=
cinfo', '-ltevent', '-ltalloc', '-lpthread', '-lutil', '-lunwind-generic', =
'-lunwind', '-liconv', '-lz', '-ltdb', '-lpopt', '-lgnutls', '-ltalloc', '-=
fstack-protector-strong', '-L/usr/local/lib', '-pie', '-Wl,-z,relro,-z,now'=
, '-Wl,-no-undefined', '-Wl,--export-dynamic']
>=20

libthr is cleanly linked too early, it should come after all consumers.
Anyway, try this.

diff --git a/lib/libthr/thread/thr_mutex.c b/lib/libthr/thread/thr_mutex.c
index 57984ef6d0e..303386db7fe 100644
--- a/lib/libthr/thread/thr_mutex.c
+++ b/lib/libthr/thread/thr_mutex.c
@@ -384,6 +384,8 @@ __Tthr_mutex_init(pthread_mutex_t * __restrict mutex,
 	struct pthread_mutex *pmtx;
 	int ret;
=20
+	_thr_check_init();
+
 	if (mutex_attr !=3D NULL) {
 		ret =3D mutex_check_attr(*mutex_attr);
 		if (ret !=3D 0)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?X8ExaEliVSyArp0H>