On Fri, 16 Jun 2017 17:15:44 -0700
Jason Evans <[email protected]> wrote:
> On Fri, 16 Jun 2017 18:45:17 -0400
> Shawn Webb <[email protected]> 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
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"