diff options
author | DJ Delorie <dj@redhat.com> | 2006-03-03 03:13:49 +0000 |
---|---|---|
committer | DJ Delorie <dj@redhat.com> | 2006-03-03 03:13:49 +0000 |
commit | a10138943b15cfa070d4526dc8bbec3976e51cdb (patch) | |
tree | 4a3c64a17ed0f1a36f52d903e36b65f2a357b31e /bfd/elf32-m32c.c | |
parent | 53022e4a53d0f3c2408b598f25662efe713db8c3 (diff) | |
download | gdb-a10138943b15cfa070d4526dc8bbec3976e51cdb.zip gdb-a10138943b15cfa070d4526dc8bbec3976e51cdb.tar.gz gdb-a10138943b15cfa070d4526dc8bbec3976e51cdb.tar.bz2 |
* elf32-m32c.c (m32c_offset_for_reloc): Fix local symbol
calculations.
Diffstat (limited to 'bfd/elf32-m32c.c')
-rw-r--r-- | bfd/elf32-m32c.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/bfd/elf32-m32c.c b/bfd/elf32-m32c.c index 2295a54..f56efd2 100644 --- a/bfd/elf32-m32c.c +++ b/bfd/elf32-m32c.c @@ -493,14 +493,15 @@ m32c_elf_relocate_section } #if 0 - printf("relocate %s at %06lx relocation %06lx addend %ld ", - m32c_elf_howto_table[ELF32_R_TYPE(rel->r_info)].name, - rel->r_offset, relocation, rel->r_addend); + printf ("relocate %s at %06lx relocation %06lx addend %ld ", + m32c_elf_howto_table[ELF32_R_TYPE(rel->r_info)].name, + rel->r_offset + input_section->output_section->vma + input_section->output_offset, + relocation, rel->r_addend); { int i; for (i=0; i<4; i++) - printf(" %02x", contents[rel->r_offset+i]); - printf("\n"); + printf (" %02x", contents[rel->r_offset+i]); + printf ("\n"); } #endif r = _bfd_final_link_relocate (howto, input_bfd, input_section, @@ -1219,10 +1220,9 @@ compare_reloc (const void *e1, const void *e2) return i1->r_offset < i2->r_offset ? -1 : 1; } -#define OFFSET_FOR_RELOC(rel) m32c_offset_for_reloc (abfd, sec, rel, symtab_hdr, shndx_buf, intsyms) +#define OFFSET_FOR_RELOC(rel) m32c_offset_for_reloc (abfd, rel, symtab_hdr, shndx_buf, intsyms) static bfd_vma m32c_offset_for_reloc (bfd *abfd, - asection * sec, Elf_Internal_Rela *rel, Elf_Internal_Shdr *symtab_hdr, Elf_External_Sym_Shndx *shndx_buf, @@ -1236,13 +1236,17 @@ m32c_offset_for_reloc (bfd *abfd, /* A local symbol. */ Elf_Internal_Sym *isym; Elf_External_Sym_Shndx *shndx; + asection *ssec; + isym = intsyms + ELF32_R_SYM (rel->r_info); + ssec = bfd_section_from_elf_index (abfd, isym->st_shndx); shndx = shndx_buf + (shndx_buf ? ELF32_R_SYM (rel->r_info) : 0); - symval = (isym->st_value - + sec->output_section->vma - + sec->output_offset); + symval = isym->st_value; + if (ssec) + symval += ssec->output_section->vma + + ssec->output_offset; } else { |