From a12d0ffc72ee57f8db8b466fd9032360d8d15e09 Mon Sep 17 00:00:00 2001 From: Andrew Burgess Date: Sat, 25 Oct 2014 15:08:14 +0100 Subject: [PATCH] When relaxing, update symbols at the very end of the section. Symbols at the very end of a section were not being updated correctly when linker relaxation takes place due to the use of '<' instead of '<='. Added a couple of tests to cover this behaviour. bfd/ChangeLog: * elf32-avr.c (elf32_avr_relax_delete_bytes): Modify symbols located at the very end of the section. ld/ChangeLog: * ld/testsuite/ld-avr/relax-02.d: New file. * ld/testsuite/ld-avr/relax-02.s: New file. * ld/testsuite/ld-avr/relax-03.d: New file. * ld/testsuite/ld-avr/relax-03.s: New file. --- bfd/ChangeLog | 5 +++ bfd/elf32-avr.c | 4 +-- ld/ChangeLog | 7 ++++ ld/testsuite/ld-avr/relax-02.d | 64 +++++++++++++++++++++++++++++++++ ld/testsuite/ld-avr/relax-02.s | 65 ++++++++++++++++++++++++++++++++++ ld/testsuite/ld-avr/relax-03.d | 26 ++++++++++++++ ld/testsuite/ld-avr/relax-03.s | 18 ++++++++++ 7 files changed, 187 insertions(+), 2 deletions(-) create mode 100644 ld/testsuite/ld-avr/relax-02.d create mode 100644 ld/testsuite/ld-avr/relax-02.s create mode 100644 ld/testsuite/ld-avr/relax-03.d create mode 100644 ld/testsuite/ld-avr/relax-03.s diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 591ff959e74..0da08bb0d69 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2014-11-03 Andrew Burgess + + * elf32-avr.c (elf32_avr_relax_delete_bytes): Modify symbols + located at the very end of the section. + 2014-11-03 Nick Clifton PR binutils/17512 diff --git a/bfd/elf32-avr.c b/bfd/elf32-avr.c index 54d67bf0403..8498d29493e 100644 --- a/bfd/elf32-avr.c +++ b/bfd/elf32-avr.c @@ -1883,7 +1883,7 @@ elf32_avr_relax_delete_bytes (bfd *abfd, { if (isym->st_shndx == sec_shndx && isym->st_value > addr - && isym->st_value < toaddr) + && isym->st_value <= toaddr) isym->st_value -= count; } } @@ -1900,7 +1900,7 @@ elf32_avr_relax_delete_bytes (bfd *abfd, || sym_hash->root.type == bfd_link_hash_defweak) && sym_hash->root.u.def.section == sec && sym_hash->root.u.def.value > addr - && sym_hash->root.u.def.value < toaddr) + && sym_hash->root.u.def.value <= toaddr) { sym_hash->root.u.def.value -= count; } diff --git a/ld/ChangeLog b/ld/ChangeLog index 014ac2b9ac3..86258cb316f 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,10 @@ +2014-11-03 Andrew Burgess + + * testsuite/ld-avr/relax-02.d: New file. + * testsuite/ld-avr/relax-02.s: New file. + * testsuite/ld-avr/relax-03.d: New file. + * testsuite/ld-avr/relax-03.s: New file. + 2014-10-29 Nick Clifton * po/bg.po: Updated Bulgarian translation. diff --git a/ld/testsuite/ld-avr/relax-02.d b/ld/testsuite/ld-avr/relax-02.d new file mode 100644 index 00000000000..64457098b03 --- /dev/null +++ b/ld/testsuite/ld-avr/relax-02.d @@ -0,0 +1,64 @@ +#name: AVR relaxation, symbol at end of section. +#as: -mmcu=avrxmega2 -mlink-relax +#ld: -mavrxmega2 --relax +#source: relax-02.s +#objdump: -tzd +#target: avr-*-* + +.*: file format elf32-avr + +SYMBOL TABLE: +#... +00000000 l F \.text [0-9a-f]+ local_start +0000000a l F \.text [0-9a-f]+ local_func_1 +00000014 l F \.text [0-9a-f]+ local_func_2 +0000001e l F \.text [0-9a-f]+ local_func_3 +00000032 l \.text 00000000 local_end_label +00000028 g \.text 00000000 dest +#... +00000014 g F \.text [0-9a-f]+ func_2 +#... +00000000 g F \.text [0-9a-f]+ _start +00000032 g \.text 00000000 end_label +0000000a g F \.text [0-9a-f]+ func_1 +#... +0000001e g F \.text [0-9a-f]+ func_3 + + + +Disassembly of section \.text: + +00000000 <_start>: + 0: 00 00 nop + 2: 00 00 nop + 4: 00 00 nop + 6: 00 00 nop + 8: 00 00 nop + +0000000a : + a: 00 00 nop + c: 00 00 nop + e: 00 00 nop + 10: 00 00 nop + 12: 00 00 nop + +00000014 : + 14: 00 00 nop + 16: 08 c0 rjmp \.\+16 ; 0x28 + 18: 07 c0 rjmp \.\+14 ; 0x28 + 1a: 06 c0 rjmp \.\+12 ; 0x28 + 1c: 00 00 nop + +0000001e : + 1e: 00 00 nop + 20: 00 00 nop + 22: 00 00 nop + 24: 00 00 nop + 26: 00 00 nop + +00000028 : + 28: 00 00 nop + 2a: 00 00 nop + 2c: 00 00 nop + 2e: 00 00 nop + 30: 00 00 nop diff --git a/ld/testsuite/ld-avr/relax-02.s b/ld/testsuite/ld-avr/relax-02.s new file mode 100644 index 00000000000..57fb7f6e07c --- /dev/null +++ b/ld/testsuite/ld-avr/relax-02.s @@ -0,0 +1,65 @@ + .section ".text", "ax",@progbits + .global _start, dest, end_label + .global func_1, func_2, func_3 + +_start: +local_start: + nop + nop + nop + nop + nop + .type _start, @function + .size _start, .-_start + + .type local_start, @function + .size local_start, .-local_start + +func_1: +local_func_1: + nop + nop + nop + nop + nop + .type func_1, @function + .size func_1, .-func_1 + + .type local_func_1, @function + .size local_func_1, .-local_func_1 + +func_2: +local_func_2: + nop + jmp dest + jmp dest + jmp dest + nop + .type func_2, @function + .size func_2, .-func_2 + + .type local_func_2, @function + .size local_func_2, .-local_func_2 + +func_3: +local_func_3: + nop + nop + nop + nop + nop + .type func_3, @function + .size func_3, .-func_3 + + .type local_func_3, @function + .size local_func_3, .-local_func_3 + +dest: + nop + nop + nop + nop + nop + +end_label: +local_end_label: diff --git a/ld/testsuite/ld-avr/relax-03.d b/ld/testsuite/ld-avr/relax-03.d new file mode 100644 index 00000000000..a538c0459ad --- /dev/null +++ b/ld/testsuite/ld-avr/relax-03.d @@ -0,0 +1,26 @@ +#name: AVR relaxation, single function in section. +#as: -mmcu=avrxmega2 -mlink-relax +#ld: -mavrxmega2 --relax +#source: relax-03.s +#objdump: -tzd +#target: avr-*-* + +.*: file format elf32-avr + +SYMBOL TABLE: +#... +00000000 l F .text [0-9a-f]+ local_start +0000000a l .text 00000000 local_end_label +#... +00000000 g F \.text [0-9a-f]+ _start +0000000a g \.text 00000000 end_label +#... + +Disassembly of section \.text: + +00000000 <_start>: + 0: 00 00 nop + 2: 03 c0 rjmp \.\+6 ; 0xa <.*> + 4: 02 c0 rjmp \.\+4 ; 0xa <.*> + 6: 01 c0 rjmp \.\+2 ; 0xa <.*> + 8: 00 00 nop diff --git a/ld/testsuite/ld-avr/relax-03.s b/ld/testsuite/ld-avr/relax-03.s new file mode 100644 index 00000000000..099350253cc --- /dev/null +++ b/ld/testsuite/ld-avr/relax-03.s @@ -0,0 +1,18 @@ + .section ".text", "ax",@progbits + .global _start, end_label + +_start: +local_start: + nop + jmp end_label + jmp end_label + jmp end_label + nop + .type _start, @function + .size _start, .-_start + + .type local_start, @function + .size local_start, .-local_start + +end_label: +local_end_label: -- 2.30.2