diff options
author | Ulrich Drepper <drepper@gmail.com> | 2011-08-17 10:31:15 -0400 |
---|---|---|
committer | Ulrich Drepper <drepper@gmail.com> | 2011-08-17 10:31:15 -0400 |
commit | c5305d88c7dc519edfaf55eed8d026a9038d7978 (patch) | |
tree | 2c999d13ecdcf2e37323a1e81b4ce5eed96eb0ef | |
parent | 2772459841f32f2d5866672145f533975ebec717 (diff) | |
download | glibc-c5305d88c7dc519edfaf55eed8d026a9038d7978.tar.gz glibc-c5305d88c7dc519edfaf55eed8d026a9038d7978.tar.xz glibc-c5305d88c7dc519edfaf55eed8d026a9038d7978.zip |
Fix some problem of 32-bit pldd on 64-bit platforms
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | elf/pldd-xx.c | 5 | ||||
-rw-r--r-- | elf/pldd.c | 2 |
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) |