When relaxing, update size of symbols.

When performing linker relaxation, reduce the size of symbols that span
the deleted bytes.  This ensures that, for example, function symbols
will have the correct size.

bfd/ChangeLog:

	* elf32-avr.c (elf32_avr_relax_delete_bytes): During linker
	relaxation, reduce the size of symbols that span the deleted
	bytes.

ld/ChangeLog:

	* testsuite/ld-avr/relax-02.d: Update to check size of symbols has
	changed.
	* testsuite/ld-avr/relax-03.d: Likewise.
This commit is contained in:
Andrew Burgess 2014-10-27 10:45:18 +00:00
parent a12d0ffc72
commit 931b79ccd6
5 changed files with 53 additions and 18 deletions

View File

@ -1,3 +1,9 @@
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

View File

@ -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;
}
}
}

View File

@ -1,3 +1,9 @@
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.

View File

@ -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

View File

@ -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
#...