Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 20 Jun 2017 00:36:16 -0700
From:      Jason Evans <jasone@canonware.com>
To:        Jason Evans <jasone@canonware.com>
Cc:        Shawn Webb <shawn.webb@hardenedbsd.org>, Jason Evans <jasone@FreeBSD.org>, src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   Re: svn commit: r319971 - in head: contrib/jemalloc contrib/jemalloc/doc contrib/jemalloc/include/jemalloc contrib/jemalloc/include/jemalloc/internal contrib/jemalloc/src include lib/libc/stdlib/jemalloc
Message-ID:  <20170620003616.d85c2fd028d40f2961282222@canonware.com>
In-Reply-To: <20170616171544.9b4a398cac3328f9bd6cd747@canonware.com>
References:  <201706150715.v5F7F6aT031218@repo.freebsd.org> <20170616224517.td7yiahzv2oxcpts@mutt-hbsd> <20170616171544.9b4a398cac3328f9bd6cd747@canonware.com>

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

On Fri, 16 Jun 2017 17:15:44 -0700
Jason Evans <jasone@canonware.com> wrote:
> On Fri, 16 Jun 2017 18:45:17 -0400
> Shawn Webb <shawn.webb@hardenedbsd.org> wrote:
> > On Thu, Jun 15, 2017 at 07:15:06AM +0000, Jason Evans wrote:
> > > Author: jasone
> > > Date: Thu Jun 15 07:15:05 2017
> > > New Revision: 319971
> > > URL: https://svnweb.freebsd.org/changeset/base/319971
> > > 
> > > Log:
> > >   Update jemalloc to 5.0.0.
> > 
> > This breaks buildworld for arm64:
> > 
> > /usr/obj/arm64.aarch64/scratch/fbsd/tmp/usr/bin/ld: error: sigsetjmp.pico:(function sigsetjmp): relocation R_AARCH64_CONDBR19 out of range
> > /usr/obj/arm64.aarch64/scratch/fbsd/tmp/usr/bin/ld: error: sigsetjmp.pico:(function siglongjmp): relocation R_AARCH64_CONDBR19 out of range
> > cc: error: linker command failed with exit code 1 (use -v to see invocation)
> > --- libc.so.7.full ---
> > *** [libc.so.7.full] Error code 1
> > 
> > make[4]: stopped in /scratch/fbsd/lib/libc
> 
> Indeed, this happens for me too with TARGET=arm64 TARGET_ARCH=aarch64.  I haven't found anything specifically about this error message, but it looks vaguely like the amd64-specific messages that happen when trying to link non-PIC object files into a shared library.  In src/lib/libc/aarch64/gen/sigsetjmp.S, we have two conditional jumps
> 
> 	b.eq	C_LABEL(_setjmp)
> 	[...]
> 	b.eq	C_LABEL(_longjmp)
> 
> Maybe there's a simple macro change that can make these relocatable jumps.  Alternatively, we could probably simplify the code by merging setjmp.S and sigsetjmp.S, so that PC-relative jumps could be used.

Given how arm handles similar branches, it seems like the correct fix would be to change these (and probably other branches) from e.g.

	b.eq	_C_LABEL(_setjmp)

to

	b.eq	PIC_SYM(_C_LABEL(_setjmp), PLT)

However, doing so triggers a clang crash.  PIC_SYM is explicitly defined for aarch64, but is otherwise unused.  It appears that we don't actually generate relocations, at least during initial linking.  As a side effect, we have an implicit dependency on all of libc's dependent symbols serendipitously being within some limited range of each other.  When using conditional branches, that range is +-1 MiB; for unconditional branches it is +-128 MiB.

The jemalloc update changed libc's layout, and the conditional branches exceeded the +-1 MiB range.  This latent bug is worked around in r320136, though it seems likely we have broader problems with how we build PIC libraries for arm64.

Jason


home | help

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