summaryrefslogtreecommitdiff
path: root/bfd/elf32-m32c.c
diff options
context:
space:
mode:
authorDJ Delorie <dj@delorie.com>2009-08-14 03:44:21 +0000
committerDJ Delorie <dj@delorie.com>2009-08-14 03:44:21 +0000
commitf652d11fd6b1f2334ea4990b2a3411306b60275e (patch)
tree59c7dc898012b9ced1ab06452900ac83c3c91277 /bfd/elf32-m32c.c
parentb21e6e42cfe06eaae9b531239fc79f105b204e9f (diff)
downloadbinutils-redhat-f652d11fd6b1f2334ea4990b2a3411306b60275e.tar.gz
* elf32-m32c.c (m32c_elf_relax_delete_bytes): Adjust symbol sizes
if needed.
Diffstat (limited to 'bfd/elf32-m32c.c')
-rw-r--r--bfd/elf32-m32c.c31
1 files changed, 25 insertions, 6 deletions
diff --git a/bfd/elf32-m32c.c b/bfd/elf32-m32c.c
index 5f45784f36..8805d611a3 100644
--- a/bfd/elf32-m32c.c
+++ b/bfd/elf32-m32c.c
@@ -1951,13 +1951,24 @@ m32c_elf_relax_delete_bytes
for (; isym < isymend; isym++, shndx = (shndx ? shndx + 1 : NULL))
{
-
+ /* If the symbol is in the range of memory we just moved, we
+ have to adjust its value. */
if ((int) isym->st_shndx == sec_shndx
&& isym->st_value > addr
&& isym->st_value < toaddr)
{
isym->st_value -= count;
}
+ /* If the symbol *spans* the bytes we just deleted (i.e. it's
+ *end* is in the moved bytes but it's *start* isn't), then we
+ must adjust its size. */
+ if ((int) isym->st_shndx == sec_shndx
+ && isym->st_value < addr
+ && isym->st_value + isym->st_size > addr
+ && isym->st_value + isym->st_size < toaddr)
+ {
+ isym->st_size -= count;
+ }
}
/* Now adjust the global symbols defined in this section. */
@@ -1972,13 +1983,21 @@ m32c_elf_relax_delete_bytes
struct elf_link_hash_entry * sym_hash = * sym_hashes;
if (sym_hash &&
- ( sym_hash->root.type == bfd_link_hash_defined
+ (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
+ && sym_hash->root.u.def.value + sym_hash->size < toaddr)
+ {
+ sym_hash->size -= count;
+ }
}
}