diff options
author | Jan Kratochvil <jan.kratochvil@redhat.com> | 2010-10-11 08:50:33 +0000 |
---|---|---|
committer | Jan Kratochvil <jan.kratochvil@redhat.com> | 2010-10-11 08:50:33 +0000 |
commit | 43b8e24199217e03e0101bf02914573d9aefa60b (patch) | |
tree | 8db4e9639a54283d69646560996c7eefca219b1c /gdb/solib-svr4.c | |
parent | d3d7896de378a9d127f355af1187cb47357f4f2a (diff) | |
download | gdb-43b8e24199217e03e0101bf02914573d9aefa60b.zip gdb-43b8e24199217e03e0101bf02914573d9aefa60b.tar.gz gdb-43b8e24199217e03e0101bf02914573d9aefa60b.tar.bz2 |
gdb/
Fix attaching to re-prelinked executables on ppc64.
* solib-svr4.c (svr4_exec_displacement): New variable plt2_asect,
initialize it, try to adjust FILESZ field by it.
Diffstat (limited to 'gdb/solib-svr4.c')
-rw-r--r-- | gdb/solib-svr4.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index 9ad67fb..db21360 100644 --- a/gdb/solib-svr4.c +++ b/gdb/solib-svr4.c @@ -1844,6 +1844,7 @@ svr4_exec_displacement (CORE_ADDR *displacementp) Elf32_External_Phdr *phdr2p; gdb_byte *buf_vaddr_p, *buf_paddr_p; CORE_ADDR vaddr, paddr; + asection *plt2_asect; phdrp = &((Elf32_External_Phdr *) buf)[i]; buf_vaddr_p = (gdb_byte *) &phdrp->p_vaddr; @@ -1869,6 +1870,34 @@ svr4_exec_displacement (CORE_ADDR *displacementp) if (memcmp (phdrp, phdr2p, sizeof (*phdrp)) == 0) continue; + /* prelink can convert .plt SHT_NOBITS to SHT_PROGBITS. */ + plt2_asect = bfd_get_section_by_name (exec_bfd, ".plt"); + if (plt2_asect) + { + int content2; + gdb_byte *buf_filesz_p = (gdb_byte *) &phdrp->p_filesz; + CORE_ADDR filesz; + + content2 = (bfd_get_section_flags (exec_bfd, plt2_asect) + & SEC_HAS_CONTENTS) != 0; + + filesz = extract_unsigned_integer (buf_filesz_p, 4, + byte_order); + + /* PLT2_ASECT is from on-disk file (exec_bfd) while + FILESZ is from the in-memory image. */ + if (content2) + filesz += bfd_get_section_size (plt2_asect); + else + filesz -= bfd_get_section_size (plt2_asect); + + store_unsigned_integer (buf_filesz_p, 4, byte_order, + filesz); + + if (memcmp (phdrp, phdr2p, sizeof (*phdrp)) == 0) + continue; + } + ok = 0; break; } @@ -1921,6 +1950,7 @@ svr4_exec_displacement (CORE_ADDR *displacementp) Elf64_External_Phdr *phdr2p; gdb_byte *buf_vaddr_p, *buf_paddr_p; CORE_ADDR vaddr, paddr; + asection *plt2_asect; phdrp = &((Elf64_External_Phdr *) buf)[i]; buf_vaddr_p = (gdb_byte *) &phdrp->p_vaddr; @@ -1946,6 +1976,34 @@ svr4_exec_displacement (CORE_ADDR *displacementp) if (memcmp (phdrp, phdr2p, sizeof (*phdrp)) == 0) continue; + /* prelink can convert .plt SHT_NOBITS to SHT_PROGBITS. */ + plt2_asect = bfd_get_section_by_name (exec_bfd, ".plt"); + if (plt2_asect) + { + int content2; + gdb_byte *buf_filesz_p = (gdb_byte *) &phdrp->p_filesz; + CORE_ADDR filesz; + + content2 = (bfd_get_section_flags (exec_bfd, plt2_asect) + & SEC_HAS_CONTENTS) != 0; + + filesz = extract_unsigned_integer (buf_filesz_p, 8, + byte_order); + + /* PLT2_ASECT is from on-disk file (exec_bfd) while + FILESZ is from the in-memory image. */ + if (content2) + filesz += bfd_get_section_size (plt2_asect); + else + filesz -= bfd_get_section_size (plt2_asect); + + store_unsigned_integer (buf_filesz_p, 8, byte_order, + filesz); + + if (memcmp (phdrp, phdr2p, sizeof (*phdrp)) == 0) + continue; + } + ok = 0; break; } |