Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 27 Oct 2017 18:08:41 +0300
From:      Konstantin Belousov <kostikbel@gmail.com>
To:        mmel@freebsd.org
Cc:        Dimitry Andric <dim@FreeBSD.org>, src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org, kib@freebsd.org
Subject:   Re: svn commit: r324938 - head/contrib/jemalloc/include/jemalloc/internal
Message-ID:  <20171027150841.GH2566@kib.kiev.ua>
In-Reply-To: <6eff6e66-4987-8753-105f-b6a5b8234ff3@freebsd.org>
References:  <201710232131.v9NLV4Rb068825@repo.freebsd.org> <38db6f4e-72b8-6ffd-4529-f15ca32bad54@freebsd.org> <6FD27DFB-5039-4E33-B131-EF5391DD1630@FreeBSD.org> <6eff6e66-4987-8753-105f-b6a5b8234ff3@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, Oct 27, 2017 at 02:53:26PM +0200, Michal Meloun wrote:
> Sorry for top posting
> That's pity, we have clear problem in rtld code :(
> See:
> -----------------------------------------------------
> RESCUE WITHOUT JEMALLOC_ALIGNED(16);
> -----------------------------------------------------
> Program Headers:
>   TLS            0xa732b0 0x00a832b0 0x00a832b0 0x00b40 0x011bc R   0x8
> Section Headers:
>    04     .tdata .tbss .init_array .fini_array .jcr .got
> Dump:
> 00a832b0 <__je_tsd_tls+0xa832b0>:
>   a832b0:       00000005
> 
> GDB
> (gdb) b tsd_fetch_impl
> Breakpoint 1 at 0x7c4c08: tsd_fetch_impl. (6 locations)
> (gdb) r
> Starting program: /usr/src/rescue.noalign sh
> 
> Breakpoint 1, tsd_fetch_impl (init=true, minimal=false) at
> /usr/src/contrib/jemalloc/include/jemalloc/internal/tsd.h:261
> 261             tsd_t *tsd = tsd_get(init);
> (gdb) n
> 263             if (!init && tsd_get_allocates() && tsd == NULL) {
> 
> (gdb) p tsd
> $1 = (tsd_t *) 0x20c83008
> 
> (gdb) p *tsd
> $2 = {state = 5 '\005', ....
> 
> (gdb) p *((tsd_t *)0x00a832b0)
> $3 = {state = 5 '\005', ...
> 
> 
> 
> -----------------------------------------------------
> RESCUE WITH JEMALLOC_ALIGNED(16);
> -----------------------------------------------------
> Program Headers:
>   TLS            0xa732b0 0x00a832b0 0x00a832b0 0x00b40 0x011bc R   0x10
> Section Headers:
>    04     .tdata .tbss .init_array .fini_array .jcr .got
> Dump:
> 00a832b0 <__je_tsd_tls+0xa832b0>:
>   a832b0:       00000005
> 
> GDB
> (gdb) b tsd_fetch_impl
> Breakpoint 1 at 0x7c4c08: tsd_fetch_impl. (6 locations)
> (gdb) r
> Starting program: /usr/obj/usr/src/rescue/rescue/rescue sh
> Breakpoint 1, tsd_fetch_impl (init=true, minimal=false) at
> /usr/src/contrib/jemalloc/include/jemalloc/internal/tsd.h:261
> 261             tsd_t *tsd = tsd_get(init);
> (gdb) n
> 263             if (!init && tsd_get_allocates() && tsd == NULL) {
> 
> (gdb) p tsd
> $1 = (tsd_t *) 0x20c83010
> 
> (gdb) p *tsd
> $2 = {state = 0 '\000', ...
> 
> (gdb) p *((tsd_t *)0x00a832b0)
> $3 = {state = 5 '\005', ...
> 
> !!!! BUT p *(tsd - 8 bytes) !!!!!!!!!!
> (gdb) p *((tsd_t *)0x20c83008)
> $4 = {state = 5 '\005', ...
> 
> -----------------------------------------------------
> So it's clear that:
> 
> - both binaries are valid, .tdata section have valid data.
> - requested alignment is propagated to binary.
> - .tdata section is properly loaded to memory because
>    p *((tsd_t *)0x00a832b0)  is {state = 5 '\005'
>    in both cases
> 
> - a per thread copy of .tdata respect requested alignment
>   but the original data was copied to  unaligned address.
>   because for aligned binary
>    p *tsd is {state = 0 '\000', ...
>    p *(tsd - 8 bytes) is {state = 5 '\005'
> 
> I'm right?
> Kib, please, can you help us?

Does it happen for rescue binary ?

Note that the binary is linked static, so the problem is in lib/libc/gen/tls.c
and not in rtld.  There, I do not see any real use of the phdr' p_align
value.

BTW, is rescue linked to libthr ?



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