aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog6
-rw-r--r--bfd/elf32-avr.c39
-rw-r--r--ld/ChangeLog6
-rw-r--r--ld/testsuite/ld-avr/relax-02.d16
-rw-r--r--ld/testsuite/ld-avr/relax-03.d4
5 files changed, 53 insertions, 18 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 0da08bb..0222d32 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,11 @@
2014-11-03 Andrew Burgess <andrew.burgess@embecosm.com>
+ * elf32-avr.c (elf32_avr_relax_delete_bytes): During linker
+ relaxation, reduce the size of symbols that span the deleted
+ bytes.
+
+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.
diff --git a/bfd/elf32-avr.c b/bfd/elf32-avr.c
index 8498d29..5aa3cf6 100644
--- a/bfd/elf32-avr.c
+++ b/bfd/elf32-avr.c
@@ -1881,10 +1881,22 @@ elf32_avr_relax_delete_bytes (bfd *abfd,
isymend = isym + symtab_hdr->sh_info;
for (; isym < isymend; isym++)
{
- if (isym->st_shndx == sec_shndx
- && isym->st_value > addr
- && isym->st_value <= toaddr)
- isym->st_value -= count;
+ if (isym->st_shndx == sec_shndx)
+ {
+ if (isym->st_value > addr
+ && isym->st_value <= toaddr)
+ isym->st_value -= count;
+
+ if (isym->st_value <= addr
+ && isym->st_value + isym->st_size > addr)
+ {
+ /* If this assert fires then we have a symbol that ends
+ part way through an instruction. Does that make
+ sense? */
+ BFD_ASSERT (isym->st_value + isym->st_size >= addr + count);
+ isym->st_size -= count;
+ }
+ }
}
}
@@ -1898,11 +1910,22 @@ elf32_avr_relax_delete_bytes (bfd *abfd,
struct elf_link_hash_entry *sym_hash = *sym_hashes;
if ((sym_hash->root.type == bfd_link_hash_defined
|| 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.section == sec)
{
- sym_hash->root.u.def.value -= count;
+ if (sym_hash->root.u.def.value > addr
+ && sym_hash->root.u.def.value <= toaddr)
+ sym_hash->root.u.def.value -= count;
+
+ if (sym_hash->root.u.def.value <= addr
+ && (sym_hash->root.u.def.value + sym_hash->size > addr))
+ {
+ /* If this assert fires then we have a symbol that ends
+ part way through an instruction. Does that make
+ sense? */
+ BFD_ASSERT (sym_hash->root.u.def.value + sym_hash->size
+ >= addr + count);
+ sym_hash->size -= count;
+ }
}
}
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 86258cb..56b9bd8 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,5 +1,11 @@
2014-11-03 Andrew Burgess <andrew.burgess@embecosm.com>
+ * testsuite/ld-avr/relax-02.d: Update to check size of symbols has
+ changed.
+ * testsuite/ld-avr/relax-03.d: Likewise.
+
+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.
diff --git a/ld/testsuite/ld-avr/relax-02.d b/ld/testsuite/ld-avr/relax-02.d
index 6445709..c8d9b10 100644
--- a/ld/testsuite/ld-avr/relax-02.d
+++ b/ld/testsuite/ld-avr/relax-02.d
@@ -9,20 +9,20 @@
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
+00000000 l F \.text 0000000a local_start
+0000000a l F \.text 0000000a local_func_1
+00000014 l F \.text 0000000a local_func_2
+0000001e l F \.text 0000000a local_func_3
00000032 l \.text 00000000 local_end_label
00000028 g \.text 00000000 dest
#...
-00000014 g F \.text [0-9a-f]+ func_2
+00000014 g F \.text 0000000a func_2
#...
-00000000 g F \.text [0-9a-f]+ _start
+00000000 g F \.text 0000000a _start
00000032 g \.text 00000000 end_label
-0000000a g F \.text [0-9a-f]+ func_1
+0000000a g F \.text 0000000a func_1
#...
-0000001e g F \.text [0-9a-f]+ func_3
+0000001e g F \.text 0000000a func_3
diff --git a/ld/testsuite/ld-avr/relax-03.d b/ld/testsuite/ld-avr/relax-03.d
index a538c04..3adc279 100644
--- a/ld/testsuite/ld-avr/relax-03.d
+++ b/ld/testsuite/ld-avr/relax-03.d
@@ -9,10 +9,10 @@
SYMBOL TABLE:
#...
-00000000 l F .text [0-9a-f]+ local_start
+00000000 l F .text 0000000a local_start
0000000a l .text 00000000 local_end_label
#...
-00000000 g F \.text [0-9a-f]+ _start
+00000000 g F \.text 0000000a _start
0000000a g \.text 00000000 end_label
#...