binutils testsuite strip-13 test
The strip-13 test runs into difficulty using dc.a on some targets. dc.a writes a power of 2 number of bytes large enough to contain a target address. On some targets, eg. avr-elf, this can be 2 bytes but the ELF format used require words of 4 bytes to make up a relocation entry. There was a hack in the test, duplicating the reloc type into what is normally the addend to make the test work when little-endian, but that hack fails for similar big-endian targets. This patch fixes that problem by arranging to emit 32-bit and 64-bit ELF relocs using .4byte and .8byte directives, chosen as appropriate for the ELF size. I've also bumped the reloc number tested to a higher unused value, and made the number more easily parameterised by target should that be necessary in the future. Whether REL or RELA relocs are used is now chosen by a new is_rela readelf test of an object file, rather than by lists of targets. * testsuite/lib/binutils-common.exp (is_elf64): Use directory of input file for readelf.out. (is_rela): New proc. * testsuite/binutils-all/objcopy.exp (elf64): Set new variable from first result of is_elf64 test. (reloc_format): Set using is_rela. (strip-13): Pass RELOC and ELF64 to assembler. (strip-14, strip-15): Use elf64 rather than calling is_elf64 again. * testsuite/binutils-all/strip-13.d: Run for more targets. * testsuite/binutils-all/strip-13mips64.s: Use RELOC and set addend to zero. * testsuite/binutils-all/strip-13rel.s: Use RELOC and ELF64. Don't add _NONE reloc. * testsuite/binutils-all/strip-13rela.s: Likewise.
This commit is contained in:
parent
503c367dc2
commit
506b86a4f5
|
@ -1,3 +1,20 @@
|
|||
2018-08-18 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* testsuite/lib/binutils-common.exp (is_elf64): Use directory of
|
||||
input file for readelf.out.
|
||||
(is_rela): New proc.
|
||||
* testsuite/binutils-all/objcopy.exp (elf64): Set new variable
|
||||
from first result of is_elf64 test.
|
||||
(reloc_format): Set using is_rela.
|
||||
(strip-13): Pass RELOC and ELF64 to assembler.
|
||||
(strip-14, strip-15): Use elf64 rather than calling is_elf64 again.
|
||||
* testsuite/binutils-all/strip-13.d: Run for more targets.
|
||||
* testsuite/binutils-all/strip-13mips64.s: Use RELOC and set
|
||||
addend to zero.
|
||||
* testsuite/binutils-all/strip-13rel.s: Use RELOC and ELF64.
|
||||
Don't add _NONE reloc.
|
||||
* testsuite/binutils-all/strip-13rela.s: Likewise.
|
||||
|
||||
2018-08-10 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR binutils/23494
|
||||
|
|
|
@ -1033,6 +1033,7 @@ if { ([istarget "ia64-*-elf*"]
|
|||
}
|
||||
|
||||
# ELF specific tests
|
||||
set elf64 ""
|
||||
if [is_elf_format] {
|
||||
objcopy_test_symbol_manipulation
|
||||
objcopy_test_elf_common_symbols
|
||||
|
@ -1049,7 +1050,9 @@ if [is_elf_format] {
|
|||
run_dump_test "group-7c"
|
||||
run_dump_test "copy-1"
|
||||
run_dump_test "note-1"
|
||||
# Use bintest.o from the note-1 test to determine ELF32 or ELF64
|
||||
if [is_elf64 tmpdir/bintest.o] {
|
||||
set elf64 "--defsym ELF64=1"
|
||||
run_dump_test "note-2-64"
|
||||
run_dump_test "note-3-64"
|
||||
run_dump_test "note-4-64"
|
||||
|
@ -1064,6 +1067,11 @@ if [is_elf_format] {
|
|||
run_dump_test "copy-2"
|
||||
run_dump_test "copy-3"
|
||||
run_dump_test "copy-4"
|
||||
# Use bintest.o from the copy-4 test to determine ELF reloc type
|
||||
set reloc_format rel
|
||||
if { [is_elf_format] && [is_rela tmpdir/bintest.o] } {
|
||||
set reloc_format rela
|
||||
}
|
||||
run_dump_test "pr19020a"
|
||||
run_dump_test "pr19020b"
|
||||
|
||||
|
@ -1081,27 +1089,12 @@ if [is_elf_format] {
|
|||
|
||||
if { [istarget "mips64*-*-openbsd*"] } {
|
||||
set reloc_format mips64
|
||||
} elseif { ([istarget "arm*-*"] \
|
||||
&& ![istarget "*-*-vxworks"] \
|
||||
&& ![istarget "*-*-windiss"]) \
|
||||
|| [istarget "d10v-*"] \
|
||||
|| [istarget "dlx-*"] \
|
||||
|| [istarget "i*86-*"] \
|
||||
|| [istarget "m681*-*"] \
|
||||
|| [istarget "m68hc1*-*"] \
|
||||
|| ([istarget "mips*-*"] \
|
||||
&& ![istarget "mips64*-ps2-elf*"] \
|
||||
&& ![istarget "*-*-irix6*"] \
|
||||
&& ![istarget "mips64*-*-freebsd*"] \
|
||||
&& ![istarget "mips64*-*-kfreebsd*-gnu"] \
|
||||
&& ![istarget "mips64*-*-linux*"]) \
|
||||
|| [istarget "score*-*"] \
|
||||
|| [istarget "xgate-*"] } {
|
||||
set reloc_format rel
|
||||
} else {
|
||||
set reloc_format rela
|
||||
}
|
||||
run_dump_test "strip-13" [list [list source strip-13${reloc_format}.s]]
|
||||
# A relocation type not supported by any target
|
||||
set reloc 215
|
||||
run_dump_test "strip-13" [list \
|
||||
[list source strip-13${reloc_format}.s] \
|
||||
[list as "${elf64} --defsym RELOC=${reloc}"]]
|
||||
# Select a relocation number that corresponds to one actually
|
||||
# supported by the target and ABI being tested.
|
||||
if { [istarget "aarch64*-*"] } {
|
||||
|
@ -1117,15 +1110,11 @@ if [is_elf_format] {
|
|||
set reloc 1
|
||||
}
|
||||
run_dump_test "strip-14" [list \
|
||||
[list source strip-14${reloc_format}.s] \
|
||||
[list as "--defsym RELOC=${reloc}"] \
|
||||
[list as [expr {[is_elf64 tmpdir/bintest.o] \
|
||||
? "--defsym ELF64=1" : ""}]]]
|
||||
[list source strip-14${reloc_format}.s] \
|
||||
[list as "${elf64} --defsym RELOC=${reloc}"]]
|
||||
run_dump_test "strip-15" [list \
|
||||
[list source strip-15${reloc_format}.s] \
|
||||
[list as "--defsym RELOC=${reloc}"] \
|
||||
[list as [expr {[is_elf64 tmpdir/bintest.o] \
|
||||
? "--defsym ELF64=1" : ""}]]]
|
||||
[list source strip-15${reloc_format}.s] \
|
||||
[list as "${elf64} --defsym RELOC=${reloc}"]]
|
||||
|
||||
# This requires STB_GNU_UNIQUE support with OSABI set to GNU.
|
||||
if { [supports_gnu_unique] } {
|
||||
|
|
|
@ -1,10 +1,8 @@
|
|||
#PROG: strip
|
||||
#strip: -g
|
||||
#error: \A[^\n]*: unsupported relocation type 0x8f\n
|
||||
#error: \A[^\n]*: unsupported relocation type 0x[0-9a-f]+\n
|
||||
#error: [^\n]*: bad value\Z
|
||||
#not-target: h8300-* ip2k-* m6811-* m68hc11-* rx-*
|
||||
# The H8300-*, IP2K and 68HC11 targets use 16-bit addressing, so `.dc.a'
|
||||
# does not work for manual relocation data construction.
|
||||
#not-target: rx-*
|
||||
# The RX targets do not complain about unrecognised relocs, unless they
|
||||
# are actually used
|
||||
# (which is what should really happen with the other targets...)
|
||||
|
|
|
@ -5,8 +5,8 @@ foo:
|
|||
.section .rela.text
|
||||
.dc.a 0
|
||||
.dc.l 0
|
||||
.dc.b 0, 0, 0, 0x8f
|
||||
.dc.a 0x0000008f
|
||||
.dc.b 0, 0, 0, RELOC
|
||||
.dc.a 0
|
||||
|
||||
.dc.a 0
|
||||
.dc.l 0
|
||||
|
|
|
@ -3,8 +3,10 @@ foo:
|
|||
.dc.l 0x12345678
|
||||
|
||||
.section .rel.text
|
||||
.dc.a 0
|
||||
.dc.a 0x0000008f
|
||||
|
||||
.dc.a 0
|
||||
.dc.a 0
|
||||
.ifdef ELF64
|
||||
.8byte 0
|
||||
.8byte RELOC
|
||||
.else
|
||||
.4byte 0
|
||||
.4byte RELOC
|
||||
.endif
|
||||
|
|
|
@ -3,10 +3,12 @@ foo:
|
|||
.dc.l 0x12345678
|
||||
|
||||
.section .rela.text
|
||||
.dc.a 0
|
||||
.dc.a 0x0000008f
|
||||
.dc.a 0x0000008f
|
||||
|
||||
.dc.a 0
|
||||
.dc.a 0
|
||||
.dc.a 0
|
||||
.ifdef ELF64
|
||||
.8byte 0
|
||||
.8byte RELOC
|
||||
.8byte 0
|
||||
.else
|
||||
.4byte 0
|
||||
.4byte RELOC
|
||||
.4byte 0
|
||||
.endif
|
||||
|
|
|
@ -111,15 +111,16 @@ proc is_elf64 { binary_file } {
|
|||
global READELF
|
||||
global READELFFLAGS
|
||||
|
||||
set tmpfile [file dirname $binary_file]/readelf.out
|
||||
set readelf_size ""
|
||||
catch "exec $READELF $READELFFLAGS -h $binary_file > readelf.out" got
|
||||
catch "exec $READELF $READELFFLAGS -h $binary_file > $tmpfile" got
|
||||
|
||||
if ![string match "" $got] then {
|
||||
return 0
|
||||
}
|
||||
|
||||
if { ![regexp "\n\[ \]*Class:\[ \]*ELF(\[0-9\]+)\n" \
|
||||
[file_contents readelf.out] nil readelf_size] } {
|
||||
[file_contents $tmpfile] nil readelf_size] } {
|
||||
return 0
|
||||
}
|
||||
|
||||
|
@ -130,6 +131,26 @@ proc is_elf64 { binary_file } {
|
|||
return 0
|
||||
}
|
||||
|
||||
# True if the object format is known to use RELA relocations.
|
||||
#
|
||||
proc is_rela { binary_file } {
|
||||
global READELF
|
||||
global READELFFLAGS
|
||||
|
||||
set tmpfile [file dirname $binary_file]/readelf.out
|
||||
catch "exec $READELF $READELFFLAGS -S $binary_file > $tmpfile" got
|
||||
|
||||
if ![string match "" $got] then {
|
||||
return 0
|
||||
}
|
||||
|
||||
if { ![regexp "RELA" [file_contents $tmpfile]] } {
|
||||
return 0
|
||||
}
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
# True if the target matches TARGET, specified as a TCL procedure if
|
||||
# in square brackets or as machine triplet otherwise.
|
||||
#
|
||||
|
|
Loading…
Reference in New Issue