]> sourceware.org Git - glibc.git/commitdiff
Avoid crashing in LD_DEBUG when program name is unavailable
authorSiddhesh Poyarekar <siddhesh@redhat.com>
Wed, 29 May 2013 16:00:20 +0000 (21:30 +0530)
committerSiddhesh Poyarekar <siddhesh@redhat.com>
Wed, 29 May 2013 16:04:12 +0000 (21:34 +0530)
Resolves: #15465

The program name may be unavailable if the user application tampers
with argc and argv[].  Some parts of the dynamic linker caters for
this while others don't, so this patch consolidates the check and
fallback into a single macro and updates all users.

41 files changed:
ChangeLog
NEWS
elf/Makefile
elf/dl-conflict.c
elf/dl-deps.c
elf/dl-error.c
elf/dl-fini.c
elf/dl-init.c
elf/dl-load.c
elf/dl-lookup.c
elf/dl-open.c
elf/dl-reloc.c
elf/dl-version.c
elf/rtld.c
elf/tst-null-argv-lib.c [new file with mode: 0644]
elf/tst-null-argv.c [new file with mode: 0644]
ports/ChangeLog.aarch64
ports/ChangeLog.arm
ports/ChangeLog.hppa
ports/ChangeLog.m68k
ports/ChangeLog.microblaze
ports/ChangeLog.mips
ports/ChangeLog.tile
ports/sysdeps/aarch64/dl-machine.h
ports/sysdeps/arm/dl-machine.h
ports/sysdeps/hppa/dl-machine.h
ports/sysdeps/m68k/dl-machine.h
ports/sysdeps/microblaze/dl-machine.h
ports/sysdeps/mips/dl-lookup.c
ports/sysdeps/mips/dl-machine.h
ports/sysdeps/tile/dl-machine.h
sysdeps/generic/ldsodefs.h
sysdeps/i386/dl-machine.h
sysdeps/powerpc/powerpc32/dl-machine.c
sysdeps/powerpc/powerpc64/dl-machine.h
sysdeps/s390/s390-32/dl-machine.h
sysdeps/s390/s390-64/dl-machine.h
sysdeps/sh/dl-machine.h
sysdeps/sparc/sparc32/dl-machine.h
sysdeps/sparc/sparc64/dl-machine.h
sysdeps/x86_64/dl-machine.h

index 7cd9634526fcf962d064f7b23d7bfba677ebdc92..1d7b55590239df89d29b9c94020425cb2eb434e3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,50 @@
+2013-05-29  Siddhesh Poyarekar  <siddhesh@redhat.com>
+
+       [BZ #15465]
+       * elf/Makefile (tests): Add tst-null-argv.
+       (modules-names):  Add tst-null-argv-lib.
+       ($(objpfx)tst-null-argv): Depend on tst-null-argv-lib.so.
+       (tst-null-argv-ENV): Set environment for tst-null-argv.
+       * sysdeps/generic/ldsodefs.h (DSO_FILENAME): New macro.
+       (RTLD_PROGNAME): New macro.
+       * elf/tst-null-argv.c: New test case.
+       * elf/tst-null-argv-lib.c: Library for test case.
+       * elf/dl-conflict.c (_dl_resolve_conflicts): Use DSO_FILENAME.
+       * elf/dl-deps.c (_dl_map_object_deps): Likewise.
+       * elf/dl-error.c (_dl_signal_error): Use RTLD_PROGNAME.
+       * elf/dl-fini.c (_dl_fini): Use DSO_FILENAME.
+       * elf/dl-init.c (call_init): Likewise.
+       (_dl_init): Likewise.
+       * elf/dl-load.c (print_search_path): Likewise.
+       (_dl_map_object): Likewise.
+       * elf/dl-lookup.c (do_lookup_x): Likewise.
+       (add_dependency): Likewise.
+       (_dl_lookup_symbol_x): Likewise.
+       (_dl_debug_bindings): Likewise.
+       * elf/dl-open.c (_dl_show_scope): Likewise.
+       * elf/dl-reloc.c (_dl_relocate_object): Likewise.
+       * elf/dl-version.c (match_symbol): Likewise.
+       (_dl_check_map_versions): Likewise.
+       * elf/rtld.c (dl_main): Likewise.
+       (print_unresolved): Use RTLD_PROGNAME.
+       (print_missing_version): Likewise.
+       * sysdeps/i386/dl-machine.h (elf_machine_rel): Likewise.
+       (elf_machine_rela): Likewise.
+       * sysdeps/powerpc/powerpc32/dl-machine.c
+       (__process_machine_rela): Likewise.
+       * sysdeps/powerpc/powerpc64/dl-machine.h (elf_machine_rela):
+       Likewise.
+       * sysdeps/s390/s390-32/dl-machine.h (elf_machine_rela):
+       Likewise.
+       * sysdeps/s390/s390-64/dl-machine.h (elf_machine_rela):
+       Likewise.
+       * sysdeps/sh/dl-machine.h (elf_machine_rela): Likewise.
+       * sysdeps/sparc/sparc32/dl-machine.h (elf_machine_rela):
+       Likewise.
+       * sysdeps/sparc/sparc64/dl-machine.h (elf_machine_rela):
+       Likewise.
+       * sysdeps/x86_64/dl-machine.h (elf_machine_rela): Likewise.
+
 2013-05-28  Carlos O'Donell  <carlos@redhat.com>
 
        * po/be.po: Add descriptive title.
diff --git a/NEWS b/NEWS
index c25b62ee4cfe65f83fc823f7f9db9ad024fb7fc9..4a1f83d173048e80bdb158acb4ae073266b16ec7 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -18,8 +18,8 @@ Version 2.18
   15287, 15304, 15305, 15307, 15309, 15327, 15330, 15335, 15336, 15337,
   15339, 15342, 15346, 15359, 15361, 15366, 15380, 15381, 15394, 15395,
   15405, 15406, 15409, 15416, 15418, 15419, 15423, 15424, 15426, 15429,
-  15441, 15442, 15448, 15480, 15485, 15488, 15490, 15493, 15497, 15506,
-  15529.
+  15441, 15442, 15448, 15465, 15480, 15485, 15488, 15490, 15493, 15497,
+  15506, 15529.
 
 * CVE-2013-0242 Buffer overrun in regexp matcher has been fixed (Bugzilla
   #15078).
index c01ca9ef68fecdaeb500e91f267cfa18adbcf05d..6f40414cbeb5f192b5d5992fe2832ddfe554b6b9 100644 (file)
@@ -145,7 +145,7 @@ tests += loadtest restest1 preloadtest loadfail multiload origtest resolvfail \
         tst-audit1 tst-audit2 tst-audit8 \
         tst-stackguard1 tst-addr1 tst-thrlock \
         tst-unique1 tst-unique2 tst-unique3 tst-unique4 \
-        tst-initorder tst-initorder2 tst-relsort1
+        tst-initorder tst-initorder2 tst-relsort1 tst-null-argv
 #       reldep9
 test-srcs = tst-pathopt
 selinux-enabled := $(shell cat /selinux/enforce 2> /dev/null)
@@ -208,7 +208,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
                tst-initorder2a tst-initorder2b tst-initorder2c \
                tst-initorder2d \
                tst-relsort1mod1 tst-relsort1mod2 tst-array2dep \
-               tst-array5dep
+               tst-array5dep tst-null-argv-lib
 ifeq (yesyes,$(have-fpie)$(build-shared))
 modules-names += tst-piemod1
 tests += tst-pie1
@@ -494,7 +494,9 @@ $(objpfx)tst-initorderb2.so: $(objpfx)tst-initorderb1.so $(objpfx)tst-initordera
 $(objpfx)tst-initordera3.so: $(objpfx)tst-initorderb2.so $(objpfx)tst-initorderb1.so
 $(objpfx)tst-initordera4.so: $(objpfx)tst-initordera3.so
 $(objpfx)tst-initorder: $(objpfx)tst-initordera4.so $(objpfx)tst-initordera1.so $(objpfx)tst-initorderb2.so
+$(objpfx)tst-null-argv: $(objpfx)tst-null-argv-lib.so
 
+tst-null-argv-ENV = LD_DEBUG=all LD_DEBUG_OUTPUT=$(objpfx)tst-null-argv.debug.out
 LDFLAGS-nodel2mod3.so = $(no-as-needed)
 LDFLAGS-reldepmod5.so = $(no-as-needed)
 LDFLAGS-reldep6mod1.so = $(no-as-needed)
index d63086d99c50015aec71665b83976e017e8eb20f..11e3cd8773541829324cf0630f33be90d567d056 100644 (file)
@@ -33,8 +33,7 @@ _dl_resolve_conflicts (struct link_map *l, ElfW(Rela) *conflict,
 {
 #if ! ELF_MACHINE_NO_RELA
   if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_RELOC, 0))
-    _dl_debug_printf ("\nconflict processing: %s\n",
-                     l->l_name[0] ? l->l_name : rtld_progname);
+    _dl_debug_printf ("\nconflict processing: %s\n", DSO_FILENAME (l->l_name));
 
   {
     /* Do the conflict relocation of the object and library GOT and other
index cd1c236b2e46e223abbe997534b7df129ba966a5..1c36f501bcad101e4aa5cd7287ad62552b1d6cbf 100644 (file)
@@ -310,8 +310,7 @@ _dl_map_object_deps (struct link_map *map,
                      _dl_debug_printf ("load auxiliary object=%s"
                                        " requested by file=%s\n",
                                        name,
-                                       l->l_name[0]
-                                       ? l->l_name : rtld_progname);
+                                       DSO_FILENAME (l->l_name));
 
                    /* We must be prepared that the addressed shared
                       object is not available.  */
@@ -337,8 +336,7 @@ _dl_map_object_deps (struct link_map *map,
                      _dl_debug_printf ("load filtered object=%s"
                                        " requested by file=%s\n",
                                        name,
-                                       l->l_name[0]
-                                       ? l->l_name : rtld_progname);
+                                       DSO_FILENAME (l->l_name));
 
                    /* For filter objects the dependency must be available.  */
                    bool malloced;
index 798784543bdaa5837ae47873bfbe2712d81a17e9..8257c170300813b2c150e29588bbecc96c09e857 100644 (file)
@@ -119,7 +119,7 @@ _dl_signal_error (int errcode, const char *objname, const char *occation,
       /* Lossage while resolving the program's own symbols is always fatal.  */
       char buffer[1024];
       _dl_fatal_printf ("%s: %s: %s%s%s%s%s\n",
-                       rtld_progname ?: "<program name unknown>",
+                       RTLD_PROGNAME,
                        occation ?: N_("error while loading shared libraries"),
                        objname, *objname ? ": " : "",
                        errstring, errcode ? ": " : "",
index c5d1674aa44816967959f96c9e81fc4ca34eae6f..6b245f00225114e59ab2400b7b067a1edf2106ec 100644 (file)
@@ -237,7 +237,7 @@ _dl_fini (void)
                  if (__builtin_expect (GLRO(dl_debug_mask)
                                        & DL_DEBUG_IMPCALLS, 0))
                    _dl_debug_printf ("\ncalling fini: %s [%lu]\n\n",
-                                     l->l_name[0] ? l->l_name : rtld_progname,
+                                     DSO_FILENAME (l->l_name),
                                      ns);
 
                  /* First see whether an array is given.  */
index fe4d2a07dade4c9fab1ecebefeb28ca8f2fa1f71..a657eb6c40ce5f93bf0cb47a65409fac9cad0935 100644 (file)
@@ -54,7 +54,7 @@ call_init (struct link_map *l, int argc, char **argv, char **env)
   /* Print a debug message if wanted.  */
   if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
     _dl_debug_printf ("\ncalling init: %s\n\n",
-                     l->l_name[0] ? l->l_name : rtld_progname);
+                     DSO_FILENAME (l->l_name));
 
   /* Now run the local constructors.  There are two forms of them:
      - the one named by DT_INIT
@@ -110,8 +110,7 @@ _dl_init (struct link_map *main_map, int argc, char **argv, char **env)
 
       if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
        _dl_debug_printf ("\ncalling preinit: %s\n\n",
-                         main_map->l_name[0]
-                         ? main_map->l_name : rtld_progname);
+                         DSO_FILENAME (main_map->l_name));
 
       addrs = (ElfW(Addr) *) (preinit_array->d_un.d_ptr + main_map->l_addr);
       for (cnt = 0; cnt < i; ++cnt)
index dd182c9155acdec8e0398437ebe33c7f327548be..757b6ec56b3db595740289192efec76840c3db2b 100644 (file)
@@ -1651,7 +1651,7 @@ print_search_path (struct r_search_path_elem **list,
 
   if (name != NULL)
     _dl_debug_printf_c ("\t\t(%s from file %s)\n", what,
-                       name[0] ? name : rtld_progname);
+                       DSO_FILENAME (name));
   else
     _dl_debug_printf_c ("\t\t(%s)\n", what);
 }
@@ -2124,8 +2124,7 @@ _dl_map_object (struct link_map *loader, const char *name,
     _dl_debug_printf ((mode & __RTLD_CALLMAP) == 0
                      ? "\nfile=%s [%lu];  needed by %s [%lu]\n"
                      : "\nfile=%s [%lu];  dynamically loaded by %s [%lu]\n",
-                     name, nsid, loader->l_name[0]
-                     ? loader->l_name : rtld_progname, loader->l_ns);
+                     name, nsid, DSO_FILENAME (loader->l_name), loader->l_ns);
 
 #ifdef SHARED
   /* Give the auditing libraries a chance to change the name before we
index 68f8daccb96e0805e391b67532e8872772320736..39f463eae1babdc04713bfca344ae83c9bb963cb 100644 (file)
@@ -112,8 +112,7 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash,
       /* Print some debugging info if wanted.  */
       if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_SYMBOLS, 0))
        _dl_debug_printf ("symbol=%s;  lookup in file=%s [%lu]\n",
-                         undef_name,
-                         map->l_name[0] ? map->l_name : rtld_progname,
+                         undef_name, DSO_FILENAME (map->l_name),
                          map->l_ns);
 
       /* If the hash table is empty there is nothing to do here.  */
@@ -667,10 +666,9 @@ add_dependency (struct link_map *undef_map, struct link_map *map, int flags)
       if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_FILES, 0))
        _dl_debug_printf ("\
 \nfile=%s [%lu];  needed by %s [%lu] (relocation dependency)\n\n",
-                         map->l_name[0] ? map->l_name : rtld_progname,
+                         DSO_FILENAME (map->l_name),
                          map->l_ns,
-                         undef_map->l_name[0]
-                         ? undef_map->l_name : rtld_progname,
+                         DSO_FILENAME (undef_map->l_name),
                          undef_map->l_ns);
     }
   else
@@ -751,9 +749,7 @@ _dl_lookup_symbol_x (const char *undef_name, struct link_map *undef_map,
          const char *reference_name = undef_map ? undef_map->l_name : NULL;
 
          /* XXX We cannot translate the message.  */
-         _dl_signal_cerror (0, (reference_name[0]
-                                ? reference_name
-                                : (rtld_progname ?: "<main program>")),
+         _dl_signal_cerror (0, DSO_FILENAME (reference_name),
                             N_("relocation error"),
                             make_string ("symbol ", undef_name, ", version ",
                                          version->name,
@@ -780,9 +776,7 @@ _dl_lookup_symbol_x (const char *undef_name, struct link_map *undef_map,
                                     ? version->name : "");
 
          /* XXX We cannot translate the message.  */
-         _dl_signal_cerror (0, (reference_name[0]
-                                ? reference_name
-                                : (rtld_progname ?: "<main program>")),
+         _dl_signal_cerror (0, DSO_FILENAME (reference_name),
                             N_("symbol lookup error"),
                             make_string (undefined_msg, undef_name,
                                          versionstr, versionname));
@@ -912,11 +906,9 @@ _dl_debug_bindings (const char *undef_name, struct link_map *undef_map,
   if (GLRO(dl_debug_mask) & DL_DEBUG_BINDINGS)
     {
       _dl_debug_printf ("binding file %s [%lu] to %s [%lu]: %s symbol `%s'",
-                       (reference_name[0]
-                        ? reference_name
-                        : (rtld_progname ?: "<main program>")),
+                       DSO_FILENAME (reference_name),
                        undef_map->l_ns,
-                       value->m->l_name[0] ? value->m->l_name : rtld_progname,
+                       DSO_FILENAME (value->m->l_name),
                        value->m->l_ns,
                        protected ? "protected" : "normal", undef_name);
       if (version)
index 92fae7f59b99eb7b36c6a1d26f3b429f90f95aa9..0f054bfca203f9947d289202e35004b3dd386852 100644 (file)
@@ -733,7 +733,7 @@ void
 _dl_show_scope (struct link_map *l, int from)
 {
   _dl_debug_printf ("object=%s [%lu]\n",
-                   *l->l_name ? l->l_name : rtld_progname, l->l_ns);
+                   DSO_FILENAME (l->l_name), l->l_ns);
   if (l->l_scope != NULL)
     for (int scope_cnt = from; l->l_scope[scope_cnt] != NULL; ++scope_cnt)
       {
@@ -744,7 +744,7 @@ _dl_show_scope (struct link_map *l, int from)
            _dl_debug_printf_c (" %s",
                                l->l_scope[scope_cnt]->r_list[cnt]->l_name);
          else
-           _dl_debug_printf_c (" %s", rtld_progname);
+           _dl_debug_printf_c (" %s", RTLD_PROGNAME);
 
        _dl_debug_printf_c ("\n");
       }
index 73d98f8c2ebc3f9c6292d3b58c8608daf292ef0a..5c5431098cee402b6e1594e6089b55be3edc47e4 100644 (file)
@@ -185,8 +185,7 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
 
   if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_RELOC, 0))
     _dl_debug_printf ("\nrelocation processing: %s%s\n",
-                     l->l_name[0] ? l->l_name : rtld_progname,
-                     lazy ? " (lazy)" : "");
+                     DSO_FILENAME (l->l_name), lazy ? " (lazy)" : "");
 
   /* DT_TEXTREL is now in level 2 and might phase out at some time.
      But we rewrite the DT_FLAGS entry to a DT_TEXTREL entry to make
@@ -276,7 +275,7 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
            errstring = N_("%s: no PLTREL found in object %s\n");
          fatal:
            _dl_fatal_printf (errstring,
-                             rtld_progname ?: "<program name unknown>",
+                             RTLD_PROGNAME,
                              l->l_name);
          }
 
index c02baa06006324cd6e815425773c944d363b524c..62be4aef7580baaf9b06c6b43d10a4dc781cd941 100644 (file)
@@ -85,7 +85,7 @@ match_symbol (const char *name, Lmid_t ns, ElfW(Word) hash, const char *string,
   if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_VERSIONS, 0))
     _dl_debug_printf ("\
 checking for version `%s' in file %s [%lu] required by file %s [%lu]\n",
-                     string, map->l_name[0] ? map->l_name : rtld_progname,
+                     string, DSO_FILENAME (map->l_name),
                      map->l_ns, name, ns);
 
   if (__builtin_expect (map->l_info[VERSYMIDX (DT_VERDEF)] == NULL, 0))
@@ -162,7 +162,7 @@ no version information available (required by ", name, ")");
                           name, ")");
   result = 1;
  call_cerror:
-  _dl_signal_cerror (0, map->l_name[0] ? map->l_name : rtld_progname,
+  _dl_signal_cerror (0, DSO_FILENAME (map->l_name),
                     N_("version lookup error"), errstring);
   return result;
 }
@@ -210,7 +210,7 @@ _dl_check_map_versions (struct link_map *map, int verbose, int trace_mode)
                                          &buf[sizeof (buf) - 1], 10, 0),
                                   " of Verneed record\n");
        call_error:
-         _dl_signal_error (errval, *map->l_name ? map->l_name : rtld_progname,
+         _dl_signal_error (errval, DSO_FILENAME (map->l_name),
                            NULL, errstring);
        }
 
@@ -234,8 +234,7 @@ _dl_check_map_versions (struct link_map *map, int verbose, int trace_mode)
              while (1)
                {
                  /* Match the symbol.  */
-                 result |= match_symbol ((*map->l_name
-                                          ? map->l_name : rtld_progname),
+                 result |= match_symbol (DSO_FILENAME (map->l_name),
                                          map->l_ns, aux->vna_hash,
                                          strtab + aux->vna_name,
                                          needed->l_real, verbose,
index 23238ad3fcb6687eae15a77d2a6eafb3a5c81869..91da88cdd13f0907258fbfc01ba965a6a3fe6e33 100644 (file)
@@ -1840,10 +1840,8 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n",
              if (_dl_name_match_p (GLRO(dl_trace_prelink), l))
                GLRO(dl_trace_prelink_map) = l;
              _dl_printf ("\t%s => %s (0x%0*Zx, 0x%0*Zx)",
-                         l->l_libname->name[0] ? l->l_libname->name
-                         : rtld_progname ?: "<main program>",
-                         l->l_name[0] ? l->l_name
-                         : rtld_progname ?: "<main program>",
+                         DSO_FILENAME (l->l_libname->name),
+                         DSO_FILENAME (l->l_name),
                          (int) sizeof l->l_map_start * 2,
                          (size_t) l->l_map_start,
                          (int) sizeof l->l_addr * 2,
@@ -2000,8 +1998,7 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n",
                      first = 0;
                    }
 
-                 _dl_printf ("\t%s:\n",
-                             map->l_name[0] ? map->l_name : rtld_progname);
+                 _dl_printf ("\t%s:\n", DSO_FILENAME (map->l_name));
 
                  while (1)
                    {
@@ -2324,7 +2321,7 @@ print_unresolved (int errcode __attribute__ ((unused)), const char *objname,
                  const char *errstring)
 {
   if (objname[0] == '\0')
-    objname = rtld_progname ?: "<main program>";
+    objname = RTLD_PROGNAME;
   _dl_error_printf ("%s        (%s)\n", errstring, objname);
 }
 \f
@@ -2334,7 +2331,7 @@ static void
 print_missing_version (int errcode __attribute__ ((unused)),
                       const char *objname, const char *errstring)
 {
-  _dl_error_printf ("%s: %s: %s\n", rtld_progname ?: "<program name unknown>",
+  _dl_error_printf ("%s: %s: %s\n", RTLD_PROGNAME,
                    objname, errstring);
 }
 \f
diff --git a/elf/tst-null-argv-lib.c b/elf/tst-null-argv-lib.c
new file mode 100644 (file)
index 0000000..e754299
--- /dev/null
@@ -0,0 +1,24 @@
+/* Verify that program does not crash when LD_DEBUG is set and the program name
+   is not available.  This is the library.
+   Copyright (C) 2013 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+void
+foo (void)
+{
+  return;
+}
diff --git a/elf/tst-null-argv.c b/elf/tst-null-argv.c
new file mode 100644 (file)
index 0000000..dc242e4
--- /dev/null
@@ -0,0 +1,35 @@
+/* Verify that program does not crash when LD_DEBUG is set and the program name
+   is not available.
+   Copyright (C) 2013 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+extern void foo (void);
+
+int
+do_test (int argc, char **argv)
+{
+  argv[0] = argv[1];
+  argc--;
+
+  /* This should result in a symbol lookup, causing a volley of debug output
+     when LD_DEBUG=symbols.  */
+  foo ();
+
+  return 0;
+}
+
+#include <test-skeleton.c>
index aed68ef59481e92fa0fead0b4989387577be044a..46def45f6198a30c5666ee7f2a8d136490dba06d 100644 (file)
@@ -1,3 +1,9 @@
+2013-05-29  Siddhesh Poyarekar  <siddhesh@redhat.com>
+
+       [BZ #15465]
+       * sysdeps/aarch64/dl-machine.h (elf_machine_rela): Use
+       RTLD_PROGNAME.
+
 2013-05-23  Venkataranmanan Kumar  <venkataramanan.kumar@linaro.org>
 
        * sysdeps/aarch64/machine-gmon.h: Remove.
index dcf3605d0b6d822fbaef379a7015d8dd7f426953..b1f14dfe643c600850f865c7ed3ea39d62379311 100644 (file)
@@ -1,3 +1,10 @@
+2013-05-29  Siddhesh Poyarekar  <siddhesh@redhat.com>
+
+       [BZ #15465]
+       * sysdeps/arm/dl-machine.h (elf_machine_rel): Use
+       RTLD_PROGNAME.
+       (elf_machine_rela): Likewise.
+
 2013-05-22  Joseph Myers  <joseph@codesourcery.com>
 
        * sysdeps/arm/libm-test-ulps: Update test names.
index 6a1cf1da057db2663032a694fcba768b8dbc4111..f31de9a8928b6c915c6b5cd770aec1b8de64ca4e 100644 (file)
@@ -1,3 +1,10 @@
+2013-05-29  Siddhesh Poyarekar  <siddhesh@redhat.com>
+
+       [BZ #15465]
+       * sysdeps/hppa/dl-machine.h (elf_machine_rela): Use
+       RTLD_PROGNAME.
+       (elf_machine_rela_relative): Likewise.
+
 2013-05-22  Joseph Myers  <joseph@codesourcery.com>
 
        * sysdeps/hppa/fpu/libm-test-ulps: Update test names.
index 479f5e05f1a0392eed766f2c2bcf13131afbfc33..b5a0c6d56f0e0d1fc76ca0859e4b055fb851b8cd 100644 (file)
@@ -1,3 +1,9 @@
+2013-05-29  Siddhesh Poyarekar  <siddhesh@redhat.com>
+
+       [BZ #15465]
+       * sysdeps/m68k/dl-machine.h (elf_machine_rela): Use
+       RTLD_PROGNAME.
+
 2013-05-22  Joseph Myers  <joseph@codesourcery.com>
 
        * sysdeps/m68k/coldfire/fpu/libm-test-ulps: Update test names.
index f183b9ce0a0550a807367d3b8936b2802dbd6c99..32fcfbc7cbebc10e354454f75d761de2f50f47a8 100644 (file)
@@ -1,3 +1,9 @@
+2013-05-29  Siddhesh Poyarekar  <siddhesh@redhat.com>
+
+       [BZ #15465]
+       * sysdeps/microblaze/dl-machine.h (elf_machine_rela): Use
+       RTLD_PROGNAME.
+
 2013-05-22  Joseph Myers  <joseph@codesourcery.com>
 
        * sysdeps/microblaze/libm-test-ulps: Update test names.
index aff0572e22d7e5b708f01a5f5eefcbf311a7f175..a509992585eddf437e314f2522d62d654538a5c0 100644 (file)
@@ -1,3 +1,13 @@
+2013-05-29  Siddhesh Poyarekar  <siddhesh@redhat.com>
+
+       [BZ #15465]
+       * sysdeps/mips/dl-lookup.c (do_lookup_x): Use DSO_FILENAME.
+       (add_dependency): Likewise.
+       (_dl_lookup_symbol_x): Likewise.
+       (_dl_debug_bindings): Likewise.
+       * sysdeps/mips/dl-machine.h (elf_machine_reloc): Use
+       RTLD_PROGNAME.
+
 2013-05-22  Edjunior Barbosa Machado  <emachado@linux.vnet.ibm.com>
 
        * sysdeps/unix/sysv/linux/mips/bits/siginfo.h (siginfo_t): Add
index 33ffa71fe66f2c2c5eebedd8eec140ae0ccdcd68..dcfe00e529842a27a32b7edbebaaad0b55b79f33 100644 (file)
@@ -1,3 +1,9 @@
+2013-05-29  Siddhesh Poyarekar  <siddhesh@redhat.com>
+
+       [BZ #15465]
+       * sysdeps/tile/dl-machine.h (elf_machine_rela): Use
+       RTLD_PROGNAME.
+
 2013-05-23  Chris Metcalf  <cmetcalf@tilera.com>
 
        * sysdeps/tile/tilegx/Makefile ($(cflags-mcmodel-large)):
index 702a7c02889653ca274726d501259b32d9ca1c3b..c91b0c42e02becb34874938997289d8c66ab7f55 100644 (file)
@@ -257,8 +257,7 @@ elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
              strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
              _dl_error_printf ("\
 %s: Symbol `%s' has different size in shared object, consider re-linking\n",
-                               rtld_progname ?: "<program name unknown>",
-                               strtab + refsym->st_name);
+                               RTLD_PROGNAME, strtab + refsym->st_name);
            }
          memcpy (reloc_addr_arg, (void *) value,
                  MIN (sym->st_size, refsym->st_size));
index 6e09aa107c9d797a906dffa02fcaa7a7dc34fce7..4cf87a99f91bb1b952bb3ac0a29635ee8d3923f4 100644 (file)
@@ -398,8 +398,7 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
              strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
              _dl_error_printf ("\
 %s: Symbol `%s' has different size in shared object, consider re-linking\n",
-                               rtld_progname ?: "<program name unknown>",
-                               strtab + refsym->st_name);
+                               RTLD_PROGNAME, strtab + refsym->st_name);
            }
          memcpy (reloc_addr_arg, (void *) value,
                  MIN (sym->st_size, refsym->st_size));
@@ -560,8 +559,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
              strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
              _dl_error_printf ("\
 %s: Symbol `%s' has different size in shared object, consider re-linking\n",
-                               rtld_progname ?: "<program name unknown>",
-                               strtab + refsym->st_name);
+                               RTLD_PROGNAME, strtab + refsym->st_name);
            }
          memcpy (reloc_addr_arg, (void *) value,
                  MIN (sym->st_size, refsym->st_size));
index a66be7ba4ae08eeccfbfe478b8b36cc395c4a72c..d2411a654a6949de741e3096a655d749c3fbacd7 100644 (file)
@@ -673,8 +673,7 @@ elf_machine_rela (struct link_map *map,
          strtab = (const char *) D_PTR (map, l_info[DT_STRTAB]);
          _dl_error_printf ("%s: Symbol `%s' has different size in shared object, "
                            "consider re-linking\n",
-                           rtld_progname ?: "<program name unknown>",
-                           strtab + refsym->st_name);
+                           RTLD_PROGNAME, strtab + refsym->st_name);
        }
       memcpy (reloc_addr_arg, (void *) value,
              MIN (sym->st_size, refsym->st_size));
@@ -730,7 +729,7 @@ elf_machine_rela_relative (Elf32_Addr l_addr,
   if (ELF32_R_SYM (reloc->r_info) != 0){
     _dl_error_printf ("%s: In elf_machine_rela_relative "
                      "ELF32_R_SYM (reloc->r_info) != 0. Aborting.",
-                     rtld_progname ?: "<program name unknown>");
+                     RTLD_PROGNAME);
     ABORT_INSTRUCTION;  /* Crash. */
   }
 
index b2ead16a00348b46321fd1a3ae707a6375bf402a..acaabc1e1eb689cf20d92e2f6c6b2b6c838d28a8 100644 (file)
@@ -238,8 +238,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
              strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
              _dl_error_printf ("\
 %s: Symbol `%s' has different size in shared object, consider re-linking\n",
-                               rtld_progname ?: "<program name unknown>",
-                               strtab + refsym->st_name);
+                               RTLD_PROGNAME, strtab + refsym->st_name);
            }
          memcpy (reloc_addr_arg, (void *) value,
                  MIN (sym->st_size, refsym->st_size));
index 7471bdd84f450418faef979efe69c8f61a751047..ad1fc3ef371205113e503a0a23cb387756009fdf 100644 (file)
@@ -240,8 +240,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
              strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
              _dl_error_printf ("\
 %s: Symbol `%s' has different size in shared object, consider re-linking\n",
-                               rtld_progname ?: "<program name unknown>",
-                               strtab + refsym->st_name);
+                               RTLD_PROGNAME, strtab + refsym->st_name);
            }
          memcpy (reloc_addr_arg, (void *) value,
                  MIN (sym->st_size, refsym->st_size));
index 02090e5e52adbc7555fb12a818dd45b250fd77d6..6d8f7442466cd6af8e7af31dab4482b378601f74 100644 (file)
@@ -114,7 +114,7 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash,
       if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_SYMBOLS, 0))
        _dl_debug_printf ("symbol=%s;  lookup in file=%s [%lu]\n",
                          undef_name,
-                         map->l_name[0] ? map->l_name : rtld_progname,
+                         DSO_FILENAME (map->l_name),
                          map->l_ns);
 
       /* If the hash table is empty there is nothing to do here.  */
@@ -684,10 +684,9 @@ add_dependency (struct link_map *undef_map, struct link_map *map, int flags)
       if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_FILES, 0))
        _dl_debug_printf ("\
 \nfile=%s [%lu];  needed by %s [%lu] (relocation dependency)\n\n",
-                         map->l_name[0] ? map->l_name : rtld_progname,
+                         DSO_FILENAME (map->l_name),
                          map->l_ns,
-                         undef_map->l_name[0]
-                         ? undef_map->l_name : rtld_progname,
+                         DSO_FILENAME (undef_map->l_name),
                          undef_map->l_ns);
     }
   else
@@ -768,9 +767,7 @@ _dl_lookup_symbol_x (const char *undef_name, struct link_map *undef_map,
          const char *reference_name = undef_map ? undef_map->l_name : NULL;
 
          /* XXX We cannot translate the message.  */
-         _dl_signal_cerror (0, (reference_name[0]
-                                ? reference_name
-                                : (rtld_progname ?: "<main program>")),
+         _dl_signal_cerror (0, DSO_FILENAME (reference_name),
                             N_("relocation error"),
                             make_string ("symbol ", undef_name, ", version ",
                                          version->name,
@@ -797,9 +794,7 @@ _dl_lookup_symbol_x (const char *undef_name, struct link_map *undef_map,
                                     ? version->name : "");
 
          /* XXX We cannot translate the message.  */
-         _dl_signal_cerror (0, (reference_name[0]
-                                ? reference_name
-                                : (rtld_progname ?: "<main program>")),
+         _dl_signal_cerror (0, DSO_FILENAME (reference_name),
                             N_("symbol lookup error"),
                             make_string (undefined_msg, undef_name,
                                          versionstr, versionname));
@@ -929,11 +924,9 @@ _dl_debug_bindings (const char *undef_name, struct link_map *undef_map,
   if (GLRO(dl_debug_mask) & DL_DEBUG_BINDINGS)
     {
       _dl_debug_printf ("binding file %s [%lu] to %s [%lu]: %s symbol `%s'",
-                       (reference_name[0]
-                        ? reference_name
-                        : (rtld_progname ?: "<main program>")),
+                       DSO_FILENAME (reference_name),
                        undef_map->l_ns,
-                       value->m->l_name[0] ? value->m->l_name : rtld_progname,
+                       DSO_FILENAME (value->m->l_name),
                        value->m->l_ns,
                        protected ? "protected" : "normal", undef_name);
       if (version)
index a7c784fec550495614455d38166b88445d941870..dae938f03959e1d557de09ea9eb078165beb3059 100644 (file)
@@ -635,8 +635,7 @@ elf_machine_reloc (struct link_map *map, ElfW(Addr) r_info,
            strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
            _dl_error_printf ("\
   %s: Symbol `%s' has different size in shared object, consider re-linking\n",
-                             rtld_progname ?: "<program name unknown>",
-                             strtab + refsym->st_name);
+                             RTLD_PROGNAME, strtab + refsym->st_name);
          }
        memcpy (reloc_addr, (void *) value,
                MIN (sym->st_size, refsym->st_size));
index 4e78bb8701c7be5ff084c19d09a7c8a538a1349f..05aa2d826ce51997a35e06408989ff23e9782f43 100644 (file)
@@ -624,8 +624,7 @@ elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
           strtab = (const char *) D_PTR (map,l_info[DT_STRTAB]);
           _dl_error_printf ("%s: Symbol `%s' has different size in shared"
                             " object, consider re-linking\n",
-                            rtld_progname ?: "<program name unknown>",
-                            strtab + refsym->st_name);
+                            RTLD_PROGNAME, strtab + refsym->st_name);
         }
       memcpy (reloc_addr_arg, (void *) value,
               MIN (sym->st_size, refsym->st_size));
index 3f448098029d378342672a602da4a11052e16ab1..cb172042597b2f0f9890daeecba44dca05b39c87 100644 (file)
@@ -128,6 +128,11 @@ typedef struct link_map *lookup_t;
    | ((PROT_WRITE | PROT_EXEC) << (PF_W | PF_X) * 4)                         \
    | ((PROT_READ | PROT_WRITE | PROT_EXEC) << ((PF_R | PF_W | PF_X) * 4)))
 
+/* The filename itself, or the main program name, if available.  */
+#define DSO_FILENAME(name) ((name)[0] ? (name)                               \
+                           : (rtld_progname ?: "<main program>"))
+
+#define RTLD_PROGNAME (rtld_progname ?: "<program name unknown>")
 
 /* For the version handling we need an array with only names and their
    hash values.  */
index 0b4c46736dd78eaf7e5122f5d6c5fc0484ed3068..b6fc8051e58f0f4184fed0c7159f3030fb30033d 100644 (file)
@@ -464,8 +464,7 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
              strtab = (const char *) D_PTR (map, l_info[DT_STRTAB]);
              _dl_error_printf ("\
 %s: Symbol `%s' has different size in shared object, consider re-linking\n",
-                               rtld_progname ?: "<program name unknown>",
-                               strtab + refsym->st_name);
+                               RTLD_PROGNAME, strtab + refsym->st_name);
            }
          memcpy (reloc_addr_arg, (void *) value,
                  MIN (sym->st_size, refsym->st_size));
@@ -610,8 +609,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
              strtab = (const char *) D_PTR (map, l_info[DT_STRTAB]);
              _dl_error_printf ("\
 %s: Symbol `%s' has different size in shared object, consider re-linking\n",
-                               rtld_progname ?: "<program name unknown>",
-                               strtab + refsym->st_name);
+                               RTLD_PROGNAME, strtab + refsym->st_name);
            }
          memcpy (reloc_addr_arg, (void *) value,
                  MIN (sym->st_size, refsym->st_size));
index bd42fdf7d5f3d48d420d55a3ea7569f4e77f24c0..c75c173b3588d7e1cd5a6aab6399d575746e624e 100644 (file)
@@ -510,8 +510,7 @@ __process_machine_rela (struct link_map *map,
          strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
          _dl_error_printf ("\
 %s: Symbol `%s' has different size in shared object, consider re-linking\n",
-                           rtld_progname ?: "<program name unknown>",
-                           strtab + refsym->st_name);
+                           RTLD_PROGNAME, strtab + refsym->st_name);
        }
       memcpy (reloc_addr, (char *) finaladdr, MIN (sym->st_size,
                                                   refsym->st_size));
index 14ade21d96e7a026c63aaac41f5dfdf904e34fe4..059fdafd53b9b3880009d0210bbc7704f6f1f32e 100644 (file)
@@ -734,8 +734,7 @@ elf_machine_rela (struct link_map *map,
          _dl_error_printf ("%s: Symbol `%s' has different size" \
                            " in shared object," \
                            " consider re-linking\n",
-                           rtld_progname ?: "<program name unknown>",
-                           strtab + refsym->st_name);
+                           RTLD_PROGNAME, strtab + refsym->st_name);
        }
       memcpy (reloc_addr_arg, (char *) value,
              MIN (sym->st_size, refsym->st_size));
index 544f843d8791bf948c8c0b50881abd54fecce287..aa8f1a5f147ee2c47b3cc9f809c5f92c3e6db9c9 100644 (file)
@@ -383,8 +383,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
              strtab = (const char *) D_PTR(map,l_info[DT_STRTAB]);
              _dl_error_printf ("\
 %s: Symbol `%s' has different size in shared object, consider re-linking\n",
-                               rtld_progname ?: "<program name unknown>",
-                               strtab + refsym->st_name);
+                               RTLD_PROGNAME, strtab + refsym->st_name);
            }
          memcpy (reloc_addr_arg, (void *) value,
                  MIN (sym->st_size, refsym->st_size));
index 0504eb6b7ae65b6f274a908207b3536f68f58768..32f7a2cb2f2e87d8ec0872d9fd8fe87269e66a58 100644 (file)
@@ -361,8 +361,7 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
              strtab = (const char *) D_PTR (map,l_info[DT_STRTAB]);
              _dl_error_printf ("\
 %s: Symbol `%s' has different size in shared object, consider re-linking\n",
-                               rtld_progname ?: "<program name unknown>",
-                               strtab + refsym->st_name);
+                               RTLD_PROGNAME, strtab + refsym->st_name);
            }
          memcpy (reloc_addr_arg, (void *) value,
                  MIN (sym->st_size, refsym->st_size));
index 25cd52a8e3b08c07cef9b035093e8deca096cf89..da7b9c1a06a8c85625f00caf7dd3319828978d95 100644 (file)
@@ -336,8 +336,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
              strtab = (const char *) D_PTR (map, l_info[DT_STRTAB]);
              _dl_error_printf ("\
 %s: Symbol `%s' has different size in shared object, consider re-linking\n",
-                               rtld_progname ?: "<program name unknown>",
-                               strtab + refsym->st_name);
+                               RTLD_PROGNAME, strtab + refsym->st_name);
            }
          memcpy (reloc_addr_arg, (void *) value,
                  MIN (sym->st_size, refsym->st_size));
index 71e120f6437d3b9d92ff6fef7435934feac179f3..30f9246785cf0b333d80e57d3efdc84b0c267d6f 100644 (file)
@@ -411,8 +411,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
          strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
          _dl_error_printf ("\
 %s: Symbol `%s' has different size in shared object, consider re-linking\n",
-                           rtld_progname ?: "<program name unknown>",
-                           strtab + refsym->st_name);
+                           RTLD_PROGNAME, strtab + refsym->st_name);
        }
       memcpy (reloc_addr_arg, (void *) value,
              MIN (sym->st_size, refsym->st_size));
index d6d20c72948a014a01b969c8e2393a49a1a76996..3bce5d182fa695e4642512a903a2fd2ecd49fe9b 100644 (file)
@@ -436,8 +436,7 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
          strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
          _dl_error_printf ("\
 %s: Symbol `%s' has different size in shared object, consider re-linking\n",
-                           rtld_progname ?: "<program name unknown>",
-                           strtab + refsym->st_name);
+                           RTLD_PROGNAME, strtab + refsym->st_name);
        }
       memcpy (reloc_addr_arg, (void *) value,
              MIN (sym->st_size, refsym->st_size));
index 4768c695440b5069adc3f965a2eb341a7ad5a7df..116fed1b0744d9d3b6f08b9b42827ea0e5e8bef9 100644 (file)
@@ -430,9 +430,7 @@ elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
 #  endif
              strtab = (const char *) D_PTR (map, l_info[DT_STRTAB]);
 
-             _dl_error_printf (fmt,
-                               rtld_progname ?: "<program name unknown>",
-                               strtab + refsym->st_name);
+             _dl_error_printf (fmt, RTLD_PROGNAME, strtab + refsym->st_name);
            }
          break;
 #  ifndef RESOLVE_CONFLICT_FIND_MAP
This page took 0.162517 seconds and 5 git commands to generate.