From c5305d88c7dc519edfaf55eed8d026a9038d7978 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Wed, 17 Aug 2011 10:31:15 -0400 Subject: Fix some problem of 32-bit pldd on 64-bit platforms --- ChangeLog | 4 ++++ elf/pldd-xx.c | 5 +++++ elf/pldd.c | 2 +- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index ffb2ad3261..6aa670d9f6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2011-08-17 Ulrich Drepper + * 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) -- cgit 1.4.1