This is the mail archive of the mailing list for the glibc project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Harden powerpc64 elf_machine_fixup_plt

On Fri, 2015-03-20 at 10:22 +1030, Alan Modra wrote:
> IFUNC is difficult to correctly implement on any target needing a GOT
> to support position independent code, due to the dependency on order
> of dynamic relocations. should be changed to apply IFUNC
> relocations last, globally, because without that it is actually
> impossible to write an IFUNC resolver in C that works in all
> situations.  Case in point, vfork in is an IFUNC with
> the resolver returning &__libc_vfork.  (system and fork are similar.)
> If another shared library, libA say, uses vfork then it is quite
> possible that hasn't been dynamically relocated before
> the unfortunate libA is dynamically relocated.  In that case the GOT
> entry for &__libc_vfork is still zero, so the IFUNC resolver returns
> NULL.  LD_BIND_NOW=1 results in libA PLT dynamic relocations being
> applied using this NULL value and segfaults.
> This patch hardens to not segfault on a NULL from an IFUNC
> resolver.  It also fixes a problem with undefined weak.  If you leave
> the plt entry as-is for undefined weak then if the entry is ever
> called it will loop in rather than segfaulting.
> Regression tested powerpc64-linux.
> 	* sysdeps/powerpc/powerpc64/dl-machine.h (elf_machine_fixup_plt):
> 	Don't segfault if ifunc resolver returns a NULL.  Do set plt to
> 	zero for undefined weak.
> 	(elf_machine_plt_conflict): Similarly.

I have reviewed this patch and agree it should committed.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]