Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 13 Mar 2012 14:17:52 +0200
From:      Konstantin Belousov <kostikbel@gmail.com>
To:        Alexandre Martins <alexandre.martins@netasq.com>
Cc:        freebsd-current@freebsd.org
Subject:   Re: Double free() in libc or gdb ?
Message-ID:  <20120313121752.GP75778@deviant.kiev.zoral.com.ua>
In-Reply-To: <201203131108.43815.alexandre.martins@netasq.com>
References:  <201203121750.36937.alexandre.martins@netasq.com> <20120312175555.GE75778@deviant.kiev.zoral.com.ua> <201203131108.43815.alexandre.martins@netasq.com>

next in thread | previous in thread | raw e-mail | index | archive | help

--Rf8/v0qwcLLbLc6B
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Tue, Mar 13, 2012 at 11:08:40AM +0100, Alexandre Martins wrote:
> On Monday 12 March 2012 18:55:55 Konstantin Belousov wrote:
> > On Mon, Mar 12, 2012 at 05:50:33PM +0100, Alexandre Martins wrote:
> > > Dear all,
> > >=20
> > > I'm currently having some trouble with the dynamic loader.
> > >=20
> > > I have the libc compilled with "MALLOC_DEBUG" flag to detect double f=
ree.
> > > When i run this piece of code (attached file) thought GDB, i have this
> > > assertion :
> > >=20
> > > Assertion failed: ((run->regs_mask[elm] & (1U << bit)) =3D=3D 0), fun=
ction
> > > arena_run_reg_dalloc, file /usr/src/lib/libc/stdlib/malloc.c, line 25=
43.
> > >=20
> > > But when i run the same binary without GDB, no assert.
> > >=20
> > > I'm very confused. Can you help me to debug that ?
> >=20
> > There is no attachment.  Put the source somewhere on web.
>=20
> Sorry, I'll past code here :
>=20
> first.c:
> ____________________
> #include <stdio.h>
>=20
> void print_name(void)
> {
>         printf("I'm " __FILE__ " at line %d\n", __LINE__);
> }
> ____________________
>=20
> second.c
> ____________________
> #include <stdio.h>
>=20
> void second_name(void)
> {
>         printf("I'm " __FILE__ " at line %d\n", __LINE__);
> }
>=20
> void print_name(void)
> {
>         printf("I'm " __FILE__ " at line %d\n", __LINE__);
> }
> ____________________
>=20
> main.c
> ____________________
> #include <stdio.h>
> #include <dlfcn.h>
>=20
> extern void print_name(void);
>=20
> int main(int argc, char *argv[])
> {
>         void (*second_name)(void);
>         void *handle;
>         int count =3D 0;
>=20
>         while(42)
>         {
>                 print_name();
>                 handle =3D dlopen("second.so", RTLD_NOW);
>                 print_name();
>                 if (handle !=3D NULL)
>                 {
>                         second_name =3D dlsym(handle, "second_name");
>                         if (second_name !=3D NULL)
>                         {
>                                 printf("second : ");
>                                 second_name();
>                         }
>                         dlclose(handle);
>                 }
>                 else
>                         fprintf(stderr, "Error : %s\n", dlerror());
>         }
> }
> ____________________
>=20
> Compilation and execution :
>=20
> gcc -shared -O0 -g second.c -o second.so
> gcc -shared -O0 -g first.c -o libfirst.so
> gcc -O0 -g toto.c -lfirst -L. -o test
> export LD_LIBRARY_PATH=3D$PWD
> gdb ./test
>=20
First, the libc malloc is not used inside rtld, so assertion which you
see points to somebody else. This somebody could be the stdio in your
example, or it could be gdb.

On the HEAD r232862, I indeed get the assertion, that obviously comes
from gdb. So this is a bug in gdb. Probably, try devel/gdb from ports,
I hardly can help you with gdb bug.

--Rf8/v0qwcLLbLc6B
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.12 (FreeBSD)

iEYEARECAAYFAk9fOvAACgkQC3+MBN1Mb4jmzgCgo006UjpbIM1UG6N+2lx99fsU
sZMAoIAFj4Z/tdepK7LALe4BsQe7VJaG
=GdWI
-----END PGP SIGNATURE-----

--Rf8/v0qwcLLbLc6B--



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