Add m68k-uclinux target
[deliverable/binutils-gdb.git] / bfd / elf32-s390.c
index f594189d811addf9fc32056e3359bca3d424f506..07ba23cc32ad30e6346dcbb375f4f601d057a28b 100644 (file)
@@ -484,7 +484,7 @@ elf_s390_is_local_label_name (abfd, name)
    Word 1 is a pointer to a structure describing the object
    Word 2 is used to point to the loader entry address.
 
-   The code for position independand PLT entries looks like this:
+   The code for position independent PLT entries looks like this:
 
    r12 holds addr of the current GOT at entry to the PLT
 
@@ -685,14 +685,6 @@ static bfd_boolean
 elf_s390_object_p (abfd)
      bfd *abfd;
 {
-  /* Allocate our special target data.  */
-  struct elf_s390_obj_tdata *new_tdata;
-  bfd_size_type amt = sizeof (struct elf_s390_obj_tdata);
-  new_tdata = bfd_zalloc (abfd, amt);
-  if (new_tdata == NULL)
-    return FALSE;
-  new_tdata->root = *abfd->tdata.elf_obj_data;
-  abfd->tdata.any = new_tdata;
   /* Set the right machine number for an s390 elf32 file.  */
   return bfd_default_set_arch_mach (abfd, bfd_arch_s390, bfd_mach_s390_31);
 }
@@ -914,7 +906,8 @@ elf_s390_copy_indirect_symbol (bed, dir, ind)
     dir->elf_link_hash_flags |=
       (ind->elf_link_hash_flags & (ELF_LINK_HASH_REF_DYNAMIC
                                   | ELF_LINK_HASH_REF_REGULAR
-                                  | ELF_LINK_HASH_REF_REGULAR_NONWEAK));
+                                  | ELF_LINK_HASH_REF_REGULAR_NONWEAK
+                                  | ELF_LINK_HASH_NEEDS_PLT));
   else
     _bfd_elf_link_hash_copy_indirect (bed, dir, ind);
 }
@@ -2325,7 +2318,7 @@ elf_s390_relocate_section (output_bfd, info, input_bfd, input_section,
        {
          sym = local_syms + r_symndx;
          sec = local_sections[r_symndx];
-         relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
+         relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
        }
       else
        {
@@ -2626,9 +2619,41 @@ elf_s390_relocate_section (output_bfd, info, input_bfd, input_section,
              else
                {
                  /* This symbol is local, or marked to become local.  */
-                 relocate = TRUE;
-                 outrel.r_info = ELF32_R_INFO (0, R_390_RELATIVE);
                  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);
+                   }
+                 else
+                   {
+                     long sindx;
+
+                     if (bfd_is_abs_section (sec))
+                       sindx = 0;
+                     else if (sec == NULL || sec->owner == NULL)
+                       {
+                         bfd_set_error(bfd_error_bad_value);
+                         return FALSE;
+                       }
+                     else
+                       {
+                         asection *osec;
+
+                         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);
+                   }
                }
 
              sreloc = elf_section_data (input_section)->sreloc;
This page took 0.024551 seconds and 4 git commands to generate.