* elf32-sh.c (sh_elf_relocate_section): Use
authorAlexandre Oliva <aoliva@redhat.com>
Mon, 18 Sep 2000 16:19:15 +0000 (16:19 +0000)
committerAlexandre Oliva <aoliva@redhat.com>
Mon, 18 Sep 2000 16:19:15 +0000 (16:19 +0000)
_bfd_final_link_relocate to apply the relocation against a section
symbol, when doing relocatable links.

bfd/ChangeLog
bfd/elf32-sh.c

index 3289e9b3c688ddad0076b0076badc185945929fb..14896cc5c56449eb19bcba7aaa92b9d17bd25ab3 100644 (file)
@@ -1,3 +1,9 @@
+2000-09-18  Alexandre Oliva  <aoliva@redhat.com>
+
+       * elf32-sh.c (sh_elf_relocate_section): Use
+       _bfd_final_link_relocate to apply the relocation against a section
+       symbol, when doing relocatable links.
+
 2000-09-18  Alan Modra  <alan@linuxcare.com.au>
 
        * elf32-hppa.c (elf32_hppa_stub_hash_entry): Rename input_section
index a74d9e81326c2745f338bcf20ddadb6317025591..bd2b3ed7d84e1bb7966c0aabd5ab1f00f20a60d0 100644 (file)
@@ -2897,25 +2897,6 @@ sh_elf_relocate_section (output_bfd, info, input_bfd, input_section,
 
       r_symndx = ELF32_R_SYM (rel->r_info);
 
-      if (info->relocateable)
-       {
-         /* This is a relocateable link.  We don't have to change
-             anything, unless the reloc is against a section symbol,
-             in which case we have to adjust according to where the
-             section symbol winds up in the output section.  */
-         if (r_symndx < symtab_hdr->sh_info)
-           {
-             sym = local_syms + r_symndx;
-             if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
-               {
-                 sec = local_sections[r_symndx];
-                 rel->r_addend += sec->output_offset + sym->st_value;
-               }
-           }
-
-         continue;
-       }
-
       r_type = ELF32_R_TYPE (rel->r_info);
 
       /* Many of the relocs are only used for relaxing, and are
@@ -2948,9 +2929,28 @@ sh_elf_relocate_section (output_bfd, info, input_bfd, input_section,
          relocation = (sec->output_section->vma
                        + sec->output_offset
                        + sym->st_value);
+
+         if (info->relocateable)
+           {
+             /* This is a relocateable link.  We don't have to change
+                anything, unless the reloc is against a section symbol,
+                in which case we have to adjust according to where the
+                section symbol winds up in the output section.  */
+             sym = local_syms + r_symndx;
+             if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
+               goto final_link_relocate;
+
+             continue;
+           }
        }
       else
        {
+         /* Section symbol are never (?) placed in the hash table, so
+            we can just ignore hash relocations when creating a
+            relocateable object file.  */
+         if (info->relocateable)
+           continue;
+
          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
          while (h->root.type == bfd_link_hash_indirect
                 || h->root.type == bfd_link_hash_warning)