From c02f8be2954edd950382a8c028ef9e40c5bb6069 Mon Sep 17 00:00:00 2001 From: Hans-Peter Nilsson Date: Wed, 14 Jun 2000 01:21:35 +0000 Subject: [PATCH] * binutils-all/readelf.exp (regexp_diff): Do not break when a mismatching line is found. (readelf_find_size): New. (readelf_size): New global variable. (readelf_test): Add newline to send_log of command. If $srcdir/$subdir/$regexp_file-$readelf_size exists, use it instead of $srcdir/$subdir/$regexp_file. (*-*elf test): Fix typo in message. * binutils-all/readelf.s-64: New. * binutils-all/readelf.ss-64: New. --- binutils/testsuite/ChangeLog | 13 +++++++ binutils/testsuite/binutils-all/readelf.exp | 50 +++++++++++++++++++++++---- binutils/testsuite/binutils-all/readelf.s-64 | 24 +++++++++++++ binutils/testsuite/binutils-all/readelf.ss-64 | 13 +++++++ 4 files changed, 94 insertions(+), 6 deletions(-) create mode 100644 binutils/testsuite/binutils-all/readelf.s-64 create mode 100644 binutils/testsuite/binutils-all/readelf.ss-64 diff --git a/binutils/testsuite/ChangeLog b/binutils/testsuite/ChangeLog index e68494e42..d51de5514 100644 --- a/binutils/testsuite/ChangeLog +++ b/binutils/testsuite/ChangeLog @@ -1,3 +1,16 @@ +2000-06-14 Hans-Peter Nilsson + + * binutils-all/readelf.exp (regexp_diff): Do not break when a + mismatching line is found. + (readelf_find_size): New. + (readelf_size): New global variable. + (readelf_test): Add newline to send_log of command. + If $srcdir/$subdir/$regexp_file-$readelf_size exists, use it + instead of $srcdir/$subdir/$regexp_file. + (*-*elf test): Fix typo in message. + * binutils-all/readelf.s-64: New. + * binutils-all/readelf.ss-64: New. + 2000-05-02 Alan Modra * binutils-all/objcopy.exp (simple copy): Clear xfail for hppa-linux. diff --git a/binutils/testsuite/binutils-all/readelf.exp b/binutils/testsuite/binutils-all/readelf.exp index 12fcdad92..46a837cc0 100644 --- a/binutils/testsuite/binutils-all/readelf.exp +++ b/binutils/testsuite/binutils-all/readelf.exp @@ -1,4 +1,4 @@ -# Copyright (C) 1999 Free Software Foundation, Inc. +# Copyright (C) 1999, 2000 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 @@ -103,7 +103,6 @@ proc regexp_diff { file_1 file_2 } { send_log "regexp_diff match failure\n" send_log "regexp \"^$line_b$\"\nline \"$line_a\"\n" set differences 1 - break } } } @@ -120,19 +119,51 @@ proc regexp_diff { file_1 file_2 } { return $differences } +# 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" + catch "exec $READELF $READELFFLAGS -h $binary_file > readelf.out" got + + if ![string match "" $got] 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. +# 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" + send_log "exec $READELF $READELFFLAGS $options $binary_file > readelf.out\n" catch "exec $READELF $READELFFLAGS $options $binary_file > readelf.out" got if { [llength $xfails] != 0 } then { @@ -145,6 +176,10 @@ proc readelf_test { options binary_file regexp_file xfails } { return } + if { [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 @@ -161,7 +196,7 @@ proc readelf_test { options binary_file regexp_file xfails } { # in the target string, then the target is not an ELF based port. if ![istarget "*-*elf"] then { - verbose "$READELF is only intenteded for ELF targets" 2 + verbose "$READELF is only intended for ELF targets" 2 return } @@ -187,7 +222,10 @@ if ![is_remote host] { set tempfile [remote_download host tmpdir/bintest.o] } -# Run the tests +# First, determine the size, so specific output matchers can be used. +readelf_find_size $tempfile + +# Run the tests. readelf_test -h $tempfile readelf.h {} # The v850 fails the next two tests because it creates two special diff --git a/binutils/testsuite/binutils-all/readelf.s-64 b/binutils/testsuite/binutils-all/readelf.s-64 new file mode 100644 index 000000000..a748c161e --- /dev/null +++ b/binutils/testsuite/binutils-all/readelf.s-64 @@ -0,0 +1,24 @@ +There are .* section headers, starting at offset .*: + +Section Headers: + \[Nr\] Name Type Address Offset + Size EntSize Flags Link Info Align + \[ 0\] NULL 0000000000000000 00000000 + 0000000000000000 0000000000000000 0 0 0 + \[ 1\] .text PROGBITS 0000000000000000 00000040 + 00000000000000.. 0000000000000000 AX 0 0 .* + \[ 2\] .rel.+text +REL. +0+ 0+.* + 000000000000001. 000000000000001. . 1 8 + \[ 3\] .data PROGBITS 0000000000000000 000000[45][08] + 0000000000000004 0000000000000000 WA 0 0 .* + \[ 4\] .bss NOBITS 0000000000000000 000000[45][c4] + 0000000000000000 0000000000000000 WA 0 0 .* + \[ 5\] .shstrtab STRTAB 0000000000000000 000000[45][c4] + 00000000000000.. 0000000000000000 0 0 .* + \[ 6\] .symtab SYMTAB 0000000000000000 0+.* + 0+.* 0000000000000018 7 6 8 + \[ 7\] .strtab STRTAB 0000000000000000 0+.* + 0+.* 0000000000000000 0 0 1 +Key to Flags: W \(write\), A \(alloc\), X \(execute\), M \(merge\), S \(strings\) + I \(info\), L \(link order\), O \(extra OS processing required\) + o \(os specific\), p \(processor specific\) x \(unknown\) diff --git a/binutils/testsuite/binutils-all/readelf.ss-64 b/binutils/testsuite/binutils-all/readelf.ss-64 new file mode 100644 index 000000000..b29276d47 --- /dev/null +++ b/binutils/testsuite/binutils-all/readelf.ss-64 @@ -0,0 +1,13 @@ + +Symbol table '.symtab' contains .* entries: + Num: Value Size Type Bind Vis Ndx Name + 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND + 1: 0000000000000000 0 SECTION LOCAL DEFAULT 1 + 2: 0000000000000000 0 SECTION LOCAL DEFAULT 3 + 3: 0000000000000000 0 SECTION LOCAL DEFAULT 4 + 4: 0000000000000000 0 NOTYPE LOCAL DEFAULT 1 static_text_symbol + 5: 0000000000000000 0 NOTYPE LOCAL DEFAULT 3 static_data_symbol +.* .: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 1 text_symbol + .: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND external_symbol + .: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 3 data_symbol + .: 0000000000000004 4 OBJECT GLOBAL DEFAULT COM common_symbol -- 2.11.4.GIT