mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-04-24 14:53:34 +08:00
Hi Guys, I am applying the rather large patch attached to this email to enhance the readelf and objdump programs so that they now have the ability to follow links to separate debug info files. (As requested by PR 15152). So for example whereas before we had this output: $ readelf -wi main.exe Contents of the .debug_info section: [...] <15> DW_AT_comp_dir : (alt indirect string, offset: 0x30c) [...] With the new option enabled we get: $ readelf -wiK main.exe main.exe: Found separate debug info file: dwz.debug Contents of the .debug_info section (loaded from main.exe): [...] <15> DW_AT_comp_dir : (alt indirect string, offset: 0x30c) /home/nickc/Downloads/dwzm [...] The link following feature also means that we can get two lots of output if the same section exists in both the main file and the separate debug info file: $ readelf -wiK main.exe main.exe: Found separate debug info file: dwz.debug Contents of the .debug_info section (loaded from main.exe): [...] Contents of the .debug_info section (loaded from dwz.debug): [...] The patch also adds the ability to display the contents of debuglink sections: $ readelf -wk main.exe Contents of the .gnu_debugaltlink section: Separate debug info file: dwz.debug Build-ID (0x14 bytes): c4 a8 89 8d 64 cf 70 8a 35 68 21 f2 ed 24 45 3e 18 7a 7a 93 Naturally there are long versions of these options (=follow-links and =links). The documentation has been updated as well, and since both readelf and objdump use the same set of debug display options, I have moved the text into a separate file. There are also a couple of new binutils tests to exercise the new behaviour. There are a couple of missing features in the current patch however, although I do intend to address them in follow up submissions: Firstly the code does not check the build-id inside separate debug info files when it is searching for a file specified by a .gnu_debugaltlink section. It just assumes that if the file is there, then it contains the information being sought. Secondly I have not checked the DWARF-5 version of these link features, so there will probably be code to add there. Thirdly I have only implemented link following for the DW_FORM_GNU_strp_alt format. Other alternate formats (eg DW_FORM_GNU_ref_alt) have yet to be implemented. Lastly, whilst implementing this feature I found it necessary to move some of the global variables used by readelf (eg section_headers) into a structure that can be passed around. I have moved all of the global variables that were necessary to get the patch working, but I need to complete the operation and move the remaining, file-specific variables (eg dynamic_strings). Cheers Nick binutils PR 15152 * dwarf.h (enum dwarf_section_display_enum): Add gnu_debuglink, gnu_debugaltlink and separate_debug_str. (struct dwarf_section): Add filename field. Add prototypes for load_separate_debug_file, close_debug_file and open_debug_file. * dwarf.c (do_debug_links): New. (do_follow_links): New. (separate_debug_file, separate_debug_filename): New. (fetch_alt_indirect_string): New function. Retrieves a string from the debug string table in the separate debug info file. (read_and_display_attr_value): Use it with DW_FORM_GNU_strp_alt. (load_debug_section_with_follow): New function. Like load_debug_section, but if the first attempt fails, then tries again in the separate debug info file. (introduce): New function. (process_debug_info): Use load_debug_section_with_follow and introduce. (load_debug_info): Likewise. (display_debug_lines_raw): Likewise. (display_debug_lines_decoded): Likewise. (display_debug_macinfo): Likewise. (display_debug_macro): Likewise. (display_debug_abbrev): Likewise. (display_debug_loc): Likewise. (display_debug_str): Likewise. (display_debug_aranges): Likewise. (display_debug_addr); Likewise. (display_debug_frames): Likewise. (display_gdb_index): Likewise. (process_cu_tu_index): Likewise. (load_cu_tu_indexes): Likewise. (display_debug_links): New function. Displays the contents of a .gnu_debuglink or .gnu_debugaltlink section. (calc_gnu_debuglink_ctc32):New function. Calculates a CRC32 value. (check_gnu_debuglink): New function. Checks the CRC of a potential separate debug info file. (parse_gnu_debuglink): New function. Reads a CRC value out of a .gnu_debuglink section. (check_gnu_debugaltlink): New function. (parse_gnu_debugaltlink): New function. Reads the build-id value out of a .gnu_debugaltlink section. (load_separate_debug_info): New function. Finds and loads a separate debug info file. (load_separate_debug_file): New function. Attempts to find and follow a link to a separate debug info file. (free_debug_memory): Free the separate debug info file information. (opts_table): Add "follow-links" and "links". (dwarf_select_sections_by_letters): Add "k" and "K". (debug_displays): Reformat. Add .gnu-debuglink and .gnu_debugaltlink. Add an extra entry for .debug_str in a separate debug info file. * doc/binutils.texi: Move description of debug dump features common to both readelf and objdump into... * objdump.c (usage): Add -Wk and -WK. (load_specific_debug_section): Initialise the filename field in the dwarf_section structure. (close_debug_file): New function. (open_debug_file): New function. (dump_dwarf): Load and dump the separate debug info sections. * readelf.c (struct filedata): New structure. Contains various variables that used to be global: (current_file_size, string_table, string_table_length, elf_header) (section_headers, program_headers, dump_sects, num_dump_sects): Move into filedata structure. (cmdline): New global variable. Contains list of sections to dump by number, as specified on the command line. Add filedata parameter to most functions. (load_debug_section): Load the string table if it has not already been retrieved. (close_file): New function. (close_debug_file): New function. (open_file): New function. (open_debug_file): New function. (process_object): Process sections in any separate debug info files. * doc/debug.options.texi: New file. Add description of =links and =follow-links options. * NEWS: Mention the new feature. * elfcomm.c: Have the byte gte functions take a const pointer. * elfcomm.h: Update prototypes. * testsuite/binutils-all/dw5.W: Update expected output. * testsuite/binutils-all/objdump.WL: Update expected output. * testsuite/binutils-all/objdump.exp: Add test of -WK and -Wk. * testsuite/binutils-all/readelf.exp: Add test of -wK and -wk. * testsuite/binutils-all/readelf.k: New file. * testsuite/binutils-all/objdump.Wk: New file. * testsuite/binutils-all/objdump.WK2: New file. * testsuite/binutils-all/linkdebug.s: New file. * testsuite/binutils-all/debuglink.s: New file. gas * testsuite/gas/avr/large-debug-line-table.d: Update expected output. * testsuite/gas/elf/dwarf2-11.d: Likewise. * testsuite/gas/elf/dwarf2-12.d: Likewise. * testsuite/gas/elf/dwarf2-13.d: Likewise. * testsuite/gas/elf/dwarf2-14.d: Likewise. * testsuite/gas/elf/dwarf2-15.d: Likewise. * testsuite/gas/elf/dwarf2-16.d: Likewise. * testsuite/gas/elf/dwarf2-17.d: Likewise. * testsuite/gas/elf/dwarf2-18.d: Likewise. * testsuite/gas/elf/dwarf2-5.d: Likewise. * testsuite/gas/elf/dwarf2-6.d: Likewise. * testsuite/gas/elf/dwarf2-7.d: Likewise. ld * testsuite/ld-avr/gc-section-debugline.d: Update expected output.
514 lines
15 KiB
Plaintext
514 lines
15 KiB
Plaintext
# Copyright (C) 1993-2017 Free Software Foundation, Inc.
|
|
|
|
# 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, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
# Please email any bugs, comments, and/or additions to this file to:
|
|
# bug-dejagnu@prep.ai.mit.edu
|
|
|
|
# This file was written by Rob Savoye <rob@cygnus.com>
|
|
# and rewritten by Ian Lance Taylor <ian@cygnus.com>
|
|
|
|
if ![is_remote host] {
|
|
if {[which $OBJDUMP] == 0} then {
|
|
perror "$OBJDUMP does not exist"
|
|
return
|
|
}
|
|
}
|
|
|
|
send_user "Version [binutil_version $OBJDUMP]"
|
|
|
|
# Simple test of objdump -i
|
|
|
|
set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -i"]
|
|
|
|
set cpus_expected [list]
|
|
lappend cpus_expected aarch64 alpha am33-2 arc ARC700 ARCv2 arm cris
|
|
lappend cpus_expected d10v d30v fr30 fr500 fr550 h8 hppa i386 i860 i960 iamcu ip2022
|
|
lappend cpus_expected m16c m32c m32r m68hc11 m68hc12 m68k m88k MCore mep c5 h1 MicroBlaze
|
|
lappend cpus_expected mips mn10200 mn10300 ms1 msp MSP430 nds32 n1h_v3 ns32k
|
|
lappend cpus_expected or1k or1knd pj powerpc pyramid riscv romp rs6000 s390 sh sparc
|
|
lappend cpus_expected tahoe tic54x tic80 tilegx tms320c30 tms320c4x tms320c54x
|
|
lappend cpus_expected v850 vax we32k x86-64 xscale xtensa z8k z8001 z8002
|
|
|
|
# Make sure the target CPU shows up in the list.
|
|
lappend cpus_expected ${target_cpu}
|
|
|
|
# Create regexp
|
|
set cpus_regex "([join $cpus_expected | ])"
|
|
|
|
verbose -log "CPU regex: $cpus_regex"
|
|
|
|
set want "BFD header file version.*srec\[^\n\]*\n\[^\n\]*header \[^\n\]*endian\[^\n\]*, data \[^\n\]*endian.*$cpus_regex"
|
|
|
|
if [regexp $want $got] then {
|
|
pass "objdump -i"
|
|
} else {
|
|
fail "objdump -i"
|
|
}
|
|
|
|
# The remaining tests require a test file.
|
|
|
|
|
|
if {![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest.o]} then {
|
|
return
|
|
}
|
|
if {![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest2.o]} then {
|
|
return
|
|
}
|
|
if [is_remote host] {
|
|
set testfile [remote_download host tmpdir/bintest.o]
|
|
set testfile2 [remote_download host tmpdir/bintest2.o]
|
|
} else {
|
|
set testfile tmpdir/bintest.o
|
|
set testfile2 tmpdir/bintest2.o
|
|
}
|
|
|
|
# $testarchive exists only if it is supported.
|
|
set testarchive tmpdir/bintest.a
|
|
remote_file host file delete $testarchive
|
|
if { ![istarget "alpha-*-*"] || [is_elf_format] } then {
|
|
set got [binutils_run $AR "rc tmpdir/bintest.a $testfile2"]
|
|
if ![string match "" $got] then {
|
|
fail "bintest.a"
|
|
remote_file host delete tmpdir/bintest.a
|
|
} elseif [is_remote host] {
|
|
set testarchive [remote_download host tmpdir/bintest.a]
|
|
}
|
|
remote_file host delete tmpdir/bintest2.o
|
|
}
|
|
|
|
# Test objdump -f
|
|
|
|
proc test_objdump_f { testfile dumpfile } {
|
|
global OBJDUMP
|
|
global OBJDUMPFLAGS
|
|
global cpus_regex
|
|
|
|
set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f $testfile"]
|
|
|
|
set want "$dumpfile:\[ \]*file format.*architecture:\[ \]*${cpus_regex}.*HAS_RELOC.*HAS_SYMS"
|
|
|
|
if ![regexp $want $got] then {
|
|
fail "objdump -f ($testfile, $dumpfile)"
|
|
} else {
|
|
pass "objdump -f ($testfile, $dumpfile)"
|
|
}
|
|
}
|
|
|
|
test_objdump_f $testfile $testfile
|
|
if { [ remote_file host exists $testarchive ] } then {
|
|
test_objdump_f $testarchive bintest2.o
|
|
}
|
|
|
|
# Test objdump -h
|
|
|
|
proc test_objdump_h { testfile dumpfile } {
|
|
global OBJDUMP
|
|
global OBJDUMPFLAGS
|
|
|
|
set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h $testfile"]
|
|
|
|
set want "$dumpfile:\[ \]*file format.*Sections.*\[0-9\]+\[ \]+\[^ \]*(text|TEXT|P|\\\$CODE\\\$)\[^ \]*\[ \]*(\[0-9a-fA-F\]+).*\[0-9\]+\[ \]+\[^ \]*(\\.data|DATA|D_1)\[^ \]*\[ \]*(\[0-9a-fA-F\]+)"
|
|
|
|
if ![regexp $want $got all text_name text_size data_name data_size] then {
|
|
fail "objdump -h ($testfile, $dumpfile)"
|
|
} else {
|
|
verbose "text name is $text_name size is $text_size"
|
|
verbose "data name is $data_name size is $data_size"
|
|
set ets 8
|
|
set eds 4
|
|
# The [ti]c4x target has the property sizeof(char)=sizeof(long)=1
|
|
if [istarget *c4x*-*-*] then {
|
|
set ets 2
|
|
set eds 1
|
|
}
|
|
# c54x section sizes are in bytes, not octets; adjust accordingly
|
|
if [istarget *c54x*-*-*] then {
|
|
set ets 4
|
|
set eds 2
|
|
}
|
|
if {[expr "0x$text_size"] < $ets || [expr "0x$data_size"] < $eds} then {
|
|
send_log "sizes too small\n"
|
|
fail "objdump -h ($testfile, $dumpfile)"
|
|
} else {
|
|
pass "objdump -h ($testfile, $dumpfile)"
|
|
}
|
|
}
|
|
}
|
|
|
|
test_objdump_h $testfile $testfile
|
|
if { [ remote_file host exists $testarchive ] } then {
|
|
test_objdump_h $testarchive bintest2.o
|
|
}
|
|
|
|
# Test objdump -t
|
|
|
|
proc test_objdump_t { testfile} {
|
|
global OBJDUMP
|
|
global OBJDUMPFLAGS
|
|
|
|
set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -t $testfile"]
|
|
|
|
if [info exists vars] then { unset vars }
|
|
while {[regexp "(\[a-z\]*_symbol)(.*)" $got all symbol rest]} {
|
|
set vars($symbol) 1
|
|
set got $rest
|
|
}
|
|
|
|
if {![info exists vars(text_symbol)] \
|
|
|| ![info exists vars(data_symbol)] \
|
|
|| ![info exists vars(common_symbol)] \
|
|
|| ![info exists vars(external_symbol)]} then {
|
|
fail "objdump -t ($testfile)"
|
|
} else {
|
|
pass "objdump -t ($testfile)"
|
|
}
|
|
}
|
|
|
|
test_objdump_t $testfile
|
|
if { [ remote_file host exists $testarchive ] } then {
|
|
test_objdump_t $testarchive
|
|
}
|
|
|
|
# Test objdump -r
|
|
|
|
proc test_objdump_r { testfile dumpfile } {
|
|
global OBJDUMP
|
|
global OBJDUMPFLAGS
|
|
|
|
set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -r $testfile"]
|
|
|
|
set want "$dumpfile:\[ \]*file format.*RELOCATION RECORDS FOR \\\[\[^\]\]*(text|TEXT|P|\\\$CODE\\\$)\[^\]\]*\\\].*external_symbol"
|
|
|
|
if [regexp $want $got] then {
|
|
pass "objdump -r ($testfile, $dumpfile)"
|
|
} else {
|
|
fail "objdump -r ($testfile, $dumpfile)"
|
|
}
|
|
}
|
|
|
|
test_objdump_r $testfile $testfile
|
|
if { [ remote_file host exists $testarchive ] } then {
|
|
test_objdump_r $testarchive bintest2.o
|
|
}
|
|
|
|
# Test objdump -s
|
|
|
|
proc test_objdump_s { testfile dumpfile } {
|
|
global OBJDUMP
|
|
global OBJDUMPFLAGS
|
|
|
|
set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -s $testfile"]
|
|
|
|
set want "$dumpfile:\[ \]*file format.*Contents.*(text|TEXT|P|\\\$CODE\\\$)\[^0-9\]*\[ \]*\[0-9a-fA-F\]*\[ \]*(00000001|01000000|00000100).*Contents.*(data|DATA|D_1)\[^0-9\]*\[ \]*\[0-9a-fA-F\]*\[ \]*(00000002|02000000|00000200)"
|
|
|
|
if [regexp $want $got] then {
|
|
pass "objdump -s ($testfile, $dumpfile)"
|
|
} else {
|
|
fail "objdump -s ($testfile, $dumpfile)"
|
|
}
|
|
}
|
|
|
|
test_objdump_s $testfile $testfile
|
|
if { [ remote_file host exists $testarchive ] } then {
|
|
test_objdump_s $testarchive bintest2.o
|
|
}
|
|
|
|
# Test objdump -s on a file that contains a compressed .debug section
|
|
|
|
if { ![is_elf_format] } then {
|
|
unsupported "objdump compressed debug"
|
|
} elseif { ![binutils_assemble $srcdir/$subdir/dw2-compressed.S tmpdir/dw2-compressed.o] } then {
|
|
fail "objdump compressed debug"
|
|
} else {
|
|
if [is_remote host] {
|
|
set compressed_testfile [remote_download host tmpdir/dw2-compressed.o]
|
|
} else {
|
|
set compressed_testfile tmpdir/dw2-compressed.o
|
|
}
|
|
|
|
set got [remote_exec host "$OBJDUMP $OBJDUMPFLAGS -s -j .zdebug_abbrev $compressed_testfile" "" "/dev/null" "objdump.out"]
|
|
|
|
if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
|
|
fail "objdump -s -j .zdebug_abbrev (reason: unexpected output)"
|
|
send_log $got
|
|
send_log "\n"
|
|
}
|
|
|
|
if { [regexp_diff objdump.out $srcdir/$subdir/objdump.s] } then {
|
|
fail "objdump -s -j .zdebug_abbrev"
|
|
} else {
|
|
pass "objdump -s -j .zdebug_abbrev"
|
|
}
|
|
|
|
# Test objdump -W on a file that contains some compressed .debug sections
|
|
|
|
set got [remote_exec host "$OBJDUMP $OBJDUMPFLAGS -W $compressed_testfile" "" "/dev/null" "objdump.out"]
|
|
|
|
if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
|
|
fail "objdump -W (reason: unexpected output)"
|
|
send_log $got
|
|
send_log "\n"
|
|
}
|
|
|
|
if { [regexp_diff objdump.out $srcdir/$subdir/objdump.W] } then {
|
|
fail "objdump -W"
|
|
} else {
|
|
pass "objdump -W"
|
|
}
|
|
}
|
|
|
|
# Test objdump -WL on a file that contains line information for multiple files and search directories.
|
|
# Not supported on mcore and moxie targets because they do not (yet) support the generation
|
|
# of DWARF2 line debug information.
|
|
|
|
if { ![is_elf_format]
|
|
|| [istarget "hppa64*-*-hpux*"]
|
|
|| [istarget "i370-*-*"]
|
|
|| [istarget "i960-*-*"]
|
|
|| [istarget "ia64*-*-*"]
|
|
|| [istarget "mcore-*-*"]
|
|
|| [istarget "moxie-*-*"]
|
|
} then {
|
|
unsupported "objump decode line"
|
|
} else {
|
|
if { [istarget "or1k*-*-*"] } then {
|
|
set decodedline_testsrc $srcdir/$subdir/dw2-decodedline-1.S
|
|
} else {
|
|
set decodedline_testsrc $srcdir/$subdir/dw2-decodedline.S
|
|
}
|
|
if { ![binutils_assemble $decodedline_testsrc tmpdir/dw2-decodedline.o] } then {
|
|
fail "objdump decoded line"
|
|
}
|
|
|
|
if [is_remote host] {
|
|
set decodedline_testfile [remote_download host tmpdir/dw2-decodedline.o]
|
|
} else {
|
|
set decodedline_testfile tmpdir/dw2-decodedline.o
|
|
}
|
|
|
|
set got [remote_exec host "$OBJDUMP $OBJDUMPFLAGS -WL $decodedline_testfile" "" "/dev/null" "objdump.out"]
|
|
|
|
if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
|
|
fail "objdump -WL (reason: unexpected output)"
|
|
send_log $got
|
|
send_log "\n"
|
|
}
|
|
|
|
if { [regexp_diff objdump.out $srcdir/$subdir/objdump.WL] } then {
|
|
fail "objdump -WL"
|
|
} else {
|
|
pass "objdump -WL"
|
|
}
|
|
}
|
|
|
|
# Test objdump -W on a file containing debug_ranges information.
|
|
|
|
if { ![is_elf_format] } then {
|
|
unsupported "objdump debug_ranges test"
|
|
} elseif { ![binutils_assemble $srcdir/$subdir/dw2-ranges.S tmpdir/dw2-ranges.o] } then {
|
|
fail "objdump debug_ranges test"
|
|
} else {
|
|
if [is_remote host] {
|
|
set ranges_testfile [remote_download host tmpdir/dw2-ranges.o]
|
|
} else {
|
|
set ranges_testfile tmpdir/dw2-ranges.o
|
|
}
|
|
|
|
set got [remote_exec host "$OBJDUMP $OBJDUMPFLAGS --dwarf=Ranges $ranges_testfile" "" "/dev/null" "objdump.out"]
|
|
|
|
if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
|
|
fail "objdump -W for debug_ranges (reason: unexpected output)"
|
|
send_log $got
|
|
send_log "\n"
|
|
}
|
|
|
|
setup_xfail "msp430-*-*" "nds32*-*-*"
|
|
if { [regexp_diff objdump.out $srcdir/$subdir/dw2-ranges.W] } then {
|
|
fail "objdump -W for debug_ranges"
|
|
} else {
|
|
pass "objdump -W for debug_ranges"
|
|
}
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
# Test objdump -Wk on a file containing debug links.
|
|
|
|
if { [is_elf_format] } then {
|
|
set testsrc $srcdir/$subdir/debuglink.s
|
|
|
|
if { ![binutils_assemble $testsrc tmpdir/debuglink.o] } then {
|
|
fail "objdump -Wk (reason: could not assemble source)"
|
|
}
|
|
|
|
if [is_remote host] {
|
|
set testfile [remote_download host tmpdir/debuglink.o]
|
|
} else {
|
|
set testfile tmpdir/debuglink.o
|
|
}
|
|
|
|
set got [remote_exec host "$OBJDUMP $OBJDUMPFLAGS -Wk $testfile" "" "/dev/null" "objdump.out"]
|
|
|
|
if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
|
|
fail "objdump -Wk (reason: unexpected output)"
|
|
send_log $got
|
|
send_log "\n"
|
|
}
|
|
|
|
if { [regexp_diff objdump.out $srcdir/$subdir/objdump.Wk] } then {
|
|
fail "objdump -Wk"
|
|
} else {
|
|
pass "objdump -Wk"
|
|
}
|
|
}
|
|
|
|
|
|
# Very similar to proc test_build_id_debuglink except this time we
|
|
# display some of the contents of the separate debug info file.
|
|
|
|
proc test_follow_debuglink {} {
|
|
global srcdir
|
|
global subdir
|
|
global OBJDUMP
|
|
|
|
set test "follow-debuglink"
|
|
|
|
if {![binutils_assemble $srcdir/$subdir/debuglink.s tmpdir/debuglink.o]} then {
|
|
fail "$test (reason: assemble first source file)"
|
|
return
|
|
}
|
|
|
|
if {![binutils_assemble $srcdir/$subdir/linkdebug.s tmpdir/linkdebug.debug]} then {
|
|
fail "$test (reason: assemble second source file)"
|
|
return
|
|
}
|
|
|
|
if ![is_remote host] {
|
|
set tempfile tmpdir/debuglink.o
|
|
} else {
|
|
set tempfile [remote_download host tmpdir/linkdebug.debug]
|
|
set tempfile [remote_download host tmpdir/debuglink.o]
|
|
}
|
|
|
|
set got [remote_exec host "$OBJDUMP --dwarf=follow-links --dwarf=info --dwarf=str $tempfile" "" "/dev/null" "tmpdir/objdump.out"]
|
|
if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
|
|
fail "$test (reason: unexpected error output from objdump)"
|
|
return
|
|
}
|
|
|
|
if { [regexp_diff tmpdir/objdump.out $srcdir/$subdir/objdump.WK2] } then {
|
|
fail $test
|
|
verbose "output is \n[file_contents objdump.out]" 2
|
|
return
|
|
}
|
|
|
|
pass $test
|
|
|
|
# Tidy up
|
|
set got [remote_exec host "rm tmpdir/objdump.out"]
|
|
set got [remote_exec host "rm $tempfile"]
|
|
set got [remote_exec host "rm tmpdir/linkdebug.debug"]
|
|
}
|
|
|
|
if {[isnative] && [is_elf_format]} then {
|
|
test_follow_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.
|
|
# Tests could be written for specific targets, and that should be done
|
|
# if specific problems are found.
|