Fix PR ld/20254

This patch fixes another edge case related to alignment property
records - reloc offsets adjacent to property record offsets were not
getting adjusted during relaxation.

bfd/

	PR ld/20254
	* elf32-avr.c (elf32_avr_relax_delete_bytes): Adjust reloc
	offsets until reloc_toaddr.

ld/

	PR ld/20254
	* testsuite/ld-avr/avr-prop-6.d: New test.
	* testsuite/ld-avr/avr-prop-6.s: New test.
This commit is contained in:
Senthil Kumar Selvaraj 2016-06-15 12:25:30 +05:30
parent 2a1d8bb347
commit 31eef93e71
5 changed files with 48 additions and 2 deletions

View file

@ -1,3 +1,9 @@
2016-06-14 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com>
PR ld/20254
* elf32-avr.c (elf32_avr_relax_delete_bytes): Adjust reloc
offsets until reloc_toaddr.
2016-06-14 H.J. Lu <hongjiu.lu@intel.com>
* elf32-i386.c (elf_i386_reloc_type_class): Check R_386_IRELATIVE.

View file

@ -1822,7 +1822,7 @@ elf32_avr_relax_delete_bytes (bfd *abfd,
Elf_Internal_Rela *irel, *irelend;
Elf_Internal_Sym *isym;
Elf_Internal_Sym *isymbuf = NULL;
bfd_vma toaddr;
bfd_vma toaddr, reloc_toaddr;
struct elf_link_hash_entry **sym_hashes;
struct elf_link_hash_entry **end_hashes;
unsigned int symcount;
@ -1859,6 +1859,17 @@ elf32_avr_relax_delete_bytes (bfd *abfd,
}
}
/* We need to look at all relocs with offsets less than toaddr. prop
records handling adjusts toaddr downwards to avoid moving syms at the
address of the property record, but all relocs with offsets between addr
and the current value of toaddr need to have their offsets adjusted.
Assume addr = 0, toaddr = 4 and count = 2. After prop records handling,
toaddr becomes 2, but relocs with offsets 2 and 3 still need to be
adjusted (to 0 and 1 respectively), as the first 2 bytes are now gone.
So record the current value of toaddr here, and use it when adjusting
reloc offsets. */
reloc_toaddr = toaddr;
irel = elf_section_data (sec)->relocs;
irelend = irel + sec->reloc_count;
@ -1917,7 +1928,7 @@ elf32_avr_relax_delete_bytes (bfd *abfd,
/* Get the new reloc address. */
if ((irel->r_offset > addr
&& irel->r_offset < toaddr))
&& irel->r_offset < reloc_toaddr))
{
if (debug_relax)
printf ("Relocation at address 0x%x needs to be moved.\n"

View file

@ -1,3 +1,9 @@
2016-06-14 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com>
PR ld/20254
* testsuite/ld-avr/avr-prop-6.d: New test.
* testsuite/ld-avr/avr-prop-6.s: New test.
2016-06-14 Alan Modra <amodra@gmail.com>
* ldbuildid.c: Formatting.

View file

@ -0,0 +1,14 @@
#name: AVR .avr.prop, single .align sym at end of section test.
#as: -mavrxmega2 -mlink-relax
#ld: -mavrxmega2 --relax
#source: avr-prop-6.s
#objdump: -S
#target: avr-*-*
#...
0: 00 c0 rjmp .+0 ; 0x2 <dest>
00000002 <dest>:
2: 00 00 nop
4: fe cf rjmp .-4 ; 0x2 <dest>
#...

View file

@ -0,0 +1,9 @@
.text
.global _start, dest
_start:
jmp dest
.align 1
dest:
nop
rjmp dest