Add testcase for PR 25662 invalid sh_offset for section

binutils/ChangeLog:

2020-03-27  Jozef Lawrynowicz  <jozef.l@mittosystems.com>

	PR binutils/25662
	* testsuite/binutils-all/objcopy.exp (objcopy_test): Add argument to
	specify whether an object file or executable should be built and tested.
	Change test names to report whether an object file or executable is
	being tested.
	* testsuite/binutils-all/pr25662.ld: New test.
	* testsuite/binutils-all/pr25662.s: New test.
This commit is contained in:
Jozef Lawrynowicz 2020-03-27 10:54:26 +00:00
parent 80e2a3b66e
commit 1fafefd594
4 changed files with 104 additions and 19 deletions

View File

@ -1,3 +1,13 @@
2020-03-27 Jozef Lawrynowicz <jozef.l@mittosystems.com>
PR binutils/25662
* testsuite/binutils-all/objcopy.exp (objcopy_test): Add argument to
specify whether an object file or executable should be built and tested.
Change test names to report whether an object file or executable is
being tested.
* testsuite/binutils-all/pr25662.ld: New test.
* testsuite/binutils-all/pr25662.s: New test.
2020-03-27 Alan Modra <amodra@gmail.com>
* readelf.c (process_archive): Don't double free qualified_name.

View File

@ -37,36 +37,60 @@ if ![is_remote host] {
}
# Test that objcopy does not modify a file when copying it.
# "object" or "executable" values for type are supported.
proc objcopy_test {testname srcfile} {
proc objcopy_test {testname srcfile type asflags ldflags} {
global OBJCOPY
global OBJCOPYFLAGS
global srcdir
global subdir
global tempfile
global copyfile
set t_tempfile $tempfile
set t_copyfile ${copyfile}.o
if {![binutils_assemble $srcdir/$subdir/${srcfile} $tempfile]} then {
unresolved "objcopy ($testname)"
remote_file host delete $tempfile
if { $type != "object" && $type != "executable" } {
error "objcopy_test accepts only \"object\" or \"executable\" values for type"
}
if {![binutils_assemble_flags $srcdir/$subdir/${srcfile} $t_tempfile "$asflags"]} then {
unresolved "objcopy $type ($testname)"
remote_file host delete $t_tempfile
return
}
set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS $tempfile ${copyfile}.o"]
if { $type == "executable" } {
global LD
# Check that LD exists
if {[which $LD] == 0} then {
untested "objcopy $type ($testname)"
return
}
# Use tempfile and copyfile without the .o extension for executable files
set t_tempfile [string range $tempfile 0 end-2]
set t_copyfile $copyfile
set got [binutils_run $LD "$tempfile -o $t_tempfile $ldflags"]
if { ![string equal "" $got] } then {
unresolved "objcopy $type ($testname)"
return
}
}
set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS $t_tempfile $t_copyfile"]
if ![string equal "" $got] then {
fail "objcopy ($testname)"
fail "objcopy $type ($testname)"
} else {
send_log "cmp $tempfile ${copyfile}.o\n"
verbose "cmp $tempfile ${copyfile}.o"
send_log "cmp $t_tempfile $t_copyfile\n"
verbose "cmp $t_tempfile $t_copyfile"
if [is_remote host] {
set src1 tmpdir/bintest.o
set src2 tmpdir/copy.o
remote_upload host $tempfile $src1
remote_upload host ${copyfile}.o $src2
set src1 tmpdir/bintest
set src2 tmpdir/copy
remote_upload host $t_tempfile $src1
remote_upload host $t_copyfile $src2
} else {
set src1 ${tempfile}
set src2 ${copyfile}.o
set src1 $t_tempfile
set src2 $t_copyfile
}
set status [remote_exec build cmp "${src1} ${src2}"]
set exec_output [lindex $status 1]
@ -86,7 +110,7 @@ proc objcopy_test {testname srcfile} {
clear_xfail "hppa*-*-*n*bsd*" "hppa*-*-rtems*" "*-*-*elf*"
if [string equal "" $exec_output] then {
pass "objcopy ($testname)"
pass "objcopy $type ($testname)"
} else {
send_log "$exec_output\n"
verbose "$exec_output" 1
@ -94,12 +118,12 @@ proc objcopy_test {testname srcfile} {
# On OSF/1, this succeeds with gas and fails with /bin/as.
setup_xfail "alpha*-*-osf*"
fail "objcopy ($testname)"
fail "objcopy $type ($testname)"
}
}
}
objcopy_test "simple copy" bintest.s
objcopy_test "simple copy" bintest.s object "" ""
# Test verilog data width
proc objcopy_test_verilog {testname} {
@ -1080,7 +1104,7 @@ proc objcopy_test_elf_common_symbols {} {
# ia64 specific tests
if { ([istarget "ia64-*-elf*"]
|| [istarget "ia64-*-linux*"]) } {
objcopy_test "ia64 link order" link-order.s
objcopy_test "ia64 link order" link-order.s object "" ""
}
# ELF specific tests
@ -1088,7 +1112,7 @@ set elf64 ""
if [is_elf_format] {
objcopy_test_symbol_manipulation
objcopy_test_elf_common_symbols
objcopy_test "ELF unknown section type" unknown.s
objcopy_test "ELF unknown section type" unknown.s object "" ""
objcopy_test_readelf "ELF group 1" group.s
objcopy_test_readelf "ELF group 2" group-2.s
objcopy_test_readelf "ELF group 3" group-3.s
@ -1316,3 +1340,5 @@ objcopy_remove_relocations_from_executable
run_dump_test "pr23633"
run_dump_test "set-section-alignment"
objcopy_test "pr25662" pr25662.s executable "" "-T$srcdir/$subdir/pr25662.ld"

View File

@ -0,0 +1,15 @@
ENTRY(_start)
MEMORY
{
RAM : ORIGIN = 0x0000, LENGTH = 0x0FFF
ROM : ORIGIN = 0x1000, LENGTH = 0x0FFF
}
SECTIONS
{
.data : { *(.data) } > RAM AT>ROM
.text : { *(.text) } > ROM
.bss : { *(.bss) } > RAM
}

View File

@ -0,0 +1,34 @@
/* PR 25662: objcopy sets invalid sh_offset for the first section in a
no_contents segment containing program headers.
Several conditions are required for the bug to manifest:
- The first loadable segment (which contains the program headers) must only
contain SHT_NOBITS sections. .bss is the SHT_NOBITS section in this test.
- The next loadable segment must have a !SHT_NOBITS loadable section. .data
is the !SHT_NOBITS section in this test.
- .bss must be positioned after .data in the executable file itself.
- The size of .data must be such that the calculated VMA of the .bss
section that follows it is not congruent with the file offset of .bss,
modulo the p_align of its segment, i.e.:
(VMA(.data) + sizeof(.data)) % (.bss_segment.p_align) != 0
This will force the sh_offset of .bss to be aligned so it appears within
.data.
- The size of .data must be larger than the program headers in the first
loadable segment, so that the file offset of .bss is immediately
after .data, and not padded to a valid alignment by the program headers.
The bug originally only manifested for ELF targets, but there's no reason not
to run this testcase for other file formats. */
.section .bss
a:
.zero 0x2
.section .data
c:
.zero 0x201
.section .text
.global _start
_start:
.long 0