old-cross-binutils/binutils/testsuite/binutils-all/readelf.exp
Alan Modra 9cc0123fea MIPS objcopy --rename-section fix
Some MIPS targets use a named section symbol rather than a symbol with
no name as is used with most ELF targets.  When renaming sections, the
named section symbol needs to be renamed too.

Rather than fix this bug, I'd originally intended to just correct the
xfail added recently for update-1.o vs update4.o in update-section.exp,
using the same set of targets for the localize-hidden-1 mips xfail.
I'd extracted that target test into a new function, is_bad_symtab.  It
turns out to be useful in readelf.exp too.

bfd/
	* config.bfd: Delete mips vxworks patterns matched earlier.
	Combine mips*-*-none with mips*-*-elf*.
binutils/
	* objcopy.c (find_section_rename): Forward declare.  Remove
	ibfd and sec_ptr param.  Add old_name param.  Allow for NULL
	returned_flags.  Move read of section name and flags to..
	(setup_section): ..here.  Update find_section_rename call.
	(filter_symbols): Rename section symbols for renamed sections.
	(copy_object): Call filter_symbols when renamed sections.
	* testsuite/lib/binutils-common.exp (is_bad_symtab): New.
	* testsuite/binutils-all/update-section.exp: Revert 96037eb0
	mips xfail.
	* testsuite/binutils-all/objcopy.exp (copy_executable): Use
	is_bad_symtab.
	(localize-hidden-1): xfail if is_bad_symtab.
	* testsuite/binutils-all/readelf.exp: Use is_bad_symtab to select
	between mips/tmips.
2016-06-24 23:26:29 +09:30

396 lines
11 KiB
Text

# Copyright (C) 1999-2016 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
# Written by Nick Clifton <nickc@cygnus.com>
# Based on scripts written by Ian Lance Taylor <ian@cygnus.com>
# and Ken Raeburn <raeburn@cygnus.com>.
# Exclude non-ELF targets.
if ![is_elf_format] {
verbose "$READELF is only intended for ELF targets" 2
return
}
# First some helpful procedures, then the tests themselves
# Return the contents of the filename given
proc file_contents { filename } {
set file [open $filename r]
set contents [read $file]
close $file
return $contents
}
# Find out the size by reading the output of the EI_CLASS field.
# Similar to the test for readelf -h, but we're just looking for the
# EI_CLASS line here.
proc readelf_find_size { binary_file } {
global READELF
global READELFFLAGS
global readelf_size
set readelf_size ""
set testname "finding out ELF size with readelf -h"
set got [remote_exec host "$READELF $READELFFLAGS -h $binary_file" "" "/dev/null" "readelf.out"]
if [is_remote host] then {
remote_upload host "readelf.out"
}
if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]]} then {
send_log $got
fail $testname
return
}
if { ! [regexp "\n\[ \]*Class:\[ \]*ELF(\[0-9\]+)\n" \
[file_contents readelf.out] nil readelf_size] } {
verbose -log "EI_CLASS field not found in output"
verbose -log "output is \n[file_contents readelf.out]"
fail $testname
return
} else {
verbose -log "ELF size is $readelf_size"
}
pass $testname
}
# Run an individual readelf test.
# Basically readelf is run on the binary_file with the given options.
# Readelf's output is captured and then compared against the contents
# of the regexp_file-readelf_size if it exists, else regexp_file.
proc readelf_test { options binary_file regexp_file xfails } {
global READELF
global READELFFLAGS
global readelf_size
global srcdir
global subdir
send_log "exec $READELF $READELFFLAGS $options $binary_file > readelf.out\n"
set got [remote_exec host "$READELF $READELFFLAGS $options $binary_file" "" "/dev/null" "readelf.out"]
foreach xfail $xfails {
setup_xfail $xfail
}
if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
fail "readelf $options (reason: unexpected output)"
send_log $got
send_log "\n"
return
}
set target_machine ""
if [istarget "mips*-*-*"] then {
if [is_bad_symtab] then {
set target_machine mips
} else {
set target_machine tmips
}
}
if { $target_machine != "" && [file exists $srcdir/$subdir/$regexp_file-$readelf_size-$target_machine] } then {
set regexp_file $regexp_file-$readelf_size-$target_machine
} elseif { $target_machine != "" && [file exists $srcdir/$subdir/$regexp_file-$target_machine] } then {
set regexp_file $regexp_file-$target_machine
} elseif { [file exists $srcdir/$subdir/$regexp_file-$readelf_size] } then {
set regexp_file $regexp_file-$readelf_size
}
if { [regexp_diff readelf.out $srcdir/$subdir/$regexp_file] } then {
fail "readelf $options"
verbose "output is \n[file_contents readelf.out]" 2
return
}
pass "readelf $options"
}
# Simple proc to skip certain expected warning messages.
proc prune_readelf_wi_warnings { text } {
regsub -all "(^|\n)(.*Skipping unexpected symbol type.*)" $text "\\1" text
return $text
}
# Testing the "readelf -wi" option is difficult because there
# is no guaranteed order to the output, and because some ports
# will use indirect string references, whilst others will use
# direct references. So instead of having an expected output
# file, like the other readelf tests, we grep for strings that
# really ought to be there.
proc readelf_wi_test {} {
global READELF
global READELFFLAGS
global srcdir
global subdir
# Compile the second test file.
if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
verbose "Unable to compile test file."
untested "readelf -wi"
return
}
# Download it.
set tempfile [remote_download host tmpdir/testprog.o]
# Run "readelf -wi" on it.
set got [remote_exec host "$READELF $READELFFLAGS -wi $tempfile" "" "/dev/null" "readelf.out"]
# Upload the results.
set output [remote_upload host readelf.out]
file_on_host delete $tempfile
# Strip any superflous warnings.
set got [prune_readelf_wi_warnings [lindex $got 1]]
if ![string match "" $got] then {
fail "readelf $READELFFLAGS -wi (reason: unexpected output)"
send_log $got
send_log "\n"
return
}
if ![file size $output] then {
# If the output file is empty, then this target does not
# generate dwarf2 output. This is not a failure.
verbose "No output from 'readelf -wi'"
untested "readelf -wi"
return
}
# Search for strings that should be in the output.
set sought {
".*DW_TAG_compile_unit.*"
".*DW_TAG_subprogram.*"
".*DW_TAG_base_type.*"
".*DW_AT_producer.*(GNU C|indirect string).*"
".*DW_AT_language.*ANSI C.*"
".*DW_AT_name.*(testprog.c|indirect string).*"
".*DW_AT_name.*fn.*"
".*DW_AT_name.*(main|indirect string).*"
".*\(DW_OP_addr: 0\).*"
}
# The MSP430 in LARGE mode does not generate a DW_OP_addr.
setup_xfail msp430*-*-*
foreach looked_for $sought {
set lines [grep $output $looked_for]
if ![llength $lines] then {
fail "readelf -wi: missing: $looked_for"
send_log readelf.out
return
}
}
file_on_host delete $output
# All done.
pass "readelf -wi"
}
# This tests "readelf -wa", but on a file with a compressed
# .debug_abbrev section.
proc readelf_compressed_wa_test {} {
global READELF
global READELFFLAGS
global srcdir
global subdir
# Compile the compressed-debug-section test file.
if { [target_compile $srcdir/$subdir/dw2-compressed.S tmpdir/dw2-compressed.o object debug] != "" } {
verbose "Unable to compile test file."
untested "readelf -wa (compressed)"
return
}
# Download it.
set tempfile [remote_download host tmpdir/dw2-compressed.o]
# Run "readelf -wa" on it.
set got [remote_exec host "$READELF $READELFFLAGS -wa $tempfile" "" "/dev/null" "readelf.out"]
# Upload the results.
set output [remote_upload host readelf.out]
file_on_host delete $tempfile
if { [string compare [file_contents readelf.out] [file_contents $srcdir/$subdir/readelf.wa]] != 0 } then {
fail "readelf -wa (compressed)"
verbose "output is \n[file_contents readelf.out]" 2
verbose "expected is \n[file_contents $srcdir/$subdir/readelf.wa]" 2
return
}
pass "readelf -wa (compressed)"
}
# Test readelf's dumping abilities.
proc readelf_dump_test {} {
global READELF
global READELFFLAGS
global srcdir
global subdir
# Assemble the dump test file.
if {![binutils_assemble $srcdir/$subdir/dumptest.s tmpdir/dumptest.o]} then {
unresolved "readelf -p: failed to assemble dump test file"
return
}
# Download it.
set tempfile [remote_download host tmpdir/dumptest.o]
# Run "readelf -p.data" on it.
set sect_names [get_standard_section_names]
if { $sect_names != "" } {
set got [remote_exec host "$READELF $READELFFLAGS -p[lindex $sect_names 1] $tempfile" "" "/dev/null" "readelf.out"]
} else {
set got [remote_exec host "$READELF $READELFFLAGS -p.data $tempfile" "" "/dev/null" "readelf.out"]
}
set got [lindex $got 1]
# Upload the results.
set output [remote_upload host readelf.out]
# Check for something going wrong.
if ![string match "" $got] then {
fail "readelf -p: unexpected output"
send_log $got
send_log "\n"
return
}
# Search for strings that should be in the output.
set sought {
".*test_string.*"
}
foreach looked_for $sought {
set lines [grep $output $looked_for]
if ![llength $lines] then {
fail "readelf -p: missing: $looked_for"
send_log readelf.out
return
}
}
file_on_host delete $tempfile
file_on_host delete $output
# All done.
pass "readelf -p"
# XXX FIXME: Add test of readelf -x here
}
if ![is_remote host] {
if {[which $READELF] == 0} then {
perror "$READELF does not exist"
return
}
}
send_user "Version [binutil_version $READELF]"
# Assemble the test file.
if {![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest.o]} then {
perror "could not assemble test file"
unresolved "readelf - failed to assemble"
return
}
if ![is_remote host] {
set tempfile tmpdir/bintest.o
} else {
set tempfile [remote_download host tmpdir/bintest.o]
}
# First, determine the size, so specific output matchers can be used.
readelf_find_size $tempfile
# Run the tests.
readelf_test -h $tempfile readelf.h {}
readelf_test -S $tempfile readelf.s {}
setup_xfail "mips-*-*irix*"
readelf_test -s $tempfile readelf.ss {}
readelf_test -r $tempfile readelf.r {}
readelf_wi_test
readelf_compressed_wa_test
readelf_dump_test
# PR 13482 - Check for off-by-one errors when dumping .note sections.
if {![binutils_assemble $srcdir/$subdir/version.s tmpdir/version.o]} then {
perror "could not assemble version note test file"
unresolved "readelf - failed to assemble"
fail "readelf -n"
} else {
if ![is_remote host] {
set tempfile tmpdir/version.o
} else {
set tempfile [remote_download host tmpdir/version.o]
}
readelf_test -n $tempfile readelf.n {}
}
# PR 18374 - Check that relocations against the .debug_loc section
# do not prevent readelf from displaying all the location lists.
if {![binutils_assemble $srcdir/$subdir/pr18374.s tmpdir/pr18374.o]} then {
perror "could not assemble PR18374 test file"
unresolved "readelf - failed to assemble"
fail "readelf --debug-loc"
} else {
if ![is_remote host] {
set tempfile tmpdir/pr18374.o
} else {
set tempfile [remote_download host tmpdir/pr18374.o]
}
readelf_test --debug-dump=loc $tempfile readelf.pr18374 {}
}
# Check that decompressed dumps work.
if {![binutils_assemble $srcdir/$subdir/z.s tmpdir/z.o]} then {
perror "could not assemble decompress dump test file"
unresolved "readelf - failed to assemble"
fail "readelf -z"
} else {
if ![is_remote host] {
set tempfile tmpdir/z.o
} else {
set tempfile [remote_download host tmpdir/z.o]
}
readelf_test {--decompress --hex-dump .debug_loc} $tempfile readelf.z {}
}