yann@1: 2002-04-20 Jakub Jelinek yann@1: yann@1: * elf32-sparc.c (elf32_sparc_relocate_section): Find real output yann@1: section with SEC_MERGE. yann@1: * elf64-sparc.c (sparc64_elf_relocate_section): Likewise. yann@1: yann@1: --- binutils/bfd/elf32-sparc.c.jj Sat Apr 20 22:11:57 2002 yann@1: +++ binutils/bfd/elf32-sparc.c Sat Apr 20 23:06:33 2002 yann@1: @@ -1144,7 +1144,7 @@ elf32_sparc_relocate_section (output_bfd yann@1: struct elf_link_hash_entry *h; yann@1: Elf_Internal_Sym *sym; yann@1: asection *sec; yann@1: - bfd_vma relocation, off; yann@1: + bfd_vma relocation, off, orig_addend = 0; yann@1: bfd_reloc_status_type r; yann@1: boolean is_plt = false; yann@1: boolean unresolved_reloc; yann@1: @@ -1192,6 +1192,7 @@ elf32_sparc_relocate_section (output_bfd yann@1: { yann@1: sym = local_syms + r_symndx; yann@1: sec = local_sections[r_symndx]; yann@1: + orig_addend = rel->r_addend; yann@1: relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); yann@1: } yann@1: else yann@1: @@ -1527,6 +1528,25 @@ elf32_sparc_relocate_section (output_bfd yann@1: asection *osec; yann@1: yann@1: osec = sec->output_section; yann@1: + /* FIXME: As soon as making sections zero size yann@1: + is possible, this if can go away. */ yann@1: + if (bfd_is_abs_section (osec) yann@1: + && h == NULL yann@1: + && (sec->flags & SEC_MERGE) yann@1: + && ELF_ST_TYPE (sym->st_info) == STT_SECTION yann@1: + && (elf_section_data (sec)->sec_info_type yann@1: + == ELF_INFO_TYPE_MERGE)) yann@1: + { yann@1: + asection *msec; yann@1: + yann@1: + msec = sec; yann@1: + _bfd_merged_section_offset (output_bfd, &msec, yann@1: + elf_section_data (sec)->sec_info, yann@1: + sym->st_value + orig_addend, yann@1: + (bfd_vma) 0); yann@1: + osec = msec->output_section; yann@1: + } yann@1: + yann@1: indx = elf_section_data (osec)->dynindx; yann@1: yann@1: /* FIXME: we really should be able to link non-pic yann@1: --- binutils/bfd/elf64-sparc.c.jj Sat Apr 20 22:11:57 2002 yann@1: +++ binutils/bfd/elf64-sparc.c Sat Apr 20 23:12:18 2002 yann@1: @@ -1939,7 +1939,7 @@ sparc64_elf_relocate_section (output_bfd yann@1: struct elf_link_hash_entry *h; yann@1: Elf_Internal_Sym *sym; yann@1: asection *sec; yann@1: - bfd_vma relocation, off; yann@1: + bfd_vma relocation, off, orig_addend = 0; yann@1: bfd_reloc_status_type r; yann@1: boolean is_plt = false; yann@1: boolean unresolved_reloc; yann@1: @@ -1982,6 +1982,7 @@ sparc64_elf_relocate_section (output_bfd yann@1: { yann@1: sym = local_syms + r_symndx; yann@1: sec = local_sections[r_symndx]; yann@1: + orig_addend = rel->r_addend; yann@1: relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); yann@1: } yann@1: else yann@1: @@ -2211,6 +2212,25 @@ sparc64_elf_relocate_section (output_bfd yann@1: asection *osec; yann@1: yann@1: osec = sec->output_section; yann@1: + /* FIXME: As soon as making sections zero size yann@1: + is possible, this if can go away. */ yann@1: + if (bfd_is_abs_section (osec) yann@1: + && h == NULL yann@1: + && (sec->flags & SEC_MERGE) yann@1: + && ELF_ST_TYPE (sym->st_info) == STT_SECTION yann@1: + && (elf_section_data (sec)->sec_info_type yann@1: + == ELF_INFO_TYPE_MERGE)) yann@1: + { yann@1: + asection *msec; yann@1: + yann@1: + msec = sec; yann@1: + _bfd_merged_section_offset (output_bfd, &msec, yann@1: + elf_section_data (sec)->sec_info, yann@1: + sym->st_value + orig_addend, yann@1: + (bfd_vma) 0); yann@1: + osec = msec->output_section; yann@1: + } yann@1: + yann@1: indx = elf_section_data (osec)->dynindx; yann@1: yann@1: /* FIXME: we really should be able to link non-pic