forked from Imagelibrary/binutils-gdb
Add support for locating separate debug info files via the build-id method.
PR binutils/20876 bfd * opncls.c (find_separate_debug_file): Add include_dirs parameter. Only include the directory part of the bfd's filename in search paths if include_dirs is true. Add a couple of extra locations for looking for debug files. ( bfd_follow_gnu_debuglink): Update invocation of find_separate_debug_file. (bfd_follow_gnu_debugaltlink): Likewise. (get_build_id): New function: Finds the build-id of the given bfd. (get_build_id_name): New function: Computes the name of the separate debug info file for a bfd, based upon its build-id. (check_build_id_file): New function: Checks to see if a separate debug info file exists at the given location, and that its build-id matches that of the original bfd. (bfd_follow_build_id_debuglink): New function: Finds a separate debug info file for a given bfd by using the build-id method. * dwarf2.c (_bfd_dwarf2_slurp_debug_info): Try using the build-id method of locating a separate debug info file before using the debuglink method. * bfd-in2.h: Regenerate. binutils * NEWS: Mention the new feature. * testsuite/binutils-all/objdump.exp (test_build_id_debuglink): New proc to test the location of separate debug info files using the build-id method.
This commit is contained in:
@@ -1,3 +1,11 @@
|
||||
2017-01-12 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
PR binutils/20876
|
||||
* NEWS: Mention the new feature.
|
||||
* testsuite/binutils-all/objdump.exp (test_build_id_debuglink):
|
||||
New proc to test the location of separate debug info files using
|
||||
the build-id method.
|
||||
|
||||
2017-01-10 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
PR 21034
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
-*- text -*-
|
||||
|
||||
* Add support for locating separate debug info files using the build-id
|
||||
method, where the separate file has a name based upon the build-id of
|
||||
the original file.
|
||||
|
||||
Changes in 2.28:
|
||||
|
||||
* This version of binutils fixes a problem with PowerPC VLE 16A and 16D
|
||||
|
||||
@@ -273,6 +273,86 @@ if { ![is_elf_format] } then {
|
||||
}
|
||||
}
|
||||
|
||||
proc test_build_id_debuglink {} {
|
||||
global srcdir
|
||||
global subdir
|
||||
global env
|
||||
global CC_FOR_TARGET
|
||||
global STRIP
|
||||
global OBJCOPY
|
||||
global OBJDUMP
|
||||
global CFLAGS_FOR_TARGET
|
||||
|
||||
set test "build-id-debuglink"
|
||||
if {![info exists CC_FOR_TARGET]} {
|
||||
set CC_FOR_TARGET $env(CC)
|
||||
}
|
||||
if { $CC_FOR_TARGET == "" } {
|
||||
unsupported $test
|
||||
return
|
||||
}
|
||||
|
||||
# Use a fixed build-id.
|
||||
set CFLAGS_FOR_TARGET "-g -Wl,--build-id=0x12345678abcdef01"
|
||||
|
||||
if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog exectuable debug] != "" } {
|
||||
fail "$test (build)"
|
||||
return
|
||||
}
|
||||
|
||||
# FIXME: Do we need to restore CFLAGS_FOR_TARGET to its old value ?
|
||||
|
||||
if { [binutils_run $STRIP "--strip-debug --remove-section=.comment tmpdir/testprog -o tmpdir/testprog.strip"] != "" } {
|
||||
fail "$test (strip debug info)"
|
||||
return
|
||||
}
|
||||
|
||||
if { [binutils_run $OBJCOPY "--only-keep-debug tmpdir/testprog tmpdir/testprog.debug"] != "" } {
|
||||
fail "$test (create separate debug info file)"
|
||||
return
|
||||
}
|
||||
|
||||
set got [remote_exec host "mkdir -p .build-id/12" ]
|
||||
if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
|
||||
fail "$test (make debug directory)"
|
||||
return
|
||||
}
|
||||
|
||||
set got [remote_exec host "cp tmpdir/testprog.debug .build-id/12/345678abcdef01.debug"]
|
||||
if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
|
||||
fail "$test (copy debug info into debug directory)"
|
||||
return
|
||||
}
|
||||
|
||||
set got [remote_exec host "$OBJDUMP -Sl tmpdir/testprog.strip" "" "/dev/null" "tmpdir/testprog.strip.dump"]
|
||||
if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
|
||||
fail "$test (post strip dump)"
|
||||
return
|
||||
}
|
||||
|
||||
set src2 tmpdir/testprog.strip.dump
|
||||
verbose " grep -e testprog.c ${src2}"
|
||||
set status [remote_exec build grep "-e testprog.c ${src2}"]
|
||||
set exec_output [lindex $status 1]
|
||||
set exec_output [prune_warnings $exec_output]
|
||||
if [string match "" $exec_output] then {
|
||||
send_log "$exec_output\n"
|
||||
verbose "$exec_output" 1
|
||||
fail "$test (grepping for source file name in disassembly output)"
|
||||
} else {
|
||||
pass "$test"
|
||||
# Cleanup...
|
||||
set got [remote_exec host "rm .build-id/12/345678abcdef01.debug"]
|
||||
set got [remote_exec host "rmdir -p .build-id/12" ]
|
||||
set got [remote_exec host "rm tmpdir/testprog.strip.dump"]
|
||||
set got [remote_exec host "rm tmpdir/testprog.debug"]
|
||||
set got [remote_exec host "rm tmpdir/testprog.strip"]
|
||||
}
|
||||
}
|
||||
|
||||
if {[isnative] && [is_elf_format]} then {
|
||||
test_build_id_debuglink
|
||||
}
|
||||
|
||||
# Options which are not tested: -a -d -D -R -T -x -l --stabs
|
||||
# I don't see any generic way to test any of these other than -a.
|
||||
|
||||
Reference in New Issue
Block a user