]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
foo roland/nacl-debug-hack
authorRoland McGrath <roland@hack.frob.com>
Wed, 17 Jun 2015 18:29:47 +0000 (11:29 -0700)
committerRoland McGrath <roland@hack.frob.com>
Thu, 18 Jun 2015 19:51:37 +0000 (12:51 -0700)
elf/dl-debug.c
sysdeps/nacl/dl-sysdep.c
sysdeps/nacl/glob.c
sysdeps/nacl/ldsodefs.h

index e32a5a64e4adf4b4f00e9a10e95c8d12d591d2d8..b89ea4d5d83eb88774bf6b6c6ab80ec411700718 100644 (file)
@@ -72,5 +72,8 @@ _dl_debug_initialize (ElfW(Addr) ldbase, Lmid_t ns)
 void
 _dl_debug_state (void)
 {
+#ifdef DL_DEBUG_STATE
+  DL_DEBUG_STATE;
+#endif
 }
 rtld_hidden_def (_dl_debug_state)
index 3e902c2cae90ba10fcf9409b8cae0d68e6e984c4..82d122ff97b287d8b1a8a3db5cfb848febf52643 100644 (file)
 
 # define DL_STACK_END(cookie)  (((void **) (cookie))[1])
 
+# define DL_PLATFORM_AUXV \
+  case AT_SYSINFO_EHDR: handle_sysinfo_ehdr ((void *) av->a_un.a_val);
+
+void (*__nacl_extra_r_brk) (void) attribute_hidden;
+
+static void
+handle_sysinfo_ehdr (const void *loader_ehdr)
+{
+  const ElfW(Ehdr) *ehdr = loader_ehdr;
+  const ElfW(Phdr) *phdr = loader_ehdr + ehdr->e_phoff;
+  for (uint_fast16_t i = 0; i < ehdr->e_phnum; ++i)
+    if (phdr[i].p_type == PT_DYNAMIC)
+      {
+        ElfW(Dyn) *end = (void *) (phdr[i].p_vaddr + phdr[i].p_memsz);
+       for (ElfW(Dyn) *d = (void *) phdr[i].p_vaddr; d < end; ++d)
+         if (d->d_tag == DT_DEBUG)
+           {
+             const struct r_debug *r = (void *) d->d_un.d_ptr;
+             if (r != NULL)
+               __nacl_extra_r_brk = (void (*) (void)) r->r_brk;
+              d->d_un.d_ptr = (ElfW(Addr)) &_r_debug;
+             break;
+           }
+       break;
+      }
+}
+
 /* This is called from the entry point (_start), defined by the RTLD_START
    macro in the machine-specific dl-machine.h file.  At this point, dynamic
    linking has been completed and the first argument is the application's
index 36d62e807dec238964fbefc511d89b583a3f8b4b..eda6e9e1101c4587a69963e22bbe1a9b0f7c28d5 100644 (file)
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <unistd.h>                    /* Declares getlogin_r.  */
+#include <unistd.h>                    /* Declares __getlogin_r.  */
 
 /* We do not have getlogin_r in the library at all for NaCl.
    Define it away so the glob code does not try to use it.  */
-#define getlogin_r(name, len)          (ENOSYS)
+#define __getlogin_r(name, len)                (ENOSYS)
 
 /* Fetch the version that defines glob64 as an alias.  */
 #include <sysdeps/wordsize-64/glob.c>
index 383ced5612e5db93ab720d20c640254f063ee351..d8c1552e670528475d18ef6645d915003c7e5439 100644 (file)
@@ -32,4 +32,11 @@ extern void _dl_aux_init (ElfW(auxv_t) *av) internal_function;
 /* Initialization which is normally done by the dynamic linker.  */
 extern void _dl_non_dynamic_init (void) internal_function;
 
+#ifdef SHARED
+extern void (*__nacl_extra_r_brk) (void) attribute_hidden;
+# define DL_DEBUG_STATE \
+  if (__nacl_extra_r_brk != NULL) \
+    (*__nacl_extra_r_brk) ();
+#endif
+
 #endif  /* ldsodefs.h */