This is the mail archive of the libc-alpha@sourceware.org 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.  ld.so 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 libpthread.so 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 libpthread.so 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 ld.so segfaults.
> 
> This patch hardens ld.so 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 ld.so 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]