elf: Turn _dl_printf, _dl_error_printf, _dl_fatal_printf into functions

Message ID 871rnfg8hx.fsf@oldenburg2.str.redhat.com
State Committed
Headers
Series elf: Turn _dl_printf, _dl_error_printf, _dl_fatal_printf into functions |

Commit Message

Florian Weimer May 19, 2020, 5:06 p.m. UTC
  This change makes it easier to set a breakpoint on these calls.

This also addresses the issue that including <ldsodefs.h> without
<unistd.h> does not result usable _dl_*printf macros because of the
use of the STD*_FILENO macros there.

(The private symbol for _dl_fatal_printf will go away again once the
exception handling implementation is unified between libc and ld.so.)

---
 elf/Versions               |  2 +-
 elf/dl-misc.c              | 31 +++++++++++++++++++++++++++++++
 sysdeps/generic/ldsodefs.h | 19 +++++++------------
 3 files changed, 39 insertions(+), 13 deletions(-)
  

Comments

Florian Weimer May 20, 2020, 10:06 a.m. UTC | #1
* Florian Weimer via Libc-alpha:

> This change makes it easier to set a breakpoint on these calls.
>
> This also addresses the issue that including <ldsodefs.h> without
> <unistd.h> does not result usable _dl_*printf macros because of the
> use of the STD*_FILENO macros there.
>
> (The private symbol for _dl_fatal_printf will go away again once the
> exception handling implementation is unified between libc and ld.so.)
>
> ---
>  elf/Versions               |  2 +-
>  elf/dl-misc.c              | 31 +++++++++++++++++++++++++++++++
>  sysdeps/generic/ldsodefs.h | 19 +++++++------------
>  3 files changed, 39 insertions(+), 13 deletions(-)

I forgot the localplt update for Hurd in my patch.  I've fixed that
locally.

Thanks,
Florian
  
Adhemerval Zanella Netto May 21, 2020, 7:08 p.m. UTC | #2
On 19/05/2020 14:06, Florian Weimer via Libc-alpha wrote:
> This change makes it easier to set a breakpoint on these calls.
> 
> This also addresses the issue that including <ldsodefs.h> without
> <unistd.h> does not result usable _dl_*printf macros because of the
> use of the STD*_FILENO macros there.
> 
> (The private symbol for _dl_fatal_printf will go away again once the
> exception handling implementation is unified between libc and ld.so.)

LGTM, thanks.

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

> 
> ---
>  elf/Versions               |  2 +-
>  elf/dl-misc.c              | 31 +++++++++++++++++++++++++++++++
>  sysdeps/generic/ldsodefs.h | 19 +++++++------------
>  3 files changed, 39 insertions(+), 13 deletions(-)
> 
> diff --git a/elf/Versions b/elf/Versions
> index 3be879c4ad..be88c48e6d 100644
> --- a/elf/Versions
> +++ b/elf/Versions
> @@ -58,7 +58,7 @@ ld {
>      _dl_allocate_tls; _dl_allocate_tls_init;
>      _dl_argv; _dl_find_dso_for_object; _dl_get_tls_static_info;
>      _dl_deallocate_tls; _dl_make_stack_executable;
> -    _dl_rtld_di_serinfo; _dl_starting_up;
> +    _dl_rtld_di_serinfo; _dl_starting_up; _dl_fatal_printf;
>      _rtld_global; _rtld_global_ro;
>  
>      # Only here for gdb while a better method is developed.
> diff --git a/elf/dl-misc.c b/elf/dl-misc.c
> index e6cf247b46..ab70481fda 100644
> --- a/elf/dl-misc.c
> +++ b/elf/dl-misc.c
> @@ -275,6 +275,37 @@ _dl_dprintf (int fd, const char *fmt, ...)
>    va_end (arg);
>  }
>  
> +void
> +_dl_printf (const char *fmt, ...)
> +{
> +  va_list arg;
> +
> +  va_start (arg, fmt);
> +  _dl_debug_vdprintf (STDOUT_FILENO, 0, fmt, arg);
> +  va_end (arg);
> +}
> +
> +void
> +_dl_error_printf (const char *fmt, ...)
> +{
> +  va_list arg;
> +
> +  va_start (arg, fmt);
> +  _dl_debug_vdprintf (STDERR_FILENO, 0, fmt, arg);
> +  va_end (arg);
> +}
> +
> +void
> +_dl_fatal_printf (const char *fmt, ...)
> +{
> +  va_list arg;
> +
> +  va_start (arg, fmt);
> +  _dl_debug_vdprintf (STDERR_FILENO, 0, fmt, arg);
> +  va_end (arg);
> +  _exit (127);
> +}
> +rtld_hidden_def (_dl_fatal_printf)
>  
>  /* Test whether given NAME matches any of the names of the given object.  */
>  int
> diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
> index 5ff4a2831b..d08b97a5ef 100644
> --- a/sysdeps/generic/ldsodefs.h
> +++ b/sysdeps/generic/ldsodefs.h
> @@ -751,24 +751,19 @@ _dl_dprintf (int fd, const char *fmt, ...)
>  
>  /* Write a message on the specified descriptor standard output.  The
>     parameters are interpreted as for a `printf' call.  */
> -#define _dl_printf(fmt, args...) \
> -  _dl_dprintf (STDOUT_FILENO, fmt, ##args)
> +void _dl_printf (const char *fmt, ...)
> +  attribute_hidden __attribute__ ((__format__ (__printf__, 1, 2)));
>  
>  /* Write a message on the specified descriptor standard error.  The
>     parameters are interpreted as for a `printf' call.  */
> -#define _dl_error_printf(fmt, args...) \
> -  _dl_dprintf (STDERR_FILENO, fmt, ##args)
> +void _dl_error_printf (const char *fmt, ...)
> +  attribute_hidden __attribute__ ((__format__ (__printf__, 1, 2)));
>  
>  /* Write a message on the specified descriptor standard error and exit
>     the program.  The parameters are interpreted as for a `printf' call.  */
> -#define _dl_fatal_printf(fmt, args...) \
> -  do									      \
> -    {									      \
> -      _dl_dprintf (STDERR_FILENO, fmt, ##args);				      \
> -      _exit (127);							      \
> -    }									      \
> -  while (1)
> -
> +void _dl_fatal_printf (const char *fmt, ...)
> +  __attribute__ ((__format__ (__printf__, 1, 2), __noreturn__));
> +rtld_hidden_proto (_dl_fatal_printf)
>  
>  /* An exception raised by the _dl_signal_error function family and
>     caught by _dl_catch_error function family.  Exceptions themselves
>
  

Patch

diff --git a/elf/Versions b/elf/Versions
index 3be879c4ad..be88c48e6d 100644
--- a/elf/Versions
+++ b/elf/Versions
@@ -58,7 +58,7 @@  ld {
     _dl_allocate_tls; _dl_allocate_tls_init;
     _dl_argv; _dl_find_dso_for_object; _dl_get_tls_static_info;
     _dl_deallocate_tls; _dl_make_stack_executable;
-    _dl_rtld_di_serinfo; _dl_starting_up;
+    _dl_rtld_di_serinfo; _dl_starting_up; _dl_fatal_printf;
     _rtld_global; _rtld_global_ro;
 
     # Only here for gdb while a better method is developed.
diff --git a/elf/dl-misc.c b/elf/dl-misc.c
index e6cf247b46..ab70481fda 100644
--- a/elf/dl-misc.c
+++ b/elf/dl-misc.c
@@ -275,6 +275,37 @@  _dl_dprintf (int fd, const char *fmt, ...)
   va_end (arg);
 }
 
+void
+_dl_printf (const char *fmt, ...)
+{
+  va_list arg;
+
+  va_start (arg, fmt);
+  _dl_debug_vdprintf (STDOUT_FILENO, 0, fmt, arg);
+  va_end (arg);
+}
+
+void
+_dl_error_printf (const char *fmt, ...)
+{
+  va_list arg;
+
+  va_start (arg, fmt);
+  _dl_debug_vdprintf (STDERR_FILENO, 0, fmt, arg);
+  va_end (arg);
+}
+
+void
+_dl_fatal_printf (const char *fmt, ...)
+{
+  va_list arg;
+
+  va_start (arg, fmt);
+  _dl_debug_vdprintf (STDERR_FILENO, 0, fmt, arg);
+  va_end (arg);
+  _exit (127);
+}
+rtld_hidden_def (_dl_fatal_printf)
 
 /* Test whether given NAME matches any of the names of the given object.  */
 int
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
index 5ff4a2831b..d08b97a5ef 100644
--- a/sysdeps/generic/ldsodefs.h
+++ b/sysdeps/generic/ldsodefs.h
@@ -751,24 +751,19 @@  _dl_dprintf (int fd, const char *fmt, ...)
 
 /* Write a message on the specified descriptor standard output.  The
    parameters are interpreted as for a `printf' call.  */
-#define _dl_printf(fmt, args...) \
-  _dl_dprintf (STDOUT_FILENO, fmt, ##args)
+void _dl_printf (const char *fmt, ...)
+  attribute_hidden __attribute__ ((__format__ (__printf__, 1, 2)));
 
 /* Write a message on the specified descriptor standard error.  The
    parameters are interpreted as for a `printf' call.  */
-#define _dl_error_printf(fmt, args...) \
-  _dl_dprintf (STDERR_FILENO, fmt, ##args)
+void _dl_error_printf (const char *fmt, ...)
+  attribute_hidden __attribute__ ((__format__ (__printf__, 1, 2)));
 
 /* Write a message on the specified descriptor standard error and exit
    the program.  The parameters are interpreted as for a `printf' call.  */
-#define _dl_fatal_printf(fmt, args...) \
-  do									      \
-    {									      \
-      _dl_dprintf (STDERR_FILENO, fmt, ##args);				      \
-      _exit (127);							      \
-    }									      \
-  while (1)
-
+void _dl_fatal_printf (const char *fmt, ...)
+  __attribute__ ((__format__ (__printf__, 1, 2), __noreturn__));
+rtld_hidden_proto (_dl_fatal_printf)
 
 /* An exception raised by the _dl_signal_error function family and
    caught by _dl_catch_error function family.  Exceptions themselves