about summary refs log tree commit diff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@gmail.com>2011-08-17 10:31:15 -0400
committerUlrich Drepper <drepper@gmail.com>2011-08-17 10:31:15 -0400
commitc5305d88c7dc519edfaf55eed8d026a9038d7978 (patch)
tree2c999d13ecdcf2e37323a1e81b4ce5eed96eb0ef
parent2772459841f32f2d5866672145f533975ebec717 (diff)
downloadglibc-c5305d88c7dc519edfaf55eed8d026a9038d7978.tar.gz
glibc-c5305d88c7dc519edfaf55eed8d026a9038d7978.tar.xz
glibc-c5305d88c7dc519edfaf55eed8d026a9038d7978.zip
Fix some problem of 32-bit pldd on 64-bit platforms
-rw-r--r--ChangeLog4
-rw-r--r--elf/pldd-xx.c5
-rw-r--r--elf/pldd.c2
3 files changed, 10 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index ffb2ad3261..6aa670d9f6 100644
--- 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.
 
diff --git a/elf/pldd-xx.c b/elf/pldd-xx.c
index 0e3fcb78cc..59419bce33 100644
--- a/elf/pldd-xx.c
+++ b/elf/pldd-xx.c
@@ -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"));
diff --git a/elf/pldd.c b/elf/pldd.c
index ef3621c624..29879f7e85 100644
--- a/elf/pldd.c
+++ b/elf/pldd.c
@@ -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)