When relaxing, update symbols at the very end of the section.
authorAndrew Burgess <andrew.burgess@embecosm.com>
Sat, 25 Oct 2014 14:08:14 +0000 (15:08 +0100)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Mon, 3 Nov 2014 20:33:25 +0000 (20:33 +0000)
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
bfd/elf32-avr.c
ld/ChangeLog
ld/testsuite/ld-avr/relax-02.d [new file with mode: 0644]
ld/testsuite/ld-avr/relax-02.s [new file with mode: 0644]
ld/testsuite/ld-avr/relax-03.d [new file with mode: 0644]
ld/testsuite/ld-avr/relax-03.s [new file with mode: 0644]

index 591ff959e7416ea61f6413f75d84b6a59ea89180..0da08bb0d698c1776de5a454ca568289bc166d8a 100644 (file)
@@ -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
index 54d67bf04031ada4602f3ab496efeedf63ada62d..8498d29493e80b7167a59404b42e8e0d306d98d9 100644 (file)
@@ -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;
         }
index 014ac2b9ac3ff2a9021e0b96bcdcf04c0387af67..86258cb316fc51cecf6e2effec2c0cffd5b49a65 100644 (file)
@@ -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 (file)
index 0000000..6445709
--- /dev/null
@@ -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 (file)
index 0000000..57fb7f6
--- /dev/null
@@ -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 (file)
index 0000000..a538c04
--- /dev/null
@@ -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 (file)
index 0000000..0993502
--- /dev/null
@@ -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: