mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-25 22:40:05 +00:00
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:
parent
48e2e132de
commit
993eb0541c
11
ChangeLog
11
ChangeLog
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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 */
|
||||||
|
@ -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 ()
|
||||||
|
@ -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) \
|
||||||
|
@ -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. */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user