* sysdeps/powerpc/powerpc64/dl-machine.h (elf_machine_type_class):

Always set ELF_RTYPE_CLASS_PLT.
	(elf_machine_lookup_noexec_p, elf_machine_lookup_noplt_p): Delete.
This commit is contained in:
Ulrich Drepper 2008-04-10 18:26:16 +00:00
parent 13d83320ff
commit d2207f32b1
2 changed files with 31 additions and 20 deletions

View file

@ -1,3 +1,9 @@
2008-02-21 Alan Modra <amodra@bigpond.net.au>
* sysdeps/powerpc/powerpc64/dl-machine.h (elf_machine_type_class):
Always set ELF_RTYPE_CLASS_PLT.
(elf_machine_lookup_noexec_p, elf_machine_lookup_noplt_p): Delete.
2008-04-03 Steven Munroe <sjmunroe@us.ibm.com> 2008-04-03 Steven Munroe <sjmunroe@us.ibm.com>
* sysdeps/powerpc/powerpc32/power4/hp-timing.c: New file. * sysdeps/powerpc/powerpc32/power4/hp-timing.c: New file.

View file

@ -246,30 +246,35 @@ BODY_PREFIX "_dl_start_user:\n" \
" " END_2(_dl_start_user) "\n" \ " " END_2(_dl_start_user) "\n" \
" .popsection"); " .popsection");
/* Nonzero iff TYPE should not be allowed to resolve to one of /* ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to
the main executable's symbols, as for a COPY reloc. */ one of the main executable's symbols, as for a COPY reloc.
#define elf_machine_lookup_noexec_p(type) ((type) == R_PPC64_COPY)
/* Nonzero iff TYPE describes relocation of a PLT entry, so To make function pointer comparisons work on most targets, the
PLT entries should not be allowed to define the value. */ relevant ABI states that the address of a non-local function in a
#define elf_machine_lookup_noplt_p(type) ((type) == R_PPC64_JMP_SLOT) dynamically linked executable is the address of the PLT entry for
that function. This is quite reasonable since using the real
function address in a non-PIC executable would typically require
dynamic relocations in .text, something to be avoided. For such
functions, the linker emits a SHN_UNDEF symbol in the executable
with value equal to the PLT entry address. Normally, SHN_UNDEF
symbols have a value of zero, so this is a clue to ld.so that it
should treat these symbols specially. For relocations not in
ELF_RTYPE_CLASS_PLT (eg. those on function pointers), ld.so should
use the value of the executable SHN_UNDEF symbol, ie. the PLT entry
address. For relocations in ELF_RTYPE_CLASS_PLT (eg. the relocs in
the PLT itself), ld.so should use the value of the corresponding
defined symbol in the object that defines the function, ie. the
real function address. This complicates ld.so in that there are
now two possible values for a given symbol, and it gets even worse
because protected symbols need yet another set of rules.
/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so On PowerPC64 we don't need any of this. The linker won't emit
PLT entries should not be allowed to define the value. SHN_UNDEF symbols with non-zero values. ld.so can make all
ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one relocations behave "normally", ie. always use the real address
of the main executable's symbols, as for a COPY reloc. */ like PLT relocations. So always set ELF_RTYPE_CLASS_PLT. */
#if !defined RTLD_BOOTSTRAP || USE___THREAD
#define elf_machine_type_class(type) \
/* This covers all the TLS relocs, though most won't appear. */ \
(((((type) >= R_PPC64_DTPMOD64 && (type) <= R_PPC64_TPREL16_HIGHESTA) \
|| (type) == R_PPC64_ADDR24) * ELF_RTYPE_CLASS_PLT) \
| (((type) == R_PPC64_COPY) * ELF_RTYPE_CLASS_COPY))
#else
#define elf_machine_type_class(type) \ #define elf_machine_type_class(type) \
((((type) == R_PPC64_ADDR24) * ELF_RTYPE_CLASS_PLT) \ (ELF_RTYPE_CLASS_PLT | (((type) == R_PPC64_COPY) * ELF_RTYPE_CLASS_COPY))
| (((type) == R_PPC64_COPY) * ELF_RTYPE_CLASS_COPY))
#endif
/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */ /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
#define ELF_MACHINE_JMP_SLOT R_PPC64_JMP_SLOT #define ELF_MACHINE_JMP_SLOT R_PPC64_JMP_SLOT