From 695f5e30a3668bb65141b13351f8e3d9da2b841b Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Fri, 13 Jan 2017 09:32:22 +0000 Subject: Add support for finding 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. --- binutils/ChangeLog | 8 +++ binutils/NEWS | 4 ++ binutils/testsuite/binutils-all/objdump.exp | 80 +++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+) (limited to 'binutils') diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 475175e..d4755bd 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,11 @@ +2017-01-12 Nick Clifton + + 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-09 Alan Modra * readelf.c (process_section_headers): Correct .rel.dyn/.rela.dyn diff --git a/binutils/NEWS b/binutils/NEWS index 00675f7..c5a1ba5 100644 --- a/binutils/NEWS +++ b/binutils/NEWS @@ -2,6 +2,10 @@ Changes in 2.28: +* 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. + * This version of binutils fixes a problem with PowerPC VLE 16A and 16D relocations which were functionally swapped, for example, R_PPC_VLE_HA16A performed like R_PPC_VLE_HA16D while R_PPC_VLE_HA16D diff --git a/binutils/testsuite/binutils-all/objdump.exp b/binutils/testsuite/binutils-all/objdump.exp index 67fc8aa..c29965b 100644 --- a/binutils/testsuite/binutils-all/objdump.exp +++ b/binutils/testsuite/binutils-all/objdump.exp @@ -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. -- cgit v1.1