The relative branch directly to __libc_vfork results in an relocation
that cannot be resolved. Specifically a R_MICROBLAZE_64_PCREL relocation
is created for this branch, however for MicroBlaze R_MICROBLAZE_64_PCREL
type relocations symbols are not resolved. Additionally due to the
branch being located in the .text section the instruction cannot be
rewritten as the section is not writable, and causes a segfault at
runtime when loading libpthread.
To resolve this issue, ensure the branch is done using PLT. This removes
the need to modify the instruction and trades the R_MICROBLAZE_64_PCREL
for a more common R_MICROBLAZE_JUMP via the PLT.
[BZ #21779]
* sysdeps/unix/sysv/linux/microblaze/pt-vfork.S: Branch using PLT.
libpthread used to have its own vfork implementation that differed
from libc's only in having a pointless micro-optimization. There is
no longer any use to having a separate copy in libpthread, but the
historical ABI requires a compatibility shim. microblaze was trying
to be slightly too clever about how it did this, and tickled a linker
bug. The linker bug should get fixed eventually, but there's no
reason for us to keep tickling it in the meantime.
This doesn't reuse the generic pt-vfork.c because microblaze doesn't
have IFUNC support yet, and it doesn't reuse aarch64/pt-vfork.c
because that fails to generate a tailcall (with GCC 7.1.1).
* sysdeps/unix/sysv/linux/microblaze/pt-vfork.S: Don't include
alpha/pt-vfork.S. Provide own compat shim for vfork and __vfork.
* sysdeps/unix/sysv/linux/microblaze/vfork.S: Add __libc_vfork alias.
* sysdeps/unix/sysv/linux/microblaze/localplt.data:
libpthread.so no longer references __errno_location.