Port-powerpc archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: powerpc64 rescue/rescue link failures
> On Jan 11, 2015, at 8:23 PM, Dennis Ferguson <dennis.c.ferguson%gmail.com@localhost> wrote:
>
>
> On 10 Jan, 2015, at 17:24 , Christos Zoulas <christos%astron.com@localhost> wrote:
>>> I can fix this by brute force with the attached patch, which
>>> inlines __cerror() everywhere it is used, but I was wondering
>>> if there was a better way. I see .hidden sometimes being used
>>> for this but I have no idea if, or how, that might help this
>>> case.
>>
>> The way this has been done so far is similar, basically giving each
>> library with syscall stubs its own copy of cerror...
>>
>> find /usr/src/lib -name Makefile\* -exec grep cerror {} +
>> /usr/src/lib/libc/sys/Makefile.inc: syscall.S __syscall.S __clone.S cerror.S
>> /usr/src/lib/libposix/sys/Makefile.inc:SRCS+= cerror.S
>> /usr/src/lib/libposix/sys/Makefile.inc:CPPFLAGS+= -D__cerror=__posix_cerror -I${LIBCDIR} -D_REENTRANT
>> /usr/src/lib/librt/sys/Makefile.inc:SRCS+= cerror.S
>> /usr/src/lib/librt/sys/Makefile.inc:CPPFLAGS+= -D__cerror=__rt_cerror -I${LIBCDIR} -D_REENTRANT
>
> So after reading through
>
> http://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi-1.9.html
>
> I decided brute force is probably the only way to fix rescue/rescue,
> and is probably a good idea anyway.
>
> I'll write down the reasoning in case I'm wrong. For the branch from
> the syscall stub to __cerror() to work two things need to be true:
>
> 1. __cerror() must be reachable from the syscall stub with a pc-relative
> branch.
> 2. Both the stub and __cerror() need to be linked to use the same TOC.
>
> If either of these is not true then ld needs to generate a stub for
> the call to use instead, and that stub must be called with a regular
> branch-and-link function call rather than a branch that doesn't return
> to the call site.
>
> Making sure both the syscall stub and __cerror are in the same executable
> or shared object should almost always be sufficient to satisfy 1. (the span
> of a pc-relative branch is 64 MB), but is sufficient for 2. only if the
> shared object or executable has a single TOC. Since the size of a TOC
> is limited to 64 kB an executable that needs more than that will have
> more than one TOC and will need to make stubbed calls internally as well.
> That's the problem with rescue:
>
> b1$ powerpc64--netbsd-objdump -h lib/libc.so | grep .got
> 20 .got 000086f8 000000000021a4c8 000000000021a4c8 0020a4c8 2**3
> b1$ powerpc64--netbsd-objdump -h usr/lib/libposix.so | grep .got
> 20 .got 00000068 0000000000011388 0000000000011388 00001388 2**3
> b1$ powerpc64--netbsd-objdump -h usr/lib/librt.so | grep .got
> 21 .got 00000098 0000000000013aa0 0000000000013aa0 00003aa0 2**3
> b1$ powerpc64--netbsd-objdump -h rescue/cp | grep .got
> 11 .got 0003fc38 00000000107ab730 00000000107ab730 006fb730 2**3
>
> Rescue needs more than one TOC, making rescue work with the branch
> would seem to require some linker magic to make all syscall stubs
> in the executable end up with the same TOC as __cerror(), and that
> linker magic doesn't seem to exist.
>
> So, assuming that's true, that leaves converting syscall stubs to
> branch-and-link to __cerror() instead or just inlining __cerror() in
> the syscall code as the only options for rescue (and maybe libc if
> it grows enough to have the problem too; it's over half way there
> already). Doing a branch-and-link isn't sensible, however, since
> that also requires building a stack frame prior to the call which
> is the majority of the work the _REENTRANT branch of the __cerror()
> code is doing anyway. Just including the __cerror() code in the
> syscall stub is only a few instructions more, and eliminates
> __cerror() altogether.
>
> The nice side effect of doing this is that all other
> powerpc64-specific workarounds for this should now, in principle,
> be unnecessary. I don't know if the cerror copies were also
> needed for some other architecture (like 32-bit powerpc?) though.
I have a fix for this in a tree on a box waiting for a new power supply.
Home |
Main Index |
Thread Index |
Old Index