Fix some problem of 32-bit pldd on 64-bit platforms
authorUlrich Drepper <drepper@gmail.com>
Wed, 17 Aug 2011 14:31:15 +0000 (10:31 -0400)
committerUlrich Drepper <drepper@gmail.com>
Wed, 17 Aug 2011 14:31:15 +0000 (10:31 -0400)
ChangeLog
elf/pldd-xx.c
elf/pldd.c

index ffb2ad3..6aa670d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2011-08-17  Ulrich Drepper  <drepper@gmail.com>
 
+       * elf/pldd-xx.c (r_debug): Explicitly add padding when needed.
+       * elf/pldd.c (get_process_info): Use pread to re-read auxiliary vector
+       if buffer was too small.
+
        * elf/pldd.c (main): Attach to all threads in the process.
        Rewrite /proc handling to use *at functions.
 
index 0e3fcb7..59419bc 100644 (file)
@@ -64,6 +64,9 @@ static_assert (next, (offsetof (struct libname_list, next)
 struct E(r_debug)
 {
   int r_version;
+#if CLASS == 64
+  int pad;
+#endif
   EW(Addr) r_map;
 };
 #if CLASS == __ELF_NATIVE_CLASS
@@ -75,6 +78,7 @@ static_assert (r_map, (offsetof (struct r_debug, r_map)
 
 
 static int
+
 E(find_maps) (pid_t pid, EW(Ehdr) *ehdr, void *auxv, size_t auxv_size)
 {
   EW(Addr) phdr = 0;
@@ -97,6 +101,7 @@ E(find_maps) (pid_t pid, EW(Ehdr) *ehdr, void *auxv, size_t auxv_size)
       default:
        break;
       }
+  printf("progam header at offset %lu\n", (unsigned long)phdr);
 
   if (phdr == 0 || phnum == 0 || phent == 0)
     error (EXIT_FAILURE, 0, gettext ("cannot find program header of process"));
index ef3621c..29879f7 100644 (file)
@@ -274,7 +274,7 @@ get_process_info (int dfd, long int pid)
       auxv_size += 512;
       auxv = xrealloc (auxv, auxv_size);
 
-      ssize_t n = read (fd, auxv, auxv_size);
+      ssize_t n = pread (fd, auxv, auxv_size, 0);
       if (n < 0)
        goto no_info;
       if (n < auxv_size)