aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Burgess <andrew.burgess@embecosm.com>2014-10-25 15:08:14 +0100
committerAndrew Burgess <andrew.burgess@embecosm.com>2014-11-03 20:33:25 +0000
commita12d0ffc72ee57f8db8b466fd9032360d8d15e09 (patch)
treec682547453aa205443b545869433b6f9b3abbdef
parent5a3f568b70bdfb91aacdfb66657b56d8c6d242f1 (diff)
downloadgdb-a12d0ffc72ee57f8db8b466fd9032360d8d15e09.zip
gdb-a12d0ffc72ee57f8db8b466fd9032360d8d15e09.tar.gz
gdb-a12d0ffc72ee57f8db8b466fd9032360d8d15e09.tar.bz2
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.
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/elf32-avr.c4
-rw-r--r--ld/ChangeLog7
-rw-r--r--ld/testsuite/ld-avr/relax-02.d64
-rw-r--r--ld/testsuite/ld-avr/relax-02.s65
-rw-r--r--ld/testsuite/ld-avr/relax-03.d26
-rw-r--r--ld/testsuite/ld-avr/relax-03.s18
7 files changed, 187 insertions, 2 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 591ff95..0da08bb 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,8 @@
+2014-11-03 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * elf32-avr.c (elf32_avr_relax_delete_bytes): Modify symbols
+ located at the very end of the section.
+
2014-11-03 Nick Clifton <nickc@redhat.com>
PR binutils/17512
diff --git a/bfd/elf32-avr.c b/bfd/elf32-avr.c
index 54d67bf..8498d29 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 014ac2b..86258cb 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,10 @@
+2014-11-03 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * 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 <nickc@redhat.com>
* 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 0000000..6445709
--- /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 <func_1>:
+ a: 00 00 nop
+ c: 00 00 nop
+ e: 00 00 nop
+ 10: 00 00 nop
+ 12: 00 00 nop
+
+00000014 <func_2>:
+ 14: 00 00 nop
+ 16: 08 c0 rjmp \.\+16 ; 0x28 <dest>
+ 18: 07 c0 rjmp \.\+14 ; 0x28 <dest>
+ 1a: 06 c0 rjmp \.\+12 ; 0x28 <dest>
+ 1c: 00 00 nop
+
+0000001e <func_3>:
+ 1e: 00 00 nop
+ 20: 00 00 nop
+ 22: 00 00 nop
+ 24: 00 00 nop
+ 26: 00 00 nop
+
+00000028 <dest>:
+ 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 0000000..57fb7f6
--- /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 0000000..a538c04
--- /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 0000000..0993502
--- /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: