public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH v2] elf: Refine direct extern access diagnostics to protected symbol
@ 2022-06-08 19:37 Fangrui Song
  2022-06-10 20:43 ` H.J. Lu
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Fangrui Song @ 2022-06-08 19:37 UTC (permalink / raw)
  To: libc-alpha

Refine commit 349b0441dab375099b1d7f6909c1742286a67da9:

1. Copy relocations for extern protected data do not work properly,
regardless whether GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS is used.
It makes sense to produce a warning unconditionally.  When the defining
shared object has GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS, report
an error to satisfy the "no copy relocations" enforcement intended by
this GNU property.

2. Non-zero value of an undefined function symbol may break pointer
equality, but may be benign in many cases (many programs don't take the
address in the shared object then compare it with the address in the
executable).  Reword the diagnostic to be clearer.

3. Remove the unneeded condition !(undef_map->l_1_needed &
GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS). If the executable has
GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS (can only occur in error
cases), the diagnostic should be emitted as well.

--
Changes from v1:
* Keep 2 as an error in the presence of GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS
  as requested by H.J. Lu.
---
 sysdeps/generic/dl-protected.h | 50 ++++++++++++++++++----------------
 1 file changed, 27 insertions(+), 23 deletions(-)

diff --git a/sysdeps/generic/dl-protected.h b/sysdeps/generic/dl-protected.h
index 88cb8ec917..38386b5200 100644
--- a/sysdeps/generic/dl-protected.h
+++ b/sysdeps/generic/dl-protected.h
@@ -26,29 +26,33 @@ _dl_check_protected_symbol (const char *undef_name,
 			    const struct link_map *map,
 			    int type_class)
 {
-  if (undef_map != NULL
-      && undef_map->l_type == lt_executable
-      && !(undef_map->l_1_needed
-	   & GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS)
-      && (map->l_1_needed
-	  & GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS))
-    {
-      if ((type_class & ELF_RTYPE_CLASS_COPY))
-	/* Disallow copy relocations in executable against protected
-	   data symbols in a shared object which needs indirect external
-	   access.  */
-	_dl_signal_error (0, map->l_name, undef_name,
-			  N_("copy relocation against non-copyable protected symbol"));
-      else if (ref->st_value != 0
-	       && ref->st_shndx == SHN_UNDEF
-	       && (type_class & ELF_RTYPE_CLASS_PLT))
-	/* Disallow non-zero symbol values of undefined symbols in
-	   executable, which are used as the function pointer, against
-	   protected function symbols in a shared object with indirect
-	   external access.  */
-	_dl_signal_error (0, map->l_name, undef_name,
-			  N_("non-canonical reference to canonical protected function"));
-    }
+  if (undef_map == NULL || undef_map->l_type != lt_executable)
+    return;
+
+  if (type_class & ELF_RTYPE_CLASS_COPY)
+    /* Disallow copy relocations in executable against protected
+       data symbols in a shared object which needs indirect external
+       access.  */
+    _dl_error_printf ("warning: copy relocation against non-copyable "
+		      "protected symbol `%s' in `%s'\n",
+		      undef_name, map->l_name);
+  else if ((type_class & ELF_RTYPE_CLASS_PLT) && ref->st_value != 0
+	   && ref->st_shndx == SHN_UNDEF)
+    /* Disallow non-zero symbol values of undefined symbols in
+       executable, which are used as the function pointer, against
+       protected function symbols in a shared object with indirect
+       external access.  */
+    _dl_error_printf (
+	"warning: direct reference to "
+	"protected function `%s' in `%s' may break pointer equality\n",
+	undef_name, map->l_name);
+  else
+    return;
+
+  if (map->l_1_needed & GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS)
+    _dl_signal_error (
+	0, map->l_name, undef_name,
+	N_ ("error due to GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS"));
 }
 
 #endif /* _DL_PROTECTED_H */
-- 
2.36.1.255.ge46751e96f-goog


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2] elf: Refine direct extern access diagnostics to protected symbol
  2022-06-08 19:37 [PATCH v2] elf: Refine direct extern access diagnostics to protected symbol Fangrui Song
@ 2022-06-10 20:43 ` H.J. Lu
  2022-06-10 21:23   ` Fangrui Song
  2022-06-12 21:24 ` H.J. Lu
  2022-06-14 19:53 ` H.J. Lu
  2 siblings, 1 reply; 9+ messages in thread
From: H.J. Lu @ 2022-06-10 20:43 UTC (permalink / raw)
  To: Fangrui Song; +Cc: GNU C Library

On Wed, Jun 8, 2022 at 12:37 PM Fangrui Song via Libc-alpha
<libc-alpha@sourceware.org> wrote:
>
> Refine commit 349b0441dab375099b1d7f6909c1742286a67da9:
>
> 1. Copy relocations for extern protected data do not work properly,
> regardless whether GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS is used.
> It makes sense to produce a warning unconditionally.  When the defining
> shared object has GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS, report
> an error to satisfy the "no copy relocations" enforcement intended by
> this GNU property.
>
> 2. Non-zero value of an undefined function symbol may break pointer
> equality, but may be benign in many cases (many programs don't take the
> address in the shared object then compare it with the address in the
> executable).  Reword the diagnostic to be clearer.
>
> 3. Remove the unneeded condition !(undef_map->l_1_needed &
> GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS). If the executable has
> GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS (can only occur in error
> cases), the diagnostic should be emitted as well.
>
> --
> Changes from v1:
> * Keep 2 as an error in the presence of GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS
>   as requested by H.J. Lu.
> ---
>  sysdeps/generic/dl-protected.h | 50 ++++++++++++++++++----------------
>  1 file changed, 27 insertions(+), 23 deletions(-)
>
> diff --git a/sysdeps/generic/dl-protected.h b/sysdeps/generic/dl-protected.h
> index 88cb8ec917..38386b5200 100644
> --- a/sysdeps/generic/dl-protected.h
> +++ b/sysdeps/generic/dl-protected.h
> @@ -26,29 +26,33 @@ _dl_check_protected_symbol (const char *undef_name,
>                             const struct link_map *map,
>                             int type_class)
>  {
> -  if (undef_map != NULL
> -      && undef_map->l_type == lt_executable
> -      && !(undef_map->l_1_needed
> -          & GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS)
> -      && (map->l_1_needed
> -         & GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS))
> -    {
> -      if ((type_class & ELF_RTYPE_CLASS_COPY))
> -       /* Disallow copy relocations in executable against protected
> -          data symbols in a shared object which needs indirect external
> -          access.  */
> -       _dl_signal_error (0, map->l_name, undef_name,
> -                         N_("copy relocation against non-copyable protected symbol"));
> -      else if (ref->st_value != 0
> -              && ref->st_shndx == SHN_UNDEF
> -              && (type_class & ELF_RTYPE_CLASS_PLT))
> -       /* Disallow non-zero symbol values of undefined symbols in
> -          executable, which are used as the function pointer, against
> -          protected function symbols in a shared object with indirect
> -          external access.  */
> -       _dl_signal_error (0, map->l_name, undef_name,
> -                         N_("non-canonical reference to canonical protected function"));
> -    }
> +  if (undef_map == NULL || undef_map->l_type != lt_executable)
> +    return;
> +
> +  if (type_class & ELF_RTYPE_CLASS_COPY)
> +    /* Disallow copy relocations in executable against protected
> +       data symbols in a shared object which needs indirect external
> +       access.  */
> +    _dl_error_printf ("warning: copy relocation against non-copyable "
> +                     "protected symbol `%s' in `%s'\n",
> +                     undef_name, map->l_name);
> +  else if ((type_class & ELF_RTYPE_CLASS_PLT) && ref->st_value != 0
> +          && ref->st_shndx == SHN_UNDEF)
> +    /* Disallow non-zero symbol values of undefined symbols in
> +       executable, which are used as the function pointer, against
> +       protected function symbols in a shared object with indirect
> +       external access.  */
> +    _dl_error_printf (
> +       "warning: direct reference to "
> +       "protected function `%s' in `%s' may break pointer equality\n",
> +       undef_name, map->l_name);
> +  else
> +    return;
> +
> +  if (map->l_1_needed & GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS)
> +    _dl_signal_error (
> +       0, map->l_name, undef_name,
> +       N_ ("error due to GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS"));
>  }
>
>  #endif /* _DL_PROTECTED_H */
> --
> 2.36.1.255.ge46751e96f-goog
>

Does this patch cause any extra glibc test failures?

-- 
H.J.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2] elf: Refine direct extern access diagnostics to protected symbol
  2022-06-10 20:43 ` H.J. Lu
@ 2022-06-10 21:23   ` Fangrui Song
  2022-06-10 22:03     ` H.J. Lu
  0 siblings, 1 reply; 9+ messages in thread
From: Fangrui Song @ 2022-06-10 21:23 UTC (permalink / raw)
  To: H.J. Lu; +Cc: GNU C Library


On 2022-06-10, H.J. Lu wrote:
>On Wed, Jun 8, 2022 at 12:37 PM Fangrui Song via Libc-alpha
><libc-alpha@sourceware.org> wrote:
>>
>> Refine commit 349b0441dab375099b1d7f6909c1742286a67da9:
>>
>> 1. Copy relocations for extern protected data do not work properly,
>> regardless whether GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS is used.
>> It makes sense to produce a warning unconditionally.  When the defining
>> shared object has GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS, report
>> an error to satisfy the "no copy relocations" enforcement intended by
>> this GNU property.
>>
>> 2. Non-zero value of an undefined function symbol may break pointer
>> equality, but may be benign in many cases (many programs don't take the
>> address in the shared object then compare it with the address in the
>> executable).  Reword the diagnostic to be clearer.
>>
>> 3. Remove the unneeded condition !(undef_map->l_1_needed &
>> GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS). If the executable has
>> GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS (can only occur in error
>> cases), the diagnostic should be emitted as well.
>>
>> --
>> Changes from v1:
>> * Keep 2 as an error in the presence of GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS
>>   as requested by H.J. Lu.
>> ---
>>  sysdeps/generic/dl-protected.h | 50 ++++++++++++++++++----------------
>>  1 file changed, 27 insertions(+), 23 deletions(-)
>>
>> diff --git a/sysdeps/generic/dl-protected.h b/sysdeps/generic/dl-protected.h
>> index 88cb8ec917..38386b5200 100644
>> --- a/sysdeps/generic/dl-protected.h
>> +++ b/sysdeps/generic/dl-protected.h
>> @@ -26,29 +26,33 @@ _dl_check_protected_symbol (const char *undef_name,
>>                             const struct link_map *map,
>>                             int type_class)
>>  {
>> -  if (undef_map != NULL
>> -      && undef_map->l_type == lt_executable
>> -      && !(undef_map->l_1_needed
>> -          & GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS)
>> -      && (map->l_1_needed
>> -         & GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS))
>> -    {
>> -      if ((type_class & ELF_RTYPE_CLASS_COPY))
>> -       /* Disallow copy relocations in executable against protected
>> -          data symbols in a shared object which needs indirect external
>> -          access.  */
>> -       _dl_signal_error (0, map->l_name, undef_name,
>> -                         N_("copy relocation against non-copyable protected symbol"));
>> -      else if (ref->st_value != 0
>> -              && ref->st_shndx == SHN_UNDEF
>> -              && (type_class & ELF_RTYPE_CLASS_PLT))
>> -       /* Disallow non-zero symbol values of undefined symbols in
>> -          executable, which are used as the function pointer, against
>> -          protected function symbols in a shared object with indirect
>> -          external access.  */
>> -       _dl_signal_error (0, map->l_name, undef_name,
>> -                         N_("non-canonical reference to canonical protected function"));
>> -    }
>> +  if (undef_map == NULL || undef_map->l_type != lt_executable)
>> +    return;
>> +
>> +  if (type_class & ELF_RTYPE_CLASS_COPY)
>> +    /* Disallow copy relocations in executable against protected
>> +       data symbols in a shared object which needs indirect external
>> +       access.  */
>> +    _dl_error_printf ("warning: copy relocation against non-copyable "
>> +                     "protected symbol `%s' in `%s'\n",
>> +                     undef_name, map->l_name);
>> +  else if ((type_class & ELF_RTYPE_CLASS_PLT) && ref->st_value != 0
>> +          && ref->st_shndx == SHN_UNDEF)
>> +    /* Disallow non-zero symbol values of undefined symbols in
>> +       executable, which are used as the function pointer, against
>> +       protected function symbols in a shared object with indirect
>> +       external access.  */
>> +    _dl_error_printf (
>> +       "warning: direct reference to "
>> +       "protected function `%s' in `%s' may break pointer equality\n",
>> +       undef_name, map->l_name);
>> +  else
>> +    return;
>> +
>> +  if (map->l_1_needed & GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS)
>> +    _dl_signal_error (
>> +       0, map->l_name, undef_name,
>> +       N_ ("error due to GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS"));
>>  }
>>
>>  #endif /* _DL_PROTECTED_H */
>> --
>> 2.36.1.255.ge46751e96f-goog
>>
>
>Does this patch cause any extra glibc test failures?

`make -j 50 check` has no regression on x86-64.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2] elf: Refine direct extern access diagnostics to protected symbol
  2022-06-10 21:23   ` Fangrui Song
@ 2022-06-10 22:03     ` H.J. Lu
  2022-06-10 22:47       ` Fangrui Song
  0 siblings, 1 reply; 9+ messages in thread
From: H.J. Lu @ 2022-06-10 22:03 UTC (permalink / raw)
  To: Fangrui Song; +Cc: GNU C Library

On Fri, Jun 10, 2022 at 2:23 PM Fangrui Song <maskray@google.com> wrote:
>
>
> On 2022-06-10, H.J. Lu wrote:
> >On Wed, Jun 8, 2022 at 12:37 PM Fangrui Song via Libc-alpha
> ><libc-alpha@sourceware.org> wrote:
> >>
> >> Refine commit 349b0441dab375099b1d7f6909c1742286a67da9:
> >>
> >> 1. Copy relocations for extern protected data do not work properly,
> >> regardless whether GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS is used.
> >> It makes sense to produce a warning unconditionally.  When the defining
> >> shared object has GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS, report
> >> an error to satisfy the "no copy relocations" enforcement intended by
> >> this GNU property.
> >>
> >> 2. Non-zero value of an undefined function symbol may break pointer
> >> equality, but may be benign in many cases (many programs don't take the
> >> address in the shared object then compare it with the address in the
> >> executable).  Reword the diagnostic to be clearer.
> >>
> >> 3. Remove the unneeded condition !(undef_map->l_1_needed &
> >> GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS). If the executable has
> >> GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS (can only occur in error
> >> cases), the diagnostic should be emitted as well.
> >>
> >> --
> >> Changes from v1:
> >> * Keep 2 as an error in the presence of GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS
> >>   as requested by H.J. Lu.
> >> ---
> >>  sysdeps/generic/dl-protected.h | 50 ++++++++++++++++++----------------
> >>  1 file changed, 27 insertions(+), 23 deletions(-)
> >>
> >> diff --git a/sysdeps/generic/dl-protected.h b/sysdeps/generic/dl-protected.h
> >> index 88cb8ec917..38386b5200 100644
> >> --- a/sysdeps/generic/dl-protected.h
> >> +++ b/sysdeps/generic/dl-protected.h
> >> @@ -26,29 +26,33 @@ _dl_check_protected_symbol (const char *undef_name,
> >>                             const struct link_map *map,
> >>                             int type_class)
> >>  {
> >> -  if (undef_map != NULL
> >> -      && undef_map->l_type == lt_executable
> >> -      && !(undef_map->l_1_needed
> >> -          & GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS)
> >> -      && (map->l_1_needed
> >> -         & GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS))
> >> -    {
> >> -      if ((type_class & ELF_RTYPE_CLASS_COPY))
> >> -       /* Disallow copy relocations in executable against protected
> >> -          data symbols in a shared object which needs indirect external
> >> -          access.  */
> >> -       _dl_signal_error (0, map->l_name, undef_name,
> >> -                         N_("copy relocation against non-copyable protected symbol"));
> >> -      else if (ref->st_value != 0
> >> -              && ref->st_shndx == SHN_UNDEF
> >> -              && (type_class & ELF_RTYPE_CLASS_PLT))
> >> -       /* Disallow non-zero symbol values of undefined symbols in
> >> -          executable, which are used as the function pointer, against
> >> -          protected function symbols in a shared object with indirect
> >> -          external access.  */
> >> -       _dl_signal_error (0, map->l_name, undef_name,
> >> -                         N_("non-canonical reference to canonical protected function"));
> >> -    }
> >> +  if (undef_map == NULL || undef_map->l_type != lt_executable)
> >> +    return;
> >> +
> >> +  if (type_class & ELF_RTYPE_CLASS_COPY)
> >> +    /* Disallow copy relocations in executable against protected
> >> +       data symbols in a shared object which needs indirect external
> >> +       access.  */
> >> +    _dl_error_printf ("warning: copy relocation against non-copyable "
> >> +                     "protected symbol `%s' in `%s'\n",
> >> +                     undef_name, map->l_name);
> >> +  else if ((type_class & ELF_RTYPE_CLASS_PLT) && ref->st_value != 0
> >> +          && ref->st_shndx == SHN_UNDEF)
> >> +    /* Disallow non-zero symbol values of undefined symbols in
> >> +       executable, which are used as the function pointer, against
> >> +       protected function symbols in a shared object with indirect
> >> +       external access.  */
> >> +    _dl_error_printf (
> >> +       "warning: direct reference to "
> >> +       "protected function `%s' in `%s' may break pointer equality\n",
> >> +       undef_name, map->l_name);
> >> +  else
> >> +    return;
> >> +
> >> +  if (map->l_1_needed & GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS)
> >> +    _dl_signal_error (
> >> +       0, map->l_name, undef_name,
> >> +       N_ ("error due to GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS"));
> >>  }
> >>
> >>  #endif /* _DL_PROTECTED_H */
> >> --
> >> 2.36.1.255.ge46751e96f-goog
> >>
> >
> >Does this patch cause any extra glibc test failures?
>
> `make -j 50 check` has no regression on x86-64.

With GCC and bfd linker?


-- 
H.J.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2] elf: Refine direct extern access diagnostics to protected symbol
  2022-06-10 22:03     ` H.J. Lu
@ 2022-06-10 22:47       ` Fangrui Song
  2022-06-14 19:50         ` Fangrui Song
  0 siblings, 1 reply; 9+ messages in thread
From: Fangrui Song @ 2022-06-10 22:47 UTC (permalink / raw)
  To: H.J. Lu; +Cc: GNU C Library

On 2022-06-10, H.J. Lu wrote:
>On Fri, Jun 10, 2022 at 2:23 PM Fangrui Song <maskray@google.com> wrote:
>>
>>
>> On 2022-06-10, H.J. Lu wrote:
>> >On Wed, Jun 8, 2022 at 12:37 PM Fangrui Song via Libc-alpha
>> ><libc-alpha@sourceware.org> wrote:
>> >>
>> >> Refine commit 349b0441dab375099b1d7f6909c1742286a67da9:
>> >>
>> >> 1. Copy relocations for extern protected data do not work properly,
>> >> regardless whether GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS is used.
>> >> It makes sense to produce a warning unconditionally.  When the defining
>> >> shared object has GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS, report
>> >> an error to satisfy the "no copy relocations" enforcement intended by
>> >> this GNU property.
>> >>
>> >> 2. Non-zero value of an undefined function symbol may break pointer
>> >> equality, but may be benign in many cases (many programs don't take the
>> >> address in the shared object then compare it with the address in the
>> >> executable).  Reword the diagnostic to be clearer.
>> >>
>> >> 3. Remove the unneeded condition !(undef_map->l_1_needed &
>> >> GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS). If the executable has
>> >> GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS (can only occur in error
>> >> cases), the diagnostic should be emitted as well.
>> >>
>> >> --
>> >> Changes from v1:
>> >> * Keep 2 as an error in the presence of GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS
>> >>   as requested by H.J. Lu.
>> >> ---
>> >>  sysdeps/generic/dl-protected.h | 50 ++++++++++++++++++----------------
>> >>  1 file changed, 27 insertions(+), 23 deletions(-)
>> >>
>> >> diff --git a/sysdeps/generic/dl-protected.h b/sysdeps/generic/dl-protected.h
>> >> index 88cb8ec917..38386b5200 100644
>> >> --- a/sysdeps/generic/dl-protected.h
>> >> +++ b/sysdeps/generic/dl-protected.h
>> >> @@ -26,29 +26,33 @@ _dl_check_protected_symbol (const char *undef_name,
>> >>                             const struct link_map *map,
>> >>                             int type_class)
>> >>  {
>> >> -  if (undef_map != NULL
>> >> -      && undef_map->l_type == lt_executable
>> >> -      && !(undef_map->l_1_needed
>> >> -          & GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS)
>> >> -      && (map->l_1_needed
>> >> -         & GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS))
>> >> -    {
>> >> -      if ((type_class & ELF_RTYPE_CLASS_COPY))
>> >> -       /* Disallow copy relocations in executable against protected
>> >> -          data symbols in a shared object which needs indirect external
>> >> -          access.  */
>> >> -       _dl_signal_error (0, map->l_name, undef_name,
>> >> -                         N_("copy relocation against non-copyable protected symbol"));
>> >> -      else if (ref->st_value != 0
>> >> -              && ref->st_shndx == SHN_UNDEF
>> >> -              && (type_class & ELF_RTYPE_CLASS_PLT))
>> >> -       /* Disallow non-zero symbol values of undefined symbols in
>> >> -          executable, which are used as the function pointer, against
>> >> -          protected function symbols in a shared object with indirect
>> >> -          external access.  */
>> >> -       _dl_signal_error (0, map->l_name, undef_name,
>> >> -                         N_("non-canonical reference to canonical protected function"));
>> >> -    }
>> >> +  if (undef_map == NULL || undef_map->l_type != lt_executable)
>> >> +    return;
>> >> +
>> >> +  if (type_class & ELF_RTYPE_CLASS_COPY)
>> >> +    /* Disallow copy relocations in executable against protected
>> >> +       data symbols in a shared object which needs indirect external
>> >> +       access.  */
>> >> +    _dl_error_printf ("warning: copy relocation against non-copyable "
>> >> +                     "protected symbol `%s' in `%s'\n",
>> >> +                     undef_name, map->l_name);
>> >> +  else if ((type_class & ELF_RTYPE_CLASS_PLT) && ref->st_value != 0
>> >> +          && ref->st_shndx == SHN_UNDEF)
>> >> +    /* Disallow non-zero symbol values of undefined symbols in
>> >> +       executable, which are used as the function pointer, against
>> >> +       protected function symbols in a shared object with indirect
>> >> +       external access.  */
>> >> +    _dl_error_printf (
>> >> +       "warning: direct reference to "
>> >> +       "protected function `%s' in `%s' may break pointer equality\n",
>> >> +       undef_name, map->l_name);
>> >> +  else
>> >> +    return;
>> >> +
>> >> +  if (map->l_1_needed & GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS)
>> >> +    _dl_signal_error (
>> >> +       0, map->l_name, undef_name,
>> >> +       N_ ("error due to GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS"));
>> >>  }
>> >>
>> >>  #endif /* _DL_PROTECTED_H */
>> >> --
>> >> 2.36.1.255.ge46751e96f-goog
>> >>
>> >
>> >Does this patch cause any extra glibc test failures?
>>
>> `make -j 50 check` has no regression on x86-64.
>
>With GCC and bfd linker?

Yes.
I have just tested both (a) ld is bfd and (b) /usr/local/bin/ld is lld.
No regression.

Note: clang cannot build glibc yet.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2] elf: Refine direct extern access diagnostics to protected symbol
  2022-06-08 19:37 [PATCH v2] elf: Refine direct extern access diagnostics to protected symbol Fangrui Song
  2022-06-10 20:43 ` H.J. Lu
@ 2022-06-12 21:24 ` H.J. Lu
  2022-06-12 21:35   ` Fangrui Song
  2022-06-14 19:53 ` H.J. Lu
  2 siblings, 1 reply; 9+ messages in thread
From: H.J. Lu @ 2022-06-12 21:24 UTC (permalink / raw)
  To: Fangrui Song; +Cc: GNU C Library

On Wed, Jun 8, 2022 at 12:37 PM Fangrui Song via Libc-alpha
<libc-alpha@sourceware.org> wrote:
>
> Refine commit 349b0441dab375099b1d7f6909c1742286a67da9:
>
> 1. Copy relocations for extern protected data do not work properly,
> regardless whether GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS is used.
> It makes sense to produce a warning unconditionally.  When the defining
> shared object has GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS, report
> an error to satisfy the "no copy relocations" enforcement intended by
> this GNU property.
>
> 2. Non-zero value of an undefined function symbol may break pointer
> equality, but may be benign in many cases (many programs don't take the
> address in the shared object then compare it with the address in the
> executable).  Reword the diagnostic to be clearer.
>
> 3. Remove the unneeded condition !(undef_map->l_1_needed &
> GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS). If the executable has
> GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS (can only occur in error
> cases), the diagnostic should be emitted as well.
>
> --
> Changes from v1:
> * Keep 2 as an error in the presence of GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS
>   as requested by H.J. Lu.
> ---
>  sysdeps/generic/dl-protected.h | 50 ++++++++++++++++++----------------
>  1 file changed, 27 insertions(+), 23 deletions(-)
>
> diff --git a/sysdeps/generic/dl-protected.h b/sysdeps/generic/dl-protected.h
> index 88cb8ec917..38386b5200 100644
> --- a/sysdeps/generic/dl-protected.h
> +++ b/sysdeps/generic/dl-protected.h
> @@ -26,29 +26,33 @@ _dl_check_protected_symbol (const char *undef_name,
>                             const struct link_map *map,
>                             int type_class)
>  {
> -  if (undef_map != NULL
> -      && undef_map->l_type == lt_executable
> -      && !(undef_map->l_1_needed
> -          & GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS)
> -      && (map->l_1_needed
> -         & GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS))
> -    {
> -      if ((type_class & ELF_RTYPE_CLASS_COPY))
> -       /* Disallow copy relocations in executable against protected
> -          data symbols in a shared object which needs indirect external
> -          access.  */
> -       _dl_signal_error (0, map->l_name, undef_name,
> -                         N_("copy relocation against non-copyable protected symbol"));
> -      else if (ref->st_value != 0
> -              && ref->st_shndx == SHN_UNDEF
> -              && (type_class & ELF_RTYPE_CLASS_PLT))
> -       /* Disallow non-zero symbol values of undefined symbols in
> -          executable, which are used as the function pointer, against
> -          protected function symbols in a shared object with indirect
> -          external access.  */
> -       _dl_signal_error (0, map->l_name, undef_name,
> -                         N_("non-canonical reference to canonical protected function"));
> -    }
> +  if (undef_map == NULL || undef_map->l_type != lt_executable)
> +    return;
> +
> +  if (type_class & ELF_RTYPE_CLASS_COPY)
> +    /* Disallow copy relocations in executable against protected
> +       data symbols in a shared object which needs indirect external
> +       access.  */
> +    _dl_error_printf ("warning: copy relocation against non-copyable "
> +                     "protected symbol `%s' in `%s'\n",
> +                     undef_name, map->l_name);
> +  else if ((type_class & ELF_RTYPE_CLASS_PLT) && ref->st_value != 0
> +          && ref->st_shndx == SHN_UNDEF)
> +    /* Disallow non-zero symbol values of undefined symbols in
> +       executable, which are used as the function pointer, against
> +       protected function symbols in a shared object with indirect
> +       external access.  */
> +    _dl_error_printf (
> +       "warning: direct reference to "

I think the format convention is

     _dl_error_printf ("warning: direct reference to "

> +       "protected function `%s' in `%s' may break pointer equality\n",
> +       undef_name, map->l_name);
> +  else
> +    return;
> +
> +  if (map->l_1_needed & GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS)
> +    _dl_signal_error (
> +       0, map->l_name, undef_name,

_dl_signal_error (0, map->l_name, undef_name,

> +       N_ ("error due to GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS"));
>  }
>
>  #endif /* _DL_PROTECTED_H */
> --
> 2.36.1.255.ge46751e96f-goog
>


-- 
H.J.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2] elf: Refine direct extern access diagnostics to protected symbol
  2022-06-12 21:24 ` H.J. Lu
@ 2022-06-12 21:35   ` Fangrui Song
  0 siblings, 0 replies; 9+ messages in thread
From: Fangrui Song @ 2022-06-12 21:35 UTC (permalink / raw)
  To: H.J. Lu; +Cc: GNU C Library

On Sun, Jun 12, 2022 at 2:24 PM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> On Wed, Jun 8, 2022 at 12:37 PM Fangrui Song via Libc-alpha
> <libc-alpha@sourceware.org> wrote:
> >
> > Refine commit 349b0441dab375099b1d7f6909c1742286a67da9:
> >
> > 1. Copy relocations for extern protected data do not work properly,
> > regardless whether GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS is used.
> > It makes sense to produce a warning unconditionally.  When the defining
> > shared object has GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS, report
> > an error to satisfy the "no copy relocations" enforcement intended by
> > this GNU property.
> >
> > 2. Non-zero value of an undefined function symbol may break pointer
> > equality, but may be benign in many cases (many programs don't take the
> > address in the shared object then compare it with the address in the
> > executable).  Reword the diagnostic to be clearer.
> >
> > 3. Remove the unneeded condition !(undef_map->l_1_needed &
> > GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS). If the executable has
> > GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS (can only occur in error
> > cases), the diagnostic should be emitted as well.
> >
> > --
> > Changes from v1:
> > * Keep 2 as an error in the presence of GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS
> >   as requested by H.J. Lu.
> > ---
> >  sysdeps/generic/dl-protected.h | 50 ++++++++++++++++++----------------
> >  1 file changed, 27 insertions(+), 23 deletions(-)
> >
> > diff --git a/sysdeps/generic/dl-protected.h b/sysdeps/generic/dl-protected.h
> > index 88cb8ec917..38386b5200 100644
> > --- a/sysdeps/generic/dl-protected.h
> > +++ b/sysdeps/generic/dl-protected.h
> > @@ -26,29 +26,33 @@ _dl_check_protected_symbol (const char *undef_name,
> >                             const struct link_map *map,
> >                             int type_class)
> >  {
> > -  if (undef_map != NULL
> > -      && undef_map->l_type == lt_executable
> > -      && !(undef_map->l_1_needed
> > -          & GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS)
> > -      && (map->l_1_needed
> > -         & GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS))
> > -    {
> > -      if ((type_class & ELF_RTYPE_CLASS_COPY))
> > -       /* Disallow copy relocations in executable against protected
> > -          data symbols in a shared object which needs indirect external
> > -          access.  */
> > -       _dl_signal_error (0, map->l_name, undef_name,
> > -                         N_("copy relocation against non-copyable protected symbol"));
> > -      else if (ref->st_value != 0
> > -              && ref->st_shndx == SHN_UNDEF
> > -              && (type_class & ELF_RTYPE_CLASS_PLT))
> > -       /* Disallow non-zero symbol values of undefined symbols in
> > -          executable, which are used as the function pointer, against
> > -          protected function symbols in a shared object with indirect
> > -          external access.  */
> > -       _dl_signal_error (0, map->l_name, undef_name,
> > -                         N_("non-canonical reference to canonical protected function"));
> > -    }
> > +  if (undef_map == NULL || undef_map->l_type != lt_executable)
> > +    return;
> > +
> > +  if (type_class & ELF_RTYPE_CLASS_COPY)
> > +    /* Disallow copy relocations in executable against protected
> > +       data symbols in a shared object which needs indirect external
> > +       access.  */
> > +    _dl_error_printf ("warning: copy relocation against non-copyable "
> > +                     "protected symbol `%s' in `%s'\n",
> > +                     undef_name, map->l_name);
> > +  else if ((type_class & ELF_RTYPE_CLASS_PLT) && ref->st_value != 0
> > +          && ref->st_shndx == SHN_UNDEF)
> > +    /* Disallow non-zero symbol values of undefined symbols in
> > +       executable, which are used as the function pointer, against
> > +       protected function symbols in a shared object with indirect
> > +       external access.  */
> > +    _dl_error_printf (
> > +       "warning: direct reference to "
>
> I think the format convention is
>
>      _dl_error_printf ("warning: direct reference to "

The patch matches both Emacs C-M-\ (GNU indentation style) and clang-format.
They place the string literal on the continuation line...

> > +       "protected function `%s' in `%s' may break pointer equality\n",
> > +       undef_name, map->l_name);
> > +  else
> > +    return;
> > +
> > +  if (map->l_1_needed & GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS)
> > +    _dl_signal_error (
> > +       0, map->l_name, undef_name,
>
> _dl_signal_error (0, map->l_name, undef_name,
>
> > +       N_ ("error due to GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS"));
> >  }
> >
> >  #endif /* _DL_PROTECTED_H */
> > --
> > 2.36.1.255.ge46751e96f-goog
> >
>
>
> --
> H.J.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2] elf: Refine direct extern access diagnostics to protected symbol
  2022-06-10 22:47       ` Fangrui Song
@ 2022-06-14 19:50         ` Fangrui Song
  0 siblings, 0 replies; 9+ messages in thread
From: Fangrui Song @ 2022-06-14 19:50 UTC (permalink / raw)
  To: H.J. Lu; +Cc: GNU C Library

On 2022-06-10, Fangrui Song wrote:
>On 2022-06-10, H.J. Lu wrote:
>>On Fri, Jun 10, 2022 at 2:23 PM Fangrui Song <maskray@google.com> wrote:
>>>
>>>
>>>On 2022-06-10, H.J. Lu wrote:
>>>>On Wed, Jun 8, 2022 at 12:37 PM Fangrui Song via Libc-alpha
>>>><libc-alpha@sourceware.org> wrote:
>>>>>
>>>>> Refine commit 349b0441dab375099b1d7f6909c1742286a67da9:
>>>>>
>>>>> 1. Copy relocations for extern protected data do not work properly,
>>>>> regardless whether GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS is used.
>>>>> It makes sense to produce a warning unconditionally.  When the defining
>>>>> shared object has GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS, report
>>>>> an error to satisfy the "no copy relocations" enforcement intended by
>>>>> this GNU property.
>>>>>
>>>>> 2. Non-zero value of an undefined function symbol may break pointer
>>>>> equality, but may be benign in many cases (many programs don't take the
>>>>> address in the shared object then compare it with the address in the
>>>>> executable).  Reword the diagnostic to be clearer.
>>>>>
>>>>> 3. Remove the unneeded condition !(undef_map->l_1_needed &
>>>>> GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS). If the executable has
>>>>> GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS (can only occur in error
>>>>> cases), the diagnostic should be emitted as well.
>>>>>
>>>>> --
>>>>> Changes from v1:
>>>>> * Keep 2 as an error in the presence of GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS
>>>>>   as requested by H.J. Lu.
>>>>> ---
>>>>>  sysdeps/generic/dl-protected.h | 50 ++++++++++++++++++----------------
>>>>>  1 file changed, 27 insertions(+), 23 deletions(-)
>>>>>
>>>>> diff --git a/sysdeps/generic/dl-protected.h b/sysdeps/generic/dl-protected.h
>>>>> index 88cb8ec917..38386b5200 100644
>>>>> --- a/sysdeps/generic/dl-protected.h
>>>>> +++ b/sysdeps/generic/dl-protected.h
>>>>> @@ -26,29 +26,33 @@ _dl_check_protected_symbol (const char *undef_name,
>>>>>                             const struct link_map *map,
>>>>>                             int type_class)
>>>>>  {
>>>>> -  if (undef_map != NULL
>>>>> -      && undef_map->l_type == lt_executable
>>>>> -      && !(undef_map->l_1_needed
>>>>> -          & GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS)
>>>>> -      && (map->l_1_needed
>>>>> -         & GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS))
>>>>> -    {
>>>>> -      if ((type_class & ELF_RTYPE_CLASS_COPY))
>>>>> -       /* Disallow copy relocations in executable against protected
>>>>> -          data symbols in a shared object which needs indirect external
>>>>> -          access.  */
>>>>> -       _dl_signal_error (0, map->l_name, undef_name,
>>>>> -                         N_("copy relocation against non-copyable protected symbol"));
>>>>> -      else if (ref->st_value != 0
>>>>> -              && ref->st_shndx == SHN_UNDEF
>>>>> -              && (type_class & ELF_RTYPE_CLASS_PLT))
>>>>> -       /* Disallow non-zero symbol values of undefined symbols in
>>>>> -          executable, which are used as the function pointer, against
>>>>> -          protected function symbols in a shared object with indirect
>>>>> -          external access.  */
>>>>> -       _dl_signal_error (0, map->l_name, undef_name,
>>>>> -                         N_("non-canonical reference to canonical protected function"));
>>>>> -    }
>>>>> +  if (undef_map == NULL || undef_map->l_type != lt_executable)
>>>>> +    return;
>>>>> +
>>>>> +  if (type_class & ELF_RTYPE_CLASS_COPY)
>>>>> +    /* Disallow copy relocations in executable against protected
>>>>> +       data symbols in a shared object which needs indirect external
>>>>> +       access.  */
>>>>> +    _dl_error_printf ("warning: copy relocation against non-copyable "
>>>>> +                     "protected symbol `%s' in `%s'\n",
>>>>> +                     undef_name, map->l_name);
>>>>> +  else if ((type_class & ELF_RTYPE_CLASS_PLT) && ref->st_value != 0
>>>>> +          && ref->st_shndx == SHN_UNDEF)
>>>>> +    /* Disallow non-zero symbol values of undefined symbols in
>>>>> +       executable, which are used as the function pointer, against
>>>>> +       protected function symbols in a shared object with indirect
>>>>> +       external access.  */
>>>>> +    _dl_error_printf (
>>>>> +       "warning: direct reference to "
>>>>> +       "protected function `%s' in `%s' may break pointer equality\n",
>>>>> +       undef_name, map->l_name);
>>>>> +  else
>>>>> +    return;
>>>>> +
>>>>> +  if (map->l_1_needed & GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS)
>>>>> +    _dl_signal_error (
>>>>> +       0, map->l_name, undef_name,
>>>>> +       N_ ("error due to GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS"));
>>>>>  }
>>>>>
>>>>>  #endif /* _DL_PROTECTED_H */
>>>>> --
>>>>> 2.36.1.255.ge46751e96f-goog
>>>>>
>>>>
>>>>Does this patch cause any extra glibc test failures?
>>>
>>>`make -j 50 check` has no regression on x86-64.
>>
>>With GCC and bfd linker?
>
>Yes.
>I have just tested both (a) ld is bfd and (b) /usr/local/bin/ld is lld.
>No regression.
>
>Note: clang cannot build glibc yet.

Hi H.J.

Does the patch look good?

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2] elf: Refine direct extern access diagnostics to protected symbol
  2022-06-08 19:37 [PATCH v2] elf: Refine direct extern access diagnostics to protected symbol Fangrui Song
  2022-06-10 20:43 ` H.J. Lu
  2022-06-12 21:24 ` H.J. Lu
@ 2022-06-14 19:53 ` H.J. Lu
  2 siblings, 0 replies; 9+ messages in thread
From: H.J. Lu @ 2022-06-14 19:53 UTC (permalink / raw)
  To: Fangrui Song; +Cc: GNU C Library

On Wed, Jun 8, 2022 at 12:37 PM Fangrui Song via Libc-alpha
<libc-alpha@sourceware.org> wrote:
>
> Refine commit 349b0441dab375099b1d7f6909c1742286a67da9:
>
> 1. Copy relocations for extern protected data do not work properly,
> regardless whether GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS is used.
> It makes sense to produce a warning unconditionally.  When the defining
> shared object has GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS, report
> an error to satisfy the "no copy relocations" enforcement intended by
> this GNU property.
>
> 2. Non-zero value of an undefined function symbol may break pointer
> equality, but may be benign in many cases (many programs don't take the
> address in the shared object then compare it with the address in the
> executable).  Reword the diagnostic to be clearer.
>
> 3. Remove the unneeded condition !(undef_map->l_1_needed &
> GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS). If the executable has
> GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS (can only occur in error
> cases), the diagnostic should be emitted as well.
>
> --
> Changes from v1:
> * Keep 2 as an error in the presence of GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS
>   as requested by H.J. Lu.
> ---
>  sysdeps/generic/dl-protected.h | 50 ++++++++++++++++++----------------
>  1 file changed, 27 insertions(+), 23 deletions(-)
>
> diff --git a/sysdeps/generic/dl-protected.h b/sysdeps/generic/dl-protected.h
> index 88cb8ec917..38386b5200 100644
> --- a/sysdeps/generic/dl-protected.h
> +++ b/sysdeps/generic/dl-protected.h
> @@ -26,29 +26,33 @@ _dl_check_protected_symbol (const char *undef_name,
>                             const struct link_map *map,
>                             int type_class)
>  {
> -  if (undef_map != NULL
> -      && undef_map->l_type == lt_executable
> -      && !(undef_map->l_1_needed
> -          & GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS)
> -      && (map->l_1_needed
> -         & GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS))
> -    {
> -      if ((type_class & ELF_RTYPE_CLASS_COPY))
> -       /* Disallow copy relocations in executable against protected
> -          data symbols in a shared object which needs indirect external
> -          access.  */
> -       _dl_signal_error (0, map->l_name, undef_name,
> -                         N_("copy relocation against non-copyable protected symbol"));
> -      else if (ref->st_value != 0
> -              && ref->st_shndx == SHN_UNDEF
> -              && (type_class & ELF_RTYPE_CLASS_PLT))
> -       /* Disallow non-zero symbol values of undefined symbols in
> -          executable, which are used as the function pointer, against
> -          protected function symbols in a shared object with indirect
> -          external access.  */
> -       _dl_signal_error (0, map->l_name, undef_name,
> -                         N_("non-canonical reference to canonical protected function"));
> -    }
> +  if (undef_map == NULL || undef_map->l_type != lt_executable)
> +    return;
> +
> +  if (type_class & ELF_RTYPE_CLASS_COPY)
> +    /* Disallow copy relocations in executable against protected
> +       data symbols in a shared object which needs indirect external
> +       access.  */
> +    _dl_error_printf ("warning: copy relocation against non-copyable "
> +                     "protected symbol `%s' in `%s'\n",
> +                     undef_name, map->l_name);
> +  else if ((type_class & ELF_RTYPE_CLASS_PLT) && ref->st_value != 0
> +          && ref->st_shndx == SHN_UNDEF)
> +    /* Disallow non-zero symbol values of undefined symbols in
> +       executable, which are used as the function pointer, against
> +       protected function symbols in a shared object with indirect
> +       external access.  */
> +    _dl_error_printf (
> +       "warning: direct reference to "
> +       "protected function `%s' in `%s' may break pointer equality\n",
> +       undef_name, map->l_name);
> +  else
> +    return;
> +
> +  if (map->l_1_needed & GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS)
> +    _dl_signal_error (
> +       0, map->l_name, undef_name,
> +       N_ ("error due to GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS"));
>  }
>
>  #endif /* _DL_PROTECTED_H */
> --
> 2.36.1.255.ge46751e96f-goog
>

LGTM.

Thanks.

-- 
H.J.

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2022-06-14 19:54 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-08 19:37 [PATCH v2] elf: Refine direct extern access diagnostics to protected symbol Fangrui Song
2022-06-10 20:43 ` H.J. Lu
2022-06-10 21:23   ` Fangrui Song
2022-06-10 22:03     ` H.J. Lu
2022-06-10 22:47       ` Fangrui Song
2022-06-14 19:50         ` Fangrui Song
2022-06-12 21:24 ` H.J. Lu
2022-06-12 21:35   ` Fangrui Song
2022-06-14 19:53 ` H.J. Lu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).