From: Martin Schwidefsky Date: Thu, 20 Nov 2003 09:54:07 +0000 (+0000) Subject: * elf32-s390.c (elf_s390_relocate_section): Don't recalculate symbol X-Git-Tag: drow-cplus-merge-20031214~200 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=759588af2cbedeccdf6da13c9d14a4cac963d257;p=pf3gnuchains%2Fpf3gnuchains4x.git * elf32-s390.c (elf_s390_relocate_section): Don't recalculate symbol section for reloc output and subtract the output section's address from the addend when converting a relocation into one against a section symbol. * elf64-s390.c (elf_s390_relocate_section): Likewise. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 11f75b2cf8..ad3d9ac726 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,11 @@ +2003-11-20 Martin Schwidefsky + + * elf32-s390.c (elf_s390_relocate_section): Don't recalculate symbol + section for reloc output and subtract the output section's address + from the addend when converting a relocation into one against a + section symbol. + * elf64-s390.c (elf_s390_relocate_section): Likewise. + 2003-11-18 James E Wilson * elfxx-ia64.c (get_fptr): For fptr_rel, use dynobj not abfd. diff --git a/bfd/elf32-s390.c b/bfd/elf32-s390.c index 32bf8bf1ae..189c828aa6 100644 --- a/bfd/elf32-s390.c +++ b/bfd/elf32-s390.c @@ -2627,26 +2627,17 @@ elf_s390_relocate_section (output_bfd, info, input_bfd, input_section, else { /* This symbol is local, or marked to become local. */ + outrel.r_addend = relocation + rel->r_addend; if (r_type == R_390_32) { relocate = TRUE; outrel.r_info = ELF32_R_INFO (0, R_390_RELATIVE); - outrel.r_addend = relocation + rel->r_addend; } else { long sindx; - if (h == NULL) - sec = local_sections[r_symndx]; - else - { - BFD_ASSERT (h->root.type == bfd_link_hash_defined - || (h->root.type - == bfd_link_hash_defweak)); - sec = h->root.u.def.section; - } - if (sec != NULL && bfd_is_abs_section (sec)) + if (bfd_is_abs_section (sec)) sindx = 0; else if (sec == NULL || sec->owner == NULL) { @@ -2660,9 +2651,16 @@ elf_s390_relocate_section (output_bfd, info, input_bfd, input_section, osec = sec->output_section; sindx = elf_section_data (osec)->dynindx; BFD_ASSERT (sindx > 0); + + /* We are turning this relocation into one + against a section symbol, so subtract out + the output section's address but not the + offset of the input section in the output + section. */ + + outrel.r_addend -= osec->vma; } outrel.r_info = ELF32_R_INFO (sindx, r_type); - outrel.r_addend = relocation + rel->r_addend; } } diff --git a/bfd/elf64-s390.c b/bfd/elf64-s390.c index 8b521be633..e14a0fc4c7 100644 --- a/bfd/elf64-s390.c +++ b/bfd/elf64-s390.c @@ -2606,26 +2606,17 @@ elf_s390_relocate_section (output_bfd, info, input_bfd, input_section, else { /* This symbol is local, or marked to become local. */ + outrel.r_addend = relocation + rel->r_addend; if (r_type == R_390_64) { relocate = TRUE; outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE); - outrel.r_addend = relocation + rel->r_addend; } else { long sindx; - if (h == NULL) - sec = local_sections[r_symndx]; - else - { - BFD_ASSERT (h->root.type == bfd_link_hash_defined - || (h->root.type - == bfd_link_hash_defweak)); - sec = h->root.u.def.section; - } - if (sec != NULL && bfd_is_abs_section (sec)) + if (bfd_is_abs_section (sec)) sindx = 0; else if (sec == NULL || sec->owner == NULL) { @@ -2639,9 +2630,16 @@ elf_s390_relocate_section (output_bfd, info, input_bfd, input_section, osec = sec->output_section; sindx = elf_section_data (osec)->dynindx; BFD_ASSERT (sindx > 0); + + /* We are turning this relocation into one + against a section symbol, so subtract out + the output section's address but not the + offset of the input section in the output + section. */ + + outrel.r_addend -= osec->vma; } outrel.r_info = ELF64_R_INFO (sindx, r_type); - outrel.r_addend = relocation + rel->r_addend; } }