aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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)