about summary refs log tree commit diff
path: root/sysdeps/mips/dl-machine.h
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2014-02-11 22:33:07 +0000
committerJoseph Myers <joseph@codesourcery.com>2014-02-11 22:33:07 +0000
commitcb4a292812c8b5547d142d894f2305259e67fa61 (patch)
treed999cde2ce986bf7af5daae7056a825184e6867c /sysdeps/mips/dl-machine.h
parent7e6424e343b5213ae12bae83c0d018f4fcafd5cd (diff)
downloadglibc-cb4a292812c8b5547d142d894f2305259e67fa61.tar.gz
glibc-cb4a292812c8b5547d142d894f2305259e67fa61.tar.xz
glibc-cb4a292812c8b5547d142d894f2305259e67fa61.zip
Merge MIPS dl-lookup.c into generic file.
MIPS has its own version of dl-lookup.c to deal with differences
between undefined symbol semantics in the PIC and non-PIC ABIs.  This
is often liable to get out of date with respect to the generic file
(for example, the recent __builtin_expect changes didn't cover ports,
and it's not obvious to anyone changing dl-lookup.c that there would
be architecture-specific versions).

This patch adds a macro that dl-machine.h can define that is used in
the appropriate place in dl-lookup.c, so that MIPS no longer needs its
own version of that file.

Tested for mips64 that the only changes to disassembly of installed
shared libraries appear to be ld.so changes attributable to different
line numbers and paths in assertions.

	* elf/dl-lookup.c (ELF_MACHINE_SYM_NO_MATCH): Define if not
	already defined.
	(do_lookup_x): Use ELF_MACHINE_SYM_NO_MATCH.
	* sysdeps/mips/dl-lookup.c: Remove.
	* sysdeps/mips/dl-machine.h (ELF_MACHINE_SYM_NO_MATCH): New macro.
Diffstat (limited to 'sysdeps/mips/dl-machine.h')
-rw-r--r--sysdeps/mips/dl-machine.h15
1 files changed, 15 insertions, 0 deletions
diff --git a/sysdeps/mips/dl-machine.h b/sysdeps/mips/dl-machine.h
index c2dd915e8b..b5bf4ad6d3 100644
--- a/sysdeps/mips/dl-machine.h
+++ b/sysdeps/mips/dl-machine.h
@@ -439,6 +439,21 @@ elf_machine_plt_value (struct link_map *map, const ElfW(Rel) *reloc,
   return value;
 }
 
+/* The semantics of zero/non-zero values of undefined symbols differs
+   depending on whether the non-PIC ABI is in use.  Under the non-PIC
+   ABI, a non-zero value indicates that there is an address reference
+   to the symbol and thus it must always be resolved (except when
+   resolving a jump slot relocation) to the PLT entry whose address is
+   provided as the symbol's value; a zero value indicates that this
+   canonical-address behaviour is not required.  Yet under the classic
+   MIPS psABI, a zero value indicates that there is an address
+   reference to the function and the dynamic linker must resolve the
+   symbol immediately upon loading.  To avoid conflict, symbols for
+   which the dynamic linker must assume the non-PIC ABI semantics are
+   marked with the STO_MIPS_PLT flag.  */
+#define ELF_MACHINE_SYM_NO_MATCH(sym) \
+  ((sym)->st_shndx == SHN_UNDEF && !((sym)->st_other & STO_MIPS_PLT))
+
 #endif /* !dl_machine_h */
 
 #ifdef RESOLVE_MAP