From: Ulrich Drepper Date: Wed, 17 Aug 2011 14:31:15 +0000 (-0400) Subject: Fix some problem of 32-bit pldd on 64-bit platforms X-Git-Tag: glibc-2.15~399 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c5305d88c7dc519edfaf55eed8d026a9038d7978;p=platform%2Fupstream%2Fglibc.git Fix some problem of 32-bit pldd on 64-bit platforms --- diff --git a/ChangeLog b/ChangeLog index ffb2ad3..6aa670d 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 0e3fcb7..59419bc 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 ef3621c..29879f7 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)