[BZ,#19178] ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA conflict

Message ID 20151028114906.GA7686@gmail.com
State New, archived
Headers

Commit Message

H.J. Lu Oct. 28, 2015, 11:49 a.m. UTC
  _dl_debug_bindings updates relocation type class with 4 and 8.  But
ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA may be defined to 4.  This patch
adds ELF_RTYPE_CLASS_TLS/ELF_RTYPE_CLASS_IFUNC and use them in
_dl_debug_bindings.

Tested on i686 and x86-64.  OK for master and 2.22 branch?


H.J.
--
	[BZ #19178]
	* dl-lookup.c (_dl_debug_bindings): Replace 4 and 8 with
	ELF_RTYPE_CLASS_TLS and ELF_RTYPE_CLASS_IFUNC.
	* sysdeps/generic/ldsodefs.h (ELF_RTYPE_CLASS_TLS): New.
	(ELF_RTYPE_CLASS_IFUNC): Likewise.
---
 elf/dl-lookup.c            | 6 +++---
 sysdeps/generic/ldsodefs.h | 4 ++++
 2 files changed, 7 insertions(+), 3 deletions(-)
  

Comments

H.J. Lu Oct. 28, 2015, 1:42 p.m. UTC | #1
On Wed, Oct 28, 2015 at 4:49 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
> _dl_debug_bindings updates relocation type class with 4 and 8.  But
> ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA may be defined to 4.  This patch
> adds ELF_RTYPE_CLASS_TLS/ELF_RTYPE_CLASS_IFUNC and use them in
> _dl_debug_bindings.
>
> Tested on i686 and x86-64.  OK for master and 2.22 branch?
>
>
> H.J.
> --
>         [BZ #19178]
>         * dl-lookup.c (_dl_debug_bindings): Replace 4 and 8 with
>         ELF_RTYPE_CLASS_TLS and ELF_RTYPE_CLASS_IFUNC.
>         * sysdeps/generic/ldsodefs.h (ELF_RTYPE_CLASS_TLS): New.
>         (ELF_RTYPE_CLASS_IFUNC): Likewise.
> ---
>  elf/dl-lookup.c            | 6 +++---
>  sysdeps/generic/ldsodefs.h | 4 ++++
>  2 files changed, 7 insertions(+), 3 deletions(-)
>
> diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c
> index 581fb20..9f2643f 100644
> --- a/elf/dl-lookup.c
> +++ b/elf/dl-lookup.c
> @@ -1073,16 +1073,16 @@ _dl_debug_bindings (const char *undef_name, struct link_map *undef_map,
>         {
>           if (__glibc_unlikely (ELFW(ST_TYPE) (value->s->st_info)
>                                 == STT_TLS))
> -           type_class = 4;
> +           type_class = ELF_RTYPE_CLASS_TLS;
>           else if (__glibc_unlikely (ELFW(ST_TYPE) (value->s->st_info)
>                                      == STT_GNU_IFUNC))
> -           type_class |= 8;
> +           type_class |= ELF_RTYPE_CLASS_IFUNC;
>         }
>
>        if (conflict
>           || GLRO(dl_trace_prelink_map) == undef_map
>           || GLRO(dl_trace_prelink_map) == NULL
> -         || type_class >= 4)
> +         || type_class >= ELF_RTYPE_CLASS_TLS)
>         {
>           _dl_printf ("%s 0x%0*Zx 0x%0*Zx -> 0x%0*Zx 0x%0*Zx ",
>                       conflict ? "conflict" : "lookup",
> diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
> index a8caf47..5f96540 100644
> --- a/sysdeps/generic/ldsodefs.h
> +++ b/sysdeps/generic/ldsodefs.h
> @@ -122,6 +122,10 @@ typedef struct link_map *lookup_t;
>  #else
>  # define ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA 0
>  #endif
> +/* ELF_RTYPE_CLASS_TLS and ELF_RTYPE_CLASS_IFUNC are only used in
> +   _dl_debug_bindings.  They must be the highest ones.  */
> +#define ELF_RTYPE_CLASS_TLS 8
> +#define ELF_RTYPE_CLASS_IFUNC 16
>
>  /* ELF uses the PF_x macros to specify the segment permissions, mmap
>     uses PROT_xxx.  In most cases the three macros have the values 1, 2,
> --
> 2.4.3
>

It doesn't work with prelink.
  

Patch

diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c
index 581fb20..9f2643f 100644
--- a/elf/dl-lookup.c
+++ b/elf/dl-lookup.c
@@ -1073,16 +1073,16 @@  _dl_debug_bindings (const char *undef_name, struct link_map *undef_map,
 	{
 	  if (__glibc_unlikely (ELFW(ST_TYPE) (value->s->st_info)
 				== STT_TLS))
-	    type_class = 4;
+	    type_class = ELF_RTYPE_CLASS_TLS;
 	  else if (__glibc_unlikely (ELFW(ST_TYPE) (value->s->st_info)
 				     == STT_GNU_IFUNC))
-	    type_class |= 8;
+	    type_class |= ELF_RTYPE_CLASS_IFUNC;
 	}
 
       if (conflict
 	  || GLRO(dl_trace_prelink_map) == undef_map
 	  || GLRO(dl_trace_prelink_map) == NULL
-	  || type_class >= 4)
+	  || type_class >= ELF_RTYPE_CLASS_TLS)
 	{
 	  _dl_printf ("%s 0x%0*Zx 0x%0*Zx -> 0x%0*Zx 0x%0*Zx ",
 		      conflict ? "conflict" : "lookup",
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
index a8caf47..5f96540 100644
--- a/sysdeps/generic/ldsodefs.h
+++ b/sysdeps/generic/ldsodefs.h
@@ -122,6 +122,10 @@  typedef struct link_map *lookup_t;
 #else
 # define ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA 0
 #endif
+/* ELF_RTYPE_CLASS_TLS and ELF_RTYPE_CLASS_IFUNC are only used in
+   _dl_debug_bindings.  They must be the highest ones.  */
+#define ELF_RTYPE_CLASS_TLS 8
+#define ELF_RTYPE_CLASS_IFUNC 16
 
 /* ELF uses the PF_x macros to specify the segment permissions, mmap
    uses PROT_xxx.  In most cases the three macros have the values 1, 2,