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

Jason Evans jasone at canonware.com
Tue Jun 20 07:36:25 UTC 2017


On Fri, 16 Jun 2017 17:15:44 -0700
Jason Evans <jasone at canonware.com> wrote:
> On Fri, 16 Jun 2017 18:45:17 -0400
> Shawn Webb <shawn.webb at 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


More information about the svn-src-all mailing list