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.
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;
+ }
+ }
}
}
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;
+ }
}
}
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.
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
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
#...