diff options
author | Dmitry Diky <diwil@spec.ru> | 2005-09-01 11:27:15 +0000 |
---|---|---|
committer | Dmitry Diky <diwil@spec.ru> | 2005-09-01 11:27:15 +0000 |
commit | 046aeb74904b71d136bc2c4a60f9ba1bc90064b5 (patch) | |
tree | 48c8d8ee79d407ceabdffb983ad558b41e31da5e /bfd | |
parent | 9d21c87bbe47deb9f3e23a3fc7b6587a62e626a3 (diff) | |
download | binutils-046aeb74904b71d136bc2c4a60f9ba1bc90064b5.zip binutils-046aeb74904b71d136bc2c4a60f9ba1bc90064b5.tar.gz binutils-046aeb74904b71d136bc2c4a60f9ba1bc90064b5.tar.bz2 |
2005-09-01 Dmitry Diky <diwil@spec.ru>
* elf32-msp430.c (msp430_elf_relax_delete_bytes): Do not adjust
local symbols and move it to
(msp430_elf_relax_adjust_locals): New function - walk over the
sections in the bfd and adjust relocations as necessary.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 7 | ||||
-rw-r--r-- | bfd/elf32-msp430.c | 42 |
2 files changed, 41 insertions, 8 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 33f5f55..820d55c 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2005-09-01 Dmitry Diky <diwil@spec.ru> + + * elf32-msp430.c (msp430_elf_relax_delete_bytes): Do not adjust + local symbols and move it to + (msp430_elf_relax_adjust_locals): New function - walk over the + sections in the bfd and adjust relocations as necessary. + 2005-08-31 DJ Delorie <dj@redhat.com> * elf32-i386.c (elf_i386_check_relocs): Don't cast a unary & diff --git a/bfd/elf32-msp430.c b/bfd/elf32-msp430.c index 3aec7aa..af73771 100644 --- a/bfd/elf32-msp430.c +++ b/bfd/elf32-msp430.c @@ -830,6 +830,36 @@ msp430_elf_symbol_address_p (bfd * abfd, return FALSE; } +/* Adjust all local symbols defined as '.section + 0xXXXX' (.section has sec_shndx) + referenced from current and other sections */ +static bfd_boolean +msp430_elf_relax_adjust_locals(bfd * abfd, asection * sec, bfd_vma addr, + int count, unsigned int sec_shndx, bfd_vma toaddr) +{ + Elf_Internal_Shdr *symtab_hdr; + Elf_Internal_Rela *irel; + Elf_Internal_Rela *irelend; + Elf_Internal_Sym *isym; + + irel = elf_section_data (sec)->relocs; + irelend = irel + sec->reloc_count; + symtab_hdr = & elf_tdata (abfd)->symtab_hdr; + isym = (Elf_Internal_Sym *) symtab_hdr->contents; + + for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++) + { + int sidx = ELF32_R_SYM(irel->r_info); + Elf_Internal_Sym *lsym = isym + sidx; + + /* Adjust symbols referenced by .sec+0xXX */ + if (irel->r_addend > addr && irel->r_addend < toaddr + && lsym->st_shndx == sec_shndx) + irel->r_addend -= count; + } + + return TRUE; +} + /* Delete some bytes from a section while relaxing. */ static bfd_boolean @@ -848,6 +878,7 @@ msp430_elf_relax_delete_bytes (bfd * abfd, asection * sec, bfd_vma addr, struct elf_link_hash_entry **sym_hashes; struct elf_link_hash_entry **end_hashes; unsigned int symcount; + asection *p; sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec); @@ -872,19 +903,14 @@ msp430_elf_relax_delete_bytes (bfd * abfd, asection * sec, bfd_vma addr, isym = (Elf_Internal_Sym *) symtab_hdr->contents; for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++) { - int sidx = ELF32_R_SYM(irel->r_info); - Elf_Internal_Sym *lsym = isym + sidx; - /* Get the new reloc address. */ if ((irel->r_offset > addr && irel->r_offset < toaddr)) irel->r_offset -= count; - - /* Adjust symbols referenced by .sec+0xXX */ - if (irel->r_addend > addr && irel->r_addend < toaddr - && lsym->st_shndx == sec_shndx) - irel->r_addend -= count; } + for (p = abfd->sections; p != NULL; p = p->next) + msp430_elf_relax_adjust_locals(abfd,p,addr,count,sec_shndx,toaddr); + /* Adjust the local symbols defined in this section. */ symtab_hdr = & elf_tdata (abfd)->symtab_hdr; isym = (Elf_Internal_Sym *) symtab_hdr->contents; |