dc294be54c
This patch fixes gdb PR symtab/15597. The bug is that the .gnu_debugaltlink section includes the build-id of the alt file, but gdb does not use it. This patch fixes the problem by changing gdb to do what it ought to always have done: verify the build id of the file found using the filename in .gnu_debugaltlink; and if that does not match, try to find the correct debug file using the build-id and debug-file-directory. This patch touches BFD. Previously, gdb had its own code for parsing .gnu_debugaltlink; I changed it to use the BFD functions after those were introduced. However, the BFD functions are incorrect -- they assume that .gnu_debugaltlink is formatted like .gnu_debuglink. However, it it is not. Instead, it consists of a file name followed by the build-id -- no alignment, and the build-id is not a CRC. Fixing this properly is a bit of a pain. But, because separate_alt_debug_file_exists just has a FIXME for the build-id case, I did not fix it properly. Instead I introduced a hack. This leaves BFD working just as well as it did before my patch. I'm willing to do something better here but I could use some guidance as to what. It seems that the build-id code in BFD is largely punted on. FWIW gdb is the only user of bfd_get_alt_debug_link_info outside of BFD itself. I moved the build-id logic out of elfread.c and into a new file. This seemed cleanest to me. Writing a test case was a bit of a pain. I added a couple new features to the DWARF assembler to handle this. Built and regtested on x86-64 Fedora 18. * bfd-in2.h: Rebuild. * opncls.c (bfd_get_alt_debug_link_info): Add buildid_len parameter. Change type of buildid_out. Update. (get_alt_debug_link_info_shim): New function. (bfd_follow_gnu_debuglink): Use it. * Makefile.in (SFILES): Add build-id.c. (HFILES_NO_SRCDIR): Add build-id.h. * build-id.c: New file, largely from elfread.c. Modified most functions. * build-id.h: New file. * dwarf2read.c (dwarf2_get_dwz_file): Update for change to bfd_get_alt_debug_link_info. Verify dwz file's build-id. Search for dwz file using build-id. * elfread.c (build_id_bfd_get, build_id_verify) (build_id_to_debug_filename, find_separate_debug_file): Remove. * gdb.dwarf2/dwzbuildid.exp: New file. * lib/dwarf.exp (Dwarf::_section): Add "flags" and "type" parameters. (Dwarf::_defer_output): Change "section" parameter to "section_spec"; update. (Dwarf::gnu_debugaltlink, Dwarf::_note, Dwarf::build_id): New procs. |
||
---|---|---|
.. | ||
callframecfa.exp | ||
callframecfa.S | ||
clztest.c | ||
clztest.exp | ||
clztest.S | ||
dup-psym.exp | ||
dup-psym.S | ||
dw2-ada-ffffffff.exp | ||
dw2-ada-ffffffff.S | ||
dw2-anon-mptr.exp | ||
dw2-anon-mptr.S | ||
dw2-anonymous-func.exp | ||
dw2-anonymous-func.S | ||
dw2-bad-parameter-type.exp | ||
dw2-bad-parameter-type.S | ||
dw2-basic.exp | ||
dw2-basic.S | ||
dw2-canonicalize-type.exp | ||
dw2-canonicalize-type.S | ||
dw2-case-insensitive-debug.S | ||
dw2-case-insensitive.c | ||
dw2-case-insensitive.exp | ||
dw2-common-block.exp | ||
dw2-common-block.S | ||
dw2-compdir-oldgcc.exp | ||
dw2-compdir-oldgcc.S | ||
dw2-compressed.exp | ||
dw2-compressed.S | ||
dw2-const.exp | ||
dw2-const.S | ||
dw2-cp-infcall-ref-static-main.c | ||
dw2-cp-infcall-ref-static.exp | ||
dw2-cp-infcall-ref-static.S | ||
dw2-cu-size.exp | ||
dw2-cu-size.S | ||
dw2-dir-file-name.c | ||
dw2-dir-file-name.exp | ||
dw2-dos-drive.exp | ||
dw2-dos-drive.S | ||
dw2-double-set-die-type.exp | ||
dw2-double-set-die-type.S | ||
dw2-empty-namespace.exp | ||
dw2-empty-namespace.S | ||
dw2-empty-pc-range.exp | ||
dw2-empty-pc-range.S | ||
dw2-entry-value-main.c | ||
dw2-entry-value.exp | ||
dw2-entry-value.S | ||
dw2-error.c | ||
dw2-error.exp | ||
dw2-error.S | ||
dw2-filename.exp | ||
dw2-filename.S | ||
dw2-icc-opaque.exp | ||
dw2-icc-opaque.S | ||
dw2-ifort-parameter-debug.S | ||
dw2-ifort-parameter.c | ||
dw2-ifort-parameter.exp | ||
dw2-inheritance.exp | ||
dw2-inheritance.S | ||
dw2-inline-break.exp | ||
dw2-inline-break.S | ||
dw2-inline-param-main.c | ||
dw2-inline-param.exp | ||
dw2-inline-param.S | ||
dw2-intercu.exp | ||
dw2-intercu.S | ||
dw2-intermix.exp | ||
dw2-intermix.S | ||
dw2-linkage-name-trust-main.cc | ||
dw2-linkage-name-trust.exp | ||
dw2-linkage-name-trust.S | ||
dw2-minsym-in-cu.exp | ||
dw2-minsym-in-cu.S | ||
dw2-modula2-self-type.exp | ||
dw2-modula2-self-type.S | ||
dw2-namespaceless-anonymous.exp | ||
dw2-namespaceless-anonymous.S | ||
dw2-noloc-main.c | ||
dw2-noloc.exp | ||
dw2-noloc.S | ||
dw2-objfile-overlap-inner.S | ||
dw2-objfile-overlap-outer.S | ||
dw2-objfile-overlap.exp | ||
dw2-op-call.exp | ||
dw2-op-call.S | ||
dw2-op-out-param.exp | ||
dw2-op-out-param.S | ||
dw2-op-stack-value.exp | ||
dw2-op-stack-value.S | ||
dw2-param-error-main.c | ||
dw2-param-error.exp | ||
dw2-param-error.S | ||
dw2-producer.exp | ||
dw2-producer.S | ||
dw2-ranges.c | ||
dw2-ranges.exp | ||
dw2-ranges2.c | ||
dw2-ranges3.c | ||
dw2-ref-missing-frame-func.c | ||
dw2-ref-missing-frame-main.c | ||
dw2-ref-missing-frame.exp | ||
dw2-ref-missing-frame.S | ||
dw2-reg-undefined.c | ||
dw2-reg-undefined.exp | ||
dw2-reg-undefined.S | ||
dw2-restore.exp | ||
dw2-restore.S | ||
dw2-restrict.c | ||
dw2-restrict.exp | ||
dw2-restrict.S | ||
dw2-simple-locdesc.exp | ||
dw2-simple-locdesc.S | ||
dw2-skip-prologue.c | ||
dw2-skip-prologue.exp | ||
dw2-skip-prologue.S | ||
dw2-stack-boundary.exp | ||
dw2-stack-boundary.S | ||
dw2-strp.exp | ||
dw2-strp.S | ||
dw2-unresolved-main.c | ||
dw2-unresolved.exp | ||
dw2-unresolved.S | ||
dw2-var-zero-addr.exp | ||
dw2-var-zero-addr.S | ||
dw4-sig-type-unused.exp | ||
dw4-sig-type-unused.S | ||
dw4-sig-types-b.cc | ||
dw4-sig-types.cc | ||
dw4-sig-types.exp | ||
dw4-sig-types.h | ||
dwp-symlink.c | ||
dwp-symlink.exp | ||
dwz.exp | ||
dwzbuildid.exp | ||
file1.txt | ||
fission-base.c | ||
fission-base.exp | ||
fission-base.S | ||
fission-loclists.exp | ||
fission-loclists.S | ||
fission-mix.c | ||
fission-mix.exp | ||
fission-mix.h | ||
fission-mix2.c | ||
fission-reread.exp | ||
fission-reread.S | ||
gdb-index.exp | ||
implptr-64bit.exp | ||
implptr-64bit.S | ||
implptr-optimized-out.exp | ||
implptr-optimized-out.S | ||
implptr.c | ||
implptr.exp | ||
implptr.S | ||
implptrconst.c | ||
implptrconst.exp | ||
implptrpiece.exp | ||
mac-fileno.exp | ||
mac-fileno.S | ||
main.c | ||
Makefile.in | ||
member-ptr-forwardref.exp | ||
member-ptr-forwardref.S | ||
method-ptr.cc | ||
method-ptr.exp | ||
missing-sig-type.exp | ||
nostaticblock.exp | ||
pieces-optimized-out.c | ||
pieces-optimized-out.exp | ||
pieces-optimized-out.S | ||
pieces.c | ||
pieces.exp | ||
pieces.S | ||
pr10770.c | ||
pr10770.exp | ||
pr11465.exp | ||
pr11465.S | ||
pr13961.exp | ||
pr13961.S | ||
subrange.exp | ||
trace-crash.exp | ||
trace-crash.S | ||
typeddwarf-amd64.S | ||
typeddwarf.c | ||
typeddwarf.exp | ||
typeddwarf.S | ||
valop.exp | ||
valop.S | ||
watch-notconst.c | ||
watch-notconst.exp | ||
watch-notconst2.c | ||
watch-notconst2.S |