mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-07-31 22:04:12 +08:00
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:
@ -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>
|
2016-06-14 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
* elf32-i386.c (elf_i386_reloc_type_class): Check R_386_IRELATIVE.
|
* elf32-i386.c (elf_i386_reloc_type_class): Check R_386_IRELATIVE.
|
||||||
|
@ -1822,7 +1822,7 @@ elf32_avr_relax_delete_bytes (bfd *abfd,
|
|||||||
Elf_Internal_Rela *irel, *irelend;
|
Elf_Internal_Rela *irel, *irelend;
|
||||||
Elf_Internal_Sym *isym;
|
Elf_Internal_Sym *isym;
|
||||||
Elf_Internal_Sym *isymbuf = NULL;
|
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 **sym_hashes;
|
||||||
struct elf_link_hash_entry **end_hashes;
|
struct elf_link_hash_entry **end_hashes;
|
||||||
unsigned int symcount;
|
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;
|
irel = elf_section_data (sec)->relocs;
|
||||||
irelend = irel + sec->reloc_count;
|
irelend = irel + sec->reloc_count;
|
||||||
|
|
||||||
@ -1917,7 +1928,7 @@ elf32_avr_relax_delete_bytes (bfd *abfd,
|
|||||||
|
|
||||||
/* Get the new reloc address. */
|
/* Get the new reloc address. */
|
||||||
if ((irel->r_offset > addr
|
if ((irel->r_offset > addr
|
||||||
&& irel->r_offset < toaddr))
|
&& irel->r_offset < reloc_toaddr))
|
||||||
{
|
{
|
||||||
if (debug_relax)
|
if (debug_relax)
|
||||||
printf ("Relocation at address 0x%x needs to be moved.\n"
|
printf ("Relocation at address 0x%x needs to be moved.\n"
|
||||||
|
@ -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>
|
2016-06-14 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
* ldbuildid.c: Formatting.
|
* ldbuildid.c: Formatting.
|
||||||
|
14
ld/testsuite/ld-avr/avr-prop-6.d
Normal file
14
ld/testsuite/ld-avr/avr-prop-6.d
Normal 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>
|
||||||
|
#...
|
9
ld/testsuite/ld-avr/avr-prop-6.s
Normal file
9
ld/testsuite/ld-avr/avr-prop-6.s
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
.text
|
||||||
|
.global _start, dest
|
||||||
|
_start:
|
||||||
|
jmp dest
|
||||||
|
.align 1
|
||||||
|
dest:
|
||||||
|
nop
|
||||||
|
rjmp dest
|
||||||
|
|
Reference in New Issue
Block a user