2015-01-01 09:32:14 +00:00
|
|
|
# Copyright 2013-2015 Free Software Foundation, Inc.
|
fix PR symtab/15597
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.
2013-10-08 19:56:15 +00:00
|
|
|
|
|
|
|
# This program is free software; you can redistribute it and/or modify
|
|
|
|
# it under the terms of the GNU General Public License as published by
|
|
|
|
# the Free Software Foundation; either version 3 of the License, or
|
|
|
|
# (at your option) any later version.
|
|
|
|
#
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
# GNU General Public License for more details.
|
|
|
|
#
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
load_lib dwarf.exp
|
|
|
|
|
|
|
|
# This test can only be run on targets which support DWARF-2 and use gas.
|
|
|
|
if {![dwarf2_support]} {
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
|
|
|
# No remote host testing either.
|
|
|
|
if {[is_remote host]} {
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# Lots of source files since we test a few cases and make new files
|
|
|
|
# for each.
|
|
|
|
# The tests are:
|
|
|
|
# ok - the main file refers to a dwz and the buildids match
|
|
|
|
# mismatch - the buildids do not match
|
|
|
|
# fallback - the buildids do not match but a match is found via buildid
|
|
|
|
standard_testfile main.c \
|
|
|
|
dwzbuildid-ok-base.S dwzbuildid-ok-sep.S \
|
|
|
|
dwzbuildid-mismatch-base.S dwzbuildid-mismatch-sep.S \
|
|
|
|
dwzbuildid-fallback-base.S dwzbuildid-fallback-sep.S \
|
|
|
|
dwzbuildid-fallback-ok.S
|
|
|
|
|
|
|
|
# Write some assembly that just has a .gnu_debugaltlink section.
|
|
|
|
proc write_just_debugaltlink {filename dwzname buildid} {
|
|
|
|
set asm_file [standard_output_file $filename]
|
|
|
|
|
|
|
|
Dwarf::assemble $asm_file {
|
|
|
|
upvar dwzname dwzname
|
|
|
|
upvar buildid buildid
|
|
|
|
|
|
|
|
gnu_debugaltlink $dwzname $buildid
|
|
|
|
|
|
|
|
# Only the DWARF reader checks .gnu_debugaltlink, so make sure
|
|
|
|
# there is a bit of DWARF in here.
|
|
|
|
cu {} {
|
|
|
|
compile_unit {{language @DW_LANG_C}} {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
# Write some DWARF that also sets the buildid.
|
|
|
|
proc write_dwarf_file {filename buildid {value 99}} {
|
|
|
|
set asm_file [standard_output_file $filename]
|
|
|
|
|
|
|
|
Dwarf::assemble $asm_file {
|
2014-04-24 10:46:22 +00:00
|
|
|
declare_labels int_label int_label2
|
fix PR symtab/15597
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.
2013-10-08 19:56:15 +00:00
|
|
|
|
|
|
|
upvar buildid buildid
|
|
|
|
upvar value value
|
|
|
|
|
|
|
|
build_id $buildid
|
|
|
|
|
|
|
|
cu {} {
|
|
|
|
compile_unit {{language @DW_LANG_C}} {
|
|
|
|
int_label2: base_type {
|
|
|
|
{name int}
|
|
|
|
{byte_size 4 sdata}
|
|
|
|
{encoding @DW_ATE_signed}
|
|
|
|
}
|
|
|
|
|
|
|
|
constant {
|
|
|
|
{name the_int}
|
|
|
|
{type :$int_label2}
|
|
|
|
{const_value $value data1}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if { [gdb_compile ${srcdir}/${subdir}/${srcfile} ${binfile}1.o \
|
|
|
|
object {nodebug}] != "" } {
|
|
|
|
return -1
|
|
|
|
}
|
|
|
|
|
|
|
|
# The values don't really matter, just whether they are equal.
|
|
|
|
set ok_prefix 01
|
|
|
|
set ok_suffix 0203040506
|
|
|
|
set ok_suffix2 02030405ff
|
|
|
|
set ok_buildid ${ok_prefix}${ok_suffix}
|
|
|
|
set ok_buildid2 ${ok_prefix}${ok_suffix2}
|
|
|
|
set bad_buildid ffffffffffff
|
|
|
|
|
2013-11-01 20:34:49 +00:00
|
|
|
set debugdir [standard_output_file {}]
|
|
|
|
set basedir $debugdir/.build-id
|
fix PR symtab/15597
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.
2013-10-08 19:56:15 +00:00
|
|
|
file mkdir $basedir $basedir/$ok_prefix
|
|
|
|
|
|
|
|
# Test where the separate debuginfo's buildid matches.
|
|
|
|
write_just_debugaltlink $srcfile2 ${binfile}3.o $ok_buildid
|
|
|
|
write_dwarf_file $srcfile3 $ok_buildid
|
|
|
|
|
|
|
|
# Test where the separate debuginfo's buildid does not match.
|
|
|
|
write_just_debugaltlink $srcfile4 ${binfile}5.o $ok_buildid
|
|
|
|
write_dwarf_file $srcfile5 $bad_buildid
|
|
|
|
|
|
|
|
# Test where the separate debuginfo's buildid does not match, but then
|
|
|
|
# we find a match in the .build-id directory.
|
|
|
|
write_just_debugaltlink $srcfile6 ${binfile}7.o $ok_buildid2
|
|
|
|
# Use 77 as the value so that if we load the bad debuginfo, we will
|
|
|
|
# see the wrong result.
|
|
|
|
write_dwarf_file $srcfile7 $bad_buildid 77
|
|
|
|
write_dwarf_file $srcfile8 $ok_buildid2
|
|
|
|
|
|
|
|
# Compile everything.
|
|
|
|
for {set i 2} {$i <= 8} {incr i} {
|
|
|
|
if {[gdb_compile [standard_output_file [set srcfile$i]] \
|
|
|
|
${binfile}$i.o object nodebug] != ""} {
|
|
|
|
return -1
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
# Copy a file into the .build-id place for the "fallback" test.
|
|
|
|
file copy -force -- ${binfile}8.o $basedir/$ok_prefix/$ok_suffix2.debug
|
|
|
|
|
|
|
|
# Link the executables.
|
|
|
|
if {[gdb_compile [list ${binfile}1.o ${binfile}2.o] ${binfile}-ok \
|
|
|
|
executable {}] != ""} {
|
|
|
|
return -1
|
|
|
|
}
|
|
|
|
|
|
|
|
if {[gdb_compile [list ${binfile}1.o ${binfile}4.o] ${binfile}-mismatch \
|
|
|
|
executable {}] != ""} {
|
|
|
|
return -1
|
|
|
|
}
|
|
|
|
|
|
|
|
if {[gdb_compile [list ${binfile}1.o ${binfile}6.o] ${binfile}-fallback \
|
|
|
|
executable {}] != ""} {
|
|
|
|
return -1
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
foreach testname {ok mismatch fallback} {
|
|
|
|
with_test_prefix $testname {
|
|
|
|
gdb_exit
|
|
|
|
gdb_start
|
|
|
|
gdb_reinitialize_dir $srcdir/$subdir
|
|
|
|
|
2013-11-01 20:34:49 +00:00
|
|
|
gdb_test_no_output "set debug-file-directory $debugdir" \
|
2013-10-14 16:20:13 +00:00
|
|
|
"set debug-file-directory"
|
fix PR symtab/15597
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.
2013-10-08 19:56:15 +00:00
|
|
|
|
|
|
|
gdb_load ${binfile}-${testname}
|
|
|
|
|
|
|
|
if {[runto_main]} {
|
|
|
|
if {$testname == "mismatch"} {
|
|
|
|
gdb_test "print the_int" \
|
Relax the pattern in dwzbuildid.exp
Hi,
I recently see the fail in dwzbuildid.exp below on some targets,
(gdb) print the_int
No symbol "the_int" in current context.
(gdb) FAIL: gdb.dwarf2/dwzbuildid.exp: mismatch: print the_int
Looks the pattern expects to see "No symbol table is loaded", which
is emitted in c-exp.y,
variable: name_not_typename
....
if (msymbol.minsym != NULL)
write_exp_msymbol (pstate, msymbol);
else if (!have_full_symbols () && !have_partial_symbols ())
error (_("No symbol table is loaded. Use the \"file\" command."));
else
error (_("No symbol \"%s\" in current context."),
copy_name ($1.stoken));
it is expected to have no full symbols nor partial symbols, but something
brings full symbols or partial symbols in. I added "maint info symtabs"
and "maint info psymtabs" in dwzbuildid.exp, and it shows symbols are from
ld.so, which has debug information. Then, I reproduce the fail like this,
$ make check RUNTESTFLAGS="CFLAGS_FOR_TARGET='-Wl,-rpath=${glibc_build}:${glibc_build}/math -Wl,--dynamic-linker=${glibc_build}/elf/ld.so' dwzbuildid.exp"
${glibc_build} is the glibc build tree. Debug information is not striped,
so the test fail. However, if I strip debug information from libc.so, libm.so
and ld.so. The test passes.
This patch is to relax the pattern to match the both cases that glibc build
has and has not debug information.
gdb/testsuite:
2014-05-07 Yao Qi <yao@codesourcery.com>
* gdb.dwarf2/dwzbuildid.exp: Match output "No symbol "the_int" in
current context" too.
2014-05-06 13:47:36 +00:00
|
|
|
"(No symbol table is loaded|No symbol \"the_int\" in current context).*"
|
fix PR symtab/15597
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.
2013-10-08 19:56:15 +00:00
|
|
|
} else {
|
|
|
|
gdb_test "print the_int" " = 99"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|