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: [PATCH] Fix lazy setting for PLTREL overlap cpus.


From: "Carlos O'Donell" <carlos@systemhalted.org>
Date: Wed, 4 Apr 2012 00:39:13 -0400

> Ah! I misread what you said. Yes, in that case, if we can *show* that
> s390, power, and tile do the same then we can cleanup the code.

Ok, here's what I came up with.  I've tested this on all of
x86-64, sparc32, and sparc64.

2012-04-04  David S. Miller  <davem@davemloft.net>

	* elf/dynamic-linux.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.

diff --git a/elf/dynamic-link.h b/elf/dynamic-link.h
index aa71227..5f13913 100644
--- a/elf/dynamic-link.h
+++ b/elf/dynamic-link.h
@@ -250,54 +250,9 @@ elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp)
    because we must be able to completely inline.  */
 
 /* On some machines, notably SPARC, DT_REL* includes DT_JMPREL in its
-   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.  */
+   range.  Note that according to the ELF spec, this is completely legal!  */
 
-# ifdef ELF_MACHINE_PLTREL_OVERLAP
-#  define _ELF_DYNAMIC_DO_RELOC(RELOC, reloc, map, do_lazy, skip_ifunc, test_rel) \
-  do {									      \
-    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 {									      \
     struct { ElfW(Addr) start, size;					      \
 	     __typeof (((ElfW(Dyn) *) 0)->d_un.d_val) nrelative; int lazy; }  \
@@ -317,6 +272,8 @@ elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp)
       {									      \
 	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					      \
 	    && ((do_lazy)						      \
 		/* This test does not only detect whether the relocation      \
@@ -352,7 +309,6 @@ elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp)
 				  skip_ifunc);				      \
       }									      \
   } while (0)
-# endif
 
 # if ELF_MACHINE_NO_REL || ELF_MACHINE_NO_RELA
 #  define _ELF_CHECK_REL 0
diff --git a/sysdeps/powerpc/powerpc32/dl-machine.h b/sysdeps/powerpc/powerpc32/dl-machine.h
index b3177d1..45868f5 100644
--- a/sysdeps/powerpc/powerpc32/dl-machine.h
+++ b/sysdeps/powerpc/powerpc32/dl-machine.h
@@ -388,8 +388,4 @@ elf_machine_lazy_rel (struct link_map *map,
   /* 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 */
diff --git a/sysdeps/s390/s390-32/dl-machine.h b/sysdeps/s390/s390-32/dl-machine.h
index 58bd3ab..3eb7e41 100644
--- a/sysdeps/s390/s390-32/dl-machine.h
+++ b/sysdeps/s390/s390-32/dl-machine.h
@@ -227,9 +227,6 @@ _dl_start_user:\n\
 /* The S390 never uses Elf32_Rel relocations.  */
 #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
    _dl_sysdep_start.  */
 #define DL_PLATFORM_INIT dl_platform_init ()
diff --git a/sysdeps/sparc/sparc32/dl-machine.h b/sysdeps/sparc/sparc32/dl-machine.h
index f85683d..31b540a 100644
--- a/sysdeps/sparc/sparc32/dl-machine.h
+++ b/sysdeps/sparc/sparc32/dl-machine.h
@@ -204,9 +204,6 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
 /* The SPARC never uses Elf32_Rel relocations.  */
 #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
    value we want in __libc_stack_end.  */
 #define DL_STACK_END(cookie) \
diff --git a/sysdeps/sparc/sparc64/dl-machine.h b/sysdeps/sparc/sparc64/dl-machine.h
index 87655d2..4b14593 100644
--- a/sysdeps/sparc/sparc64/dl-machine.h
+++ b/sysdeps/sparc/sparc64/dl-machine.h
@@ -125,9 +125,6 @@ elf_machine_plt_value (struct link_map *map, const Elf64_Rela *reloc,
 /* The SPARC never uses Elf64_Rel relocations.  */
 #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
    entries will jump to the on-demand fixup code in dl-runtime.c.  */
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]