Don't crash untraced calls via PLT in prelinked PPC64 binaries
authorPetr Machata <pmachata@redhat.com>
Fri, 10 Jan 2014 19:06:51 +0000 (20:06 +0100)
committerChanho Park <chanho61.park@samsung.com>
Fri, 22 Aug 2014 11:38:24 +0000 (20:38 +0900)
commit8ac2a52d993d7eda69c9906f98f113341c45ba23
treeddd4348abb84f6a2f796d4c18421698786e7490b
parente63b77105301a29d8a4929205849007b5ffb789d
Don't crash untraced calls via PLT in prelinked PPC64 binaries

In prelinked binaries, ltrace has to unprelinks PLT slots in order to
catch calls done through PLT.  This makes the calls done through these
slots invalid, because the special first PLT slot is not initialized,
and dynamic linker SIGSEGVs because of this.  Ltrace relies on
arranging breakpoints such that the dynamic linker is not actually
entered, and moves PC around itself to simulate the effects of a call
through PLT.

Originally, arch_elf_add_plt_entry was called only for symbols that
were actually traced.  Later this was changed and it's now called for
all PLT entries, and the resulting candidate list is filtered
afterwards.  This gives backends a chance to rename the symbol, as is
useful with IRELATIVE PLT calls, where symbol name may not be
available at all.  But the PPC backend was never updated to reflect
this, and unresolved all symbols for which arch_elf_add_plt_entry was
called, thus rendering _all_ PLT slots invalid, even those that
weren't later procted by breakpoints.  Thus calls done through any
untraced slots failed.

This patch fixes this problem by deferring the unprelinking of PLT
slots into the on_install hook of breakpoints.
sysdeps/linux-gnu/ppc/arch.h
sysdeps/linux-gnu/ppc/plt.c