Reduce down to one definition of _ELF_DYNAMIC_DO_RELOC.

* elf/dynamic-link.h (_ELF_DYNAMIC_DO_RELOC): Reduce down to one
	definition.
	* sysdeps/powerpc/powerpc32/dl-machine.h
	(ELF_MACHINE_PLTREL_OVERLAP): Delete.
	* sysdeps/s390/s390-32/dl-machine.h
	(ELF_MACHINE_PLTREL_OVERLAP): Likewise.
	* sysdeps/sparc/sparc32/dl-machine.h
	(ELF_MACHINE_PLTREL_OVERLAP): Likewise.
	* sysdeps/sparc/sparc64/dl-machine.h
	(ELF_MACHINE_PLTREL_OVERLAP): Likewise.
This commit is contained in:
David S. Miller 2012-04-05 15:28:37 -07:00
parent 48e2e132de
commit 993eb0541c
6 changed files with 18 additions and 60 deletions

View File

@ -1,5 +1,16 @@
2012-04-05 David S. Miller <davem@davemloft.net> 2012-04-05 David S. Miller <davem@davemloft.net>
* elf/dynamic-link.h (_ELF_DYNAMIC_DO_RELOC): Reduce down to one
definition.
* sysdeps/powerpc/powerpc32/dl-machine.h
(ELF_MACHINE_PLTREL_OVERLAP): Delete.
* sysdeps/s390/s390-32/dl-machine.h
(ELF_MACHINE_PLTREL_OVERLAP): Likewise.
* sysdeps/sparc/sparc32/dl-machine.h
(ELF_MACHINE_PLTREL_OVERLAP): Likewise.
* sysdeps/sparc/sparc64/dl-machine.h
(ELF_MACHINE_PLTREL_OVERLAP): Likewise.
* elf/rtld.c (dl_main): If DL_DEBUG_UNUSED is enabled, turn off * elf/rtld.c (dl_main): If DL_DEBUG_UNUSED is enabled, turn off
lazy binding. lazy binding.
* elf/dl-lookup.c (_dl_lookup_symbol_x): If DL_DEBUG_UNUSED, ignore * elf/dl-lookup.c (_dl_lookup_symbol_x): If DL_DEBUG_UNUSED, ignore

View File

@ -251,52 +251,11 @@ elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp)
/* On some machines, notably SPARC, DT_REL* includes DT_JMPREL in its /* On some machines, notably SPARC, DT_REL* includes DT_JMPREL in its
range. Note that according to the ELF spec, this is completely legal! range. Note that according to the ELF spec, this is completely legal!
But conditionally define things so that on machines we know this will
not happen we do something more optimal. */
# ifdef ELF_MACHINE_PLTREL_OVERLAP We are guarenteed that we have one of two situations. Either DT_JMPREL
# define _ELF_DYNAMIC_DO_RELOC(RELOC, reloc, map, do_lazy, skip_ifunc, test_rel) \ comes immediately after DT_REL*, or there is overlap and DT_JMPREL
do { \ consumes precisely the very end of the DT_REL*. */
struct { ElfW(Addr) start, size; \
__typeof (((ElfW(Dyn) *) 0)->d_un.d_val) nrelative; int lazy; } \
ranges[3]; \
int ranges_index; \
\
ranges[0].lazy = ranges[2].lazy = 0; \
ranges[1].lazy = 1; \
ranges[0].size = ranges[1].size = ranges[2].size = 0; \
ranges[0].nrelative = ranges[1].nrelative = ranges[2].nrelative = 0; \
\
if ((map)->l_info[DT_##RELOC]) \
{ \
ranges[0].start = D_PTR ((map), l_info[DT_##RELOC]); \
ranges[0].size = (map)->l_info[DT_##RELOC##SZ]->d_un.d_val; \
if (map->l_info[VERSYMIDX (DT_##RELOC##COUNT)] != NULL) \
ranges[0].nrelative \
= MIN (map->l_info[VERSYMIDX (DT_##RELOC##COUNT)]->d_un.d_val, \
ranges[0].size / sizeof (ElfW(reloc))); \
} \
\
if ((do_lazy) \
&& (map)->l_info[DT_PLTREL] \
&& (!test_rel || (map)->l_info[DT_PLTREL]->d_un.d_val == DT_##RELOC)) \
{ \
ranges[1].start = D_PTR ((map), l_info[DT_JMPREL]); \
ranges[1].size = (map)->l_info[DT_PLTRELSZ]->d_un.d_val; \
ranges[2].start = ranges[1].start + ranges[1].size; \
ranges[2].size = ranges[0].start + ranges[0].size - ranges[2].start; \
ranges[0].size = ranges[1].start - ranges[0].start; \
} \
\
for (ranges_index = 0; ranges_index < 3; ++ranges_index) \
elf_dynamic_do_##reloc ((map), \
ranges[ranges_index].start, \
ranges[ranges_index].size, \
ranges[ranges_index].nrelative, \
ranges[ranges_index].lazy, \
skip_ifunc); \
} while (0)
# else
# define _ELF_DYNAMIC_DO_RELOC(RELOC, reloc, map, do_lazy, skip_ifunc, test_rel) \ # define _ELF_DYNAMIC_DO_RELOC(RELOC, reloc, map, do_lazy, skip_ifunc, test_rel) \
do { \ do { \
struct { ElfW(Addr) start, size; \ struct { ElfW(Addr) start, size; \
@ -317,6 +276,8 @@ elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp)
{ \ { \
ElfW(Addr) start = D_PTR ((map), l_info[DT_JMPREL]); \ ElfW(Addr) start = D_PTR ((map), l_info[DT_JMPREL]); \
\ \
if (__builtin_expect (ranges[0].size, 1)) \
ranges[0].size = (start - ranges[0].start); \
if (! ELF_DURING_STARTUP \ if (! ELF_DURING_STARTUP \
&& ((do_lazy) \ && ((do_lazy) \
/* This test does not only detect whether the relocation \ /* This test does not only detect whether the relocation \
@ -352,7 +313,6 @@ elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp)
skip_ifunc); \ skip_ifunc); \
} \ } \
} while (0) } while (0)
# endif
# if ELF_MACHINE_NO_REL || ELF_MACHINE_NO_RELA # if ELF_MACHINE_NO_REL || ELF_MACHINE_NO_RELA
# define _ELF_CHECK_REL 0 # define _ELF_CHECK_REL 0

View File

@ -388,8 +388,4 @@ elf_machine_lazy_rel (struct link_map *map,
/* elf_machine_runtime_setup handles this. */ /* elf_machine_runtime_setup handles this. */
} }
/* The SVR4 ABI specifies that the JMPREL relocs must be inside the
DT_RELA table. */
#define ELF_MACHINE_PLTREL_OVERLAP 1
#endif /* RESOLVE_MAP */ #endif /* RESOLVE_MAP */

View File

@ -227,9 +227,6 @@ _dl_start_user:\n\
/* The S390 never uses Elf32_Rel relocations. */ /* The S390 never uses Elf32_Rel relocations. */
#define ELF_MACHINE_NO_REL 1 #define ELF_MACHINE_NO_REL 1
/* The S390 overlaps DT_RELA and DT_PLTREL. */
#define ELF_MACHINE_PLTREL_OVERLAP 1
/* We define an initialization functions. This is called very early in /* We define an initialization functions. This is called very early in
_dl_sysdep_start. */ _dl_sysdep_start. */
#define DL_PLATFORM_INIT dl_platform_init () #define DL_PLATFORM_INIT dl_platform_init ()

View File

@ -204,9 +204,6 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
/* The SPARC never uses Elf32_Rel relocations. */ /* The SPARC never uses Elf32_Rel relocations. */
#define ELF_MACHINE_NO_REL 1 #define ELF_MACHINE_NO_REL 1
/* The SPARC overlaps DT_RELA and DT_PLTREL. */
#define ELF_MACHINE_PLTREL_OVERLAP 1
/* Undo the sub %sp, 6*4, %sp; add %sp, 22*4, %o0 below to get at the /* Undo the sub %sp, 6*4, %sp; add %sp, 22*4, %o0 below to get at the
value we want in __libc_stack_end. */ value we want in __libc_stack_end. */
#define DL_STACK_END(cookie) \ #define DL_STACK_END(cookie) \

View File

@ -125,9 +125,6 @@ elf_machine_plt_value (struct link_map *map, const Elf64_Rela *reloc,
/* The SPARC never uses Elf64_Rel relocations. */ /* The SPARC never uses Elf64_Rel relocations. */
#define ELF_MACHINE_NO_REL 1 #define ELF_MACHINE_NO_REL 1
/* The SPARC overlaps DT_RELA and DT_PLTREL. */
#define ELF_MACHINE_PLTREL_OVERLAP 1
/* Set up the loaded object described by L so its unrelocated PLT /* Set up the loaded object described by L so its unrelocated PLT
entries will jump to the on-demand fixup code in dl-runtime.c. */ entries will jump to the on-demand fixup code in dl-runtime.c. */