elf: Do not add a copy of _dl_find_object to libc.so

Message ID 87le325yj3.fsf@oldenburg.str.redhat.com
State Committed
Headers
Series elf: Do not add a copy of _dl_find_object to libc.so |

Checks

Context Check Description
redhat-pt-bot/TryBot-apply_patch success Patch applied to master at the time it was sent
linaro-tcwg-bot/tcwg_glibc_build--master-aarch64 success Build passed
redhat-pt-bot/TryBot-32bit success Build for i686
linaro-tcwg-bot/tcwg_glibc_build--master-arm success Build passed
linaro-tcwg-bot/tcwg_glibc_check--master-arm success Test passed
linaro-tcwg-bot/tcwg_glibc_check--master-aarch64 success Test passed

Commit Message

Florian Weimer June 18, 2024, 10:35 a.m. UTC
  This reduces code size and dependencies on ld.so internals from
libc.so.

Fixes commit f4c142bb9fe6b02c0af8cfca8a920091e2dba44b
("arm: Use _dl_find_object on __gnu_Unwind_Find_exidx (BZ 31405)").

Tested on x86_64-linux-gnu and built with build-many-glibcs.py.

---
 elf/Makefile             | 2 +-
 elf/dl-find_object.c     | 5 ++---
 include/dlfcn.h          | 3 +--
 sysdeps/arm/find_exidx.c | 3 ++-
 4 files changed, 6 insertions(+), 7 deletions(-)


base-commit: eaf4fc516a4c91de0c0f88d2d7b544751ea6f72b
  

Comments

Adhemerval Zanella June 18, 2024, 8:28 p.m. UTC | #1
On 18/06/24 07:35, Florian Weimer wrote:
> This reduces code size and dependencies on ld.so internals from
> libc.so.
> 
> Fixes commit f4c142bb9fe6b02c0af8cfca8a920091e2dba44b
> ("arm: Use _dl_find_object on __gnu_Unwind_Find_exidx (BZ 31405)").
> 
> Tested on x86_64-linux-gnu and built with build-many-glibcs.py.

LGTM, thanks.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>

> 
> ---
>  elf/Makefile             | 2 +-
>  elf/dl-find_object.c     | 5 ++---
>  include/dlfcn.h          | 3 +--
>  sysdeps/arm/find_exidx.c | 3 ++-
>  4 files changed, 6 insertions(+), 7 deletions(-)
> 
> diff --git a/elf/Makefile b/elf/Makefile
> index bb6cd06dec..52b63a4be2 100644
> --- a/elf/Makefile
> +++ b/elf/Makefile
> @@ -34,7 +34,6 @@ routines = \
>    dl-addr \
>    dl-addr-obj \
>    dl-early_allocate \
> -  dl-find_object \
>    dl-iteratephdr \
>    dl-libc \
>    dl-origin \
> @@ -61,6 +60,7 @@ dl-routines = \
>    dl-deps \
>    dl-exception \
>    dl-execstack \
> +  dl-find_object \
>    dl-fini \
>    dl-init \
>    dl-load \
> diff --git a/elf/dl-find_object.c b/elf/dl-find_object.c
> index 449302eda3..940fa5c223 100644
> --- a/elf/dl-find_object.c
> +++ b/elf/dl-find_object.c
> @@ -356,7 +356,7 @@ _dlfo_lookup (uintptr_t pc, struct dl_find_object_internal *first1, size_t size)
>  }
>  
>  int
> -__dl_find_object (void *pc1, struct dl_find_object *result)
> +_dl_find_object (void *pc1, struct dl_find_object *result)
>  {
>    uintptr_t pc = (uintptr_t) pc1;
>  
> @@ -463,8 +463,7 @@ __dl_find_object (void *pc1, struct dl_find_object *result)
>          return -1;
>      } /* Transaction retry loop.  */
>  }
> -hidden_def (__dl_find_object)
> -weak_alias (__dl_find_object, _dl_find_object)
> +rtld_hidden_def (_dl_find_object)
>  
>  /* _dlfo_process_initial is called twice.  First to compute the array
>     sizes from the initial loaded mappings.  Second to fill in the
> diff --git a/include/dlfcn.h b/include/dlfcn.h
> index f49ee1b0c9..a44420fa37 100644
> --- a/include/dlfcn.h
> +++ b/include/dlfcn.h
> @@ -4,8 +4,7 @@
>  #include <link.h>		/* For ElfW.  */
>  #include <stdbool.h>
>  
> -extern __typeof (_dl_find_object) __dl_find_object;
> -hidden_proto (__dl_find_object)
> +rtld_hidden_proto (_dl_find_object)
>  
>  /* Internally used flag.  */
>  #define __RTLD_DLOPEN	0x80000000
> diff --git a/sysdeps/arm/find_exidx.c b/sysdeps/arm/find_exidx.c
> index a924d59b9f..4257c26838 100644
> --- a/sysdeps/arm/find_exidx.c
> +++ b/sysdeps/arm/find_exidx.c
> @@ -15,6 +15,7 @@
>     License along with the GNU C Library.  If not, see
>     <https://www.gnu.org/licenses/>.  */
>  
> +#include <ldsodefs.h>
>  #include <link.h>
>  
>  /* Find the exception index table containing PC.  */
> @@ -23,7 +24,7 @@ _Unwind_Ptr
>  __gnu_Unwind_Find_exidx (_Unwind_Ptr pc, int * pcount)
>  {
>    struct dl_find_object data;
> -  if (__dl_find_object ((void *) pc, &data) < 0)
> +  if (GLRO(dl_find_object) ((void *) pc, &data) < 0)
>      return 0;
>    *pcount = data.dlfo_eh_count;
>    return (_Unwind_Ptr) data.dlfo_eh_frame;
> 
> base-commit: eaf4fc516a4c91de0c0f88d2d7b544751ea6f72b
>
  

Patch

diff --git a/elf/Makefile b/elf/Makefile
index bb6cd06dec..52b63a4be2 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -34,7 +34,6 @@  routines = \
   dl-addr \
   dl-addr-obj \
   dl-early_allocate \
-  dl-find_object \
   dl-iteratephdr \
   dl-libc \
   dl-origin \
@@ -61,6 +60,7 @@  dl-routines = \
   dl-deps \
   dl-exception \
   dl-execstack \
+  dl-find_object \
   dl-fini \
   dl-init \
   dl-load \
diff --git a/elf/dl-find_object.c b/elf/dl-find_object.c
index 449302eda3..940fa5c223 100644
--- a/elf/dl-find_object.c
+++ b/elf/dl-find_object.c
@@ -356,7 +356,7 @@  _dlfo_lookup (uintptr_t pc, struct dl_find_object_internal *first1, size_t size)
 }
 
 int
-__dl_find_object (void *pc1, struct dl_find_object *result)
+_dl_find_object (void *pc1, struct dl_find_object *result)
 {
   uintptr_t pc = (uintptr_t) pc1;
 
@@ -463,8 +463,7 @@  __dl_find_object (void *pc1, struct dl_find_object *result)
         return -1;
     } /* Transaction retry loop.  */
 }
-hidden_def (__dl_find_object)
-weak_alias (__dl_find_object, _dl_find_object)
+rtld_hidden_def (_dl_find_object)
 
 /* _dlfo_process_initial is called twice.  First to compute the array
    sizes from the initial loaded mappings.  Second to fill in the
diff --git a/include/dlfcn.h b/include/dlfcn.h
index f49ee1b0c9..a44420fa37 100644
--- a/include/dlfcn.h
+++ b/include/dlfcn.h
@@ -4,8 +4,7 @@ 
 #include <link.h>		/* For ElfW.  */
 #include <stdbool.h>
 
-extern __typeof (_dl_find_object) __dl_find_object;
-hidden_proto (__dl_find_object)
+rtld_hidden_proto (_dl_find_object)
 
 /* Internally used flag.  */
 #define __RTLD_DLOPEN	0x80000000
diff --git a/sysdeps/arm/find_exidx.c b/sysdeps/arm/find_exidx.c
index a924d59b9f..4257c26838 100644
--- a/sysdeps/arm/find_exidx.c
+++ b/sysdeps/arm/find_exidx.c
@@ -15,6 +15,7 @@ 
    License along with the GNU C Library.  If not, see
    <https://www.gnu.org/licenses/>.  */
 
+#include <ldsodefs.h>
 #include <link.h>
 
 /* Find the exception index table containing PC.  */
@@ -23,7 +24,7 @@  _Unwind_Ptr
 __gnu_Unwind_Find_exidx (_Unwind_Ptr pc, int * pcount)
 {
   struct dl_find_object data;
-  if (__dl_find_object ((void *) pc, &data) < 0)
+  if (GLRO(dl_find_object) ((void *) pc, &data) < 0)
     return 0;
   *pcount = data.dlfo_eh_count;
   return (_Unwind_Ptr) data.dlfo_eh_frame;