Objcopy interleave fails if section address not multiple of interleave.

PR 22465
	binutils/
	* objcopy.c (copy_section): New local extra.  If isection->lma not
	exactly divisible by interleave, then bias from.  Also adjust
	osection->lma if necessary.

	ld/
	* testsuite/ld-elf/interleave-0.d, testsuite/ld-elf/interleave-4.d,
	* testsuite/ld-elf/interleave.ld, testsuite/ld-elf/interleave.s: New.
This commit is contained in:
Jim Wilson 2017-12-06 10:34:36 -08:00
parent 7cc244debb
commit 1c9c7ce078
7 changed files with 69 additions and 0 deletions

View File

@ -1,3 +1,10 @@
2017-12-06 Jim Wilson <jimw@sifive.com>
PR 22465
* objcopy.c (copy_section): New local extra. If isection->lma not
exactly divisible by interleave, then bias from. Also adjust
osection->lma if necessary.
2017-12-06 Alan Modra <amodra@gmail.com>
PR 22552

View File

@ -3898,6 +3898,15 @@ copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
char *end = (char *) memhunk + size;
int i;
/* If the section address is not exactly divisible by the interleave,
then we must bias the from address. If the copy_byte is less than
the bias, then we must skip forward one interleave, and increment
the final lma. */
int extra = isection->lma % interleave;
from -= extra;
if (copy_byte < extra)
from += interleave;
for (; from < end; from += interleave)
for (i = 0; i < copy_width; i++)
{
@ -3908,6 +3917,8 @@ copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
size = (size + interleave - 1 - copy_byte) / interleave * copy_width;
osection->lma /= interleave;
if (copy_byte < extra)
osection->lma++;
}
if (!bfd_set_section_contents (obfd, osection, memhunk, 0, size))

View File

@ -1,3 +1,8 @@
2017-12-06 Jim Wilson <jimw@sifive.com>
* testsuite/ld-elf/interleave-0.d, testsuite/ld-elf/interleave-4.d,
* testsuite/ld-elf/interleave.ld, testsuite/ld-elf/interleave.s: New.
2017-12-06 Nick Clifton <nickc@redhat.com>
* testsuite/lib/ld-lib.exp (check_shared_lib_support): Return

View File

@ -0,0 +1,9 @@
#name: --interleave test byte 0
#source: interleave.s
#ld: -Tinterleave.ld
#objcopy: --interleave=8 --interleave-width=1 --byte=0 -O verilog
@0+0
00
@0+2
14

View File

@ -0,0 +1,9 @@
#name: --interleave test byte 4
#source: interleave.s
#ld: -Tinterleave.ld
#objcopy: --interleave=8 --interleave-width=1 --byte=4 -O verilog
@0+0
04
@0+1
10

View File

@ -0,0 +1,10 @@
MEMORY
{
x0(xrw): ORIGIN = 0x0, LENGTH = 8
x1(xrw): ORIGIN = 0xC, LENGTH = 8
}
SECTIONS
{
.a0 : { *(.text.a0) } > x0
.a1 : { *(.text.a1) } > x1
}

View File

@ -0,0 +1,18 @@
.section ".text.a0"
.byte 0x00
.byte 0x01
.byte 0x02
.byte 0x03
.byte 0x04
.byte 0x05
.byte 0x06
.byte 0x07
.section ".text.a1"
.byte 0x10
.byte 0x11
.byte 0x12
.byte 0x13
.byte 0x14
.byte 0x15
.byte 0x16
.byte 0x17