aboutsummaryrefslogtreecommitdiff
path: root/bfd/elfcode.h
diff options
context:
space:
mode:
authorJan Kratochvil <jan.kratochvil@redhat.com>2014-09-18 08:21:40 +0200
committerJan Kratochvil <jan.kratochvil@redhat.com>2014-09-18 08:24:59 +0200
commit92c9bcd479e4cb388a7f286fc42414b115cfc656 (patch)
treea48debbe0e039fb6022af98c0abec0962a83eb75 /bfd/elfcode.h
parent039b3b7b034f4c9ac9e38f8b3e7367e108f89f8a (diff)
downloadgdb-92c9bcd479e4cb388a7f286fc42414b115cfc656.zip
gdb-92c9bcd479e4cb388a7f286fc42414b115cfc656.tar.gz
gdb-92c9bcd479e4cb388a7f286fc42414b115cfc656.tar.bz2
Fix regression for Linux vDSO in GDB (PR gdb/17407).
since 5979d6b69b20a8355ea94b75fad97415fce4788c https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=5979d6b69b20a8355ea94b75fad97415fce4788c vdso handling https://sourceware.org/ml/binutils/2014-03/msg00082.html https://sourceware.org/ml/binutils/2014-04/msg00003.html Message-ID: <A78C989F6D9628469189715575E55B230AA884EB@IRSMSX104.ger.corp.intel.com> I get on kernel-3.16.2-200.fc20.x86_64 https://koji.fedoraproject.org/koji/buildinfo?buildID=575860 attaching its vdso.bin.gz GDB (FSF HEAD 5e43d46791c4c66fd83947a12d4f716b561a9103) regression: reproducer: ./gdb -ex start ./gdb actual result / FAIL: Got object file from memory but can't read symbols: File truncated. expected result / PASS: <nothing> or / PASS: warning: Could not load shared library symbols for linux-vdso.so.1. Do you need "set solib-search-path" or "set sysroot"? That "warning: Could not load shared library..." is mostly harmless (it is a bug in GDB), in the FAIL case it is not printed just because bfd_check_format() fails there. It seems logical to me this way when the 'size' parameter has been already added. Alan Modra: I was wrongly thinking that the section headers were always last when I wrote that code. (They are now! If you relink that vdso with current binutils master you won't hit this problem, but that of course doesn't help existing kernels.) I do not see a regression for add-symbol-file-from-memory for libncurses.so.5 from the original thread above. Start of section headers: 1080 (bytes into file) Size of section headers: 64 (bytes) Number of section headers: 13 Section header string table index: 8 Section Headers: [Nr] Name Type Address Off Size ES Flg Lk Inf Al [ 8] .fake_shstrtab STRTAB 0000000000000780 000780 000076 00 A 0 0 32 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align LOAD 0x000000 0x0000000000000000 0x0000000000000000 0x0012fe 0x0012fe R E 0x1000 size == 0x2000 shdr_end == 0x778 == 1080 + 13 * 64 high_offset == 0x12fe else if (size >= shdr_end) - high_offset = shdr_end; + high_offset = size; But then 0x778 < 0x780 for "Section header string table index" so whole bfd_check_format() fails because section headers were not cleared here: /* If the segments visible in memory didn't include the section headers, then clear them from the file header. */ if (high_offset < shdr_end) bfd/ChangeLog 2014-09-18 Jan Kratochvil <jan.kratochvil@redhat.com> PR gdb/17407 * elfcode.h (bfd_from_remote_memory): Use SIZE for HIGH_OFFSET.
Diffstat (limited to 'bfd/elfcode.h')
-rw-r--r--bfd/elfcode.h2
1 files changed, 1 insertions, 1 deletions
diff --git a/bfd/elfcode.h b/bfd/elfcode.h
index a49a708..ec53c3b 100644
--- a/bfd/elfcode.h
+++ b/bfd/elfcode.h
@@ -1749,7 +1749,7 @@ NAME(_bfd_elf,bfd_from_remote_memory)
headers. */
}
else if (size >= shdr_end)
- high_offset = shdr_end;
+ high_offset = size;
else
{
bfd_vma page_size = get_elf_backend_data (templ)->minpagesize;