* elflink.c (elf_link_add_object_symbols): Revert accidental commit.
[deliverable/binutils-gdb.git] / bfd / elflink.c
index be53ca3f9dedcc7cad373c8ea427c30d9dc6a645..99a1ddfa3d787f7b3e1ffddbdc4a159c3eb9affe 100644 (file)
@@ -895,28 +895,30 @@ elf_merge_st_other (bfd *abfd, struct elf_link_hash_entry *h,
     }
 }
 
-/* This function is called when we want to define a new symbol.  It
-   handles the various cases which arise when we find a definition in
-   a dynamic object, or when there is already a definition in a
-   dynamic object.  The new symbol is described by NAME, SYM, PSEC,
-   and PVALUE.  We set SYM_HASH to the hash table entry.  We set
-   OVERRIDE if the old symbol is overriding a new definition.  We set
-   TYPE_CHANGE_OK if it is OK for the type to change.  We set
-   SIZE_CHANGE_OK if it is OK for the size to change.  By OK to
-   change, we mean that we shouldn't warn if the type or size does
-   change.  We set POLD_ALIGNMENT if an old common symbol in a dynamic
-   object is overridden by a regular object.  */
+/* This function is called when we want to merge a new symbol with an
+   existing symbol.  It handles the various cases which arise when we
+   find a definition in a dynamic object, or when there is already a
+   definition in a dynamic object.  The new symbol is described by
+   NAME, SYM, PSEC, and PVALUE.  We set SYM_HASH to the hash table
+   entry.  We set POLDBFD to the old symbol's BFD.  We set POLD_WEAK
+   if the old symbol was weak.  We set POLD_ALIGNMENT to the alignment
+   of an old common symbol.  We set OVERRIDE if the old symbol is
+   overriding a new definition.  We set TYPE_CHANGE_OK if it is OK for
+   the type to change.  We set SIZE_CHANGE_OK if it is OK for the size
+   to change.  By OK to change, we mean that we shouldn't warn if the
+   type or size does change.  */
 
-bfd_boolean
+static bfd_boolean
 _bfd_elf_merge_symbol (bfd *abfd,
                       struct bfd_link_info *info,
                       const char *name,
                       Elf_Internal_Sym *sym,
                       asection **psec,
                       bfd_vma *pvalue,
+                      struct elf_link_hash_entry **sym_hash,
+                      bfd **poldbfd,
                       bfd_boolean *pold_weak,
                       unsigned int *pold_alignment,
-                      struct elf_link_hash_entry **sym_hash,
                       bfd_boolean *skip,
                       bfd_boolean *override,
                       bfd_boolean *type_change_ok,
@@ -938,15 +940,6 @@ _bfd_elf_merge_symbol (bfd *abfd,
   sec = *psec;
   bind = ELF_ST_BIND (sym->st_info);
 
-  /* Silently discard TLS symbols from --just-syms.  There's no way to
-     combine a static TLS block with a new TLS block for this executable.  */
-  if (ELF_ST_TYPE (sym->st_info) == STT_TLS
-      && sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
-    {
-      *skip = TRUE;
-      return TRUE;
-    }
-
   if (! bfd_is_und_section (sec))
     h = elf_link_hash_lookup (elf_hash_table (info), name, TRUE, FALSE, FALSE);
   else
@@ -1039,8 +1032,12 @@ _bfd_elf_merge_symbol (bfd *abfd,
     case bfd_link_hash_common:
       oldbfd = h->root.u.c.p->section->owner;
       oldsec = h->root.u.c.p->section;
+      if (pold_alignment)
+       *pold_alignment = h->root.u.c.p->alignment_power;
       break;
     }
+  if (poldbfd && *poldbfd == NULL)
+    *poldbfd = oldbfd;
 
   /* Differentiate strong and weak symbols.  */
   newweak = bind == STB_WEAK;
@@ -1145,19 +1142,23 @@ _bfd_elf_merge_symbol (bfd *abfd,
 
       if (tdef && ntdef)
        (*_bfd_error_handler)
-         (_("%s: TLS definition in %B section %A mismatches non-TLS definition in %B section %A"),
+         (_("%s: TLS definition in %B section %A "
+            "mismatches non-TLS definition in %B section %A"),
           tbfd, tsec, ntbfd, ntsec, h->root.root.string);
       else if (!tdef && !ntdef)
        (*_bfd_error_handler)
-         (_("%s: TLS reference in %B mismatches non-TLS reference in %B"),
+         (_("%s: TLS reference in %B "
+            "mismatches non-TLS reference in %B"),
           tbfd, ntbfd, h->root.root.string);
       else if (tdef)
        (*_bfd_error_handler)
-         (_("%s: TLS definition in %B section %A mismatches non-TLS reference in %B"),
+         (_("%s: TLS definition in %B section %A "
+            "mismatches non-TLS reference in %B"),
           tbfd, tsec, ntbfd, h->root.root.string);
       else
        (*_bfd_error_handler)
-         (_("%s: TLS reference in %B mismatches non-TLS definition in %B section %A"),
+         (_("%s: TLS reference in %B "
+            "mismatches non-TLS definition in %B section %A"),
           tbfd, ntbfd, ntsec, h->root.root.string);
 
       bfd_set_error (bfd_error_bad_value);
@@ -1190,7 +1191,7 @@ _bfd_elf_merge_symbol (bfd *abfd,
       /* If the new symbol with non-default visibility comes from a
         relocatable file and the old definition comes from a dynamic
         object, we remove the old definition.  */
-      if ((*sym_hash)->root.type == bfd_link_hash_indirect)
+      if (hi->root.type == bfd_link_hash_indirect)
        {
          /* Handle the case where the old dynamic definition is
             default versioned.  We need to copy the symbol info from
@@ -1198,13 +1199,11 @@ _bfd_elf_merge_symbol (bfd *abfd,
             was referenced before.  */
          if (h->ref_regular)
            {
-             struct elf_link_hash_entry *vh = *sym_hash;
-
-             vh->root.type = h->root.type;
+             hi->root.type = h->root.type;
              h->root.type = bfd_link_hash_indirect;
-             (*bed->elf_backend_copy_indirect_symbol) (info, vh, h);
+             (*bed->elf_backend_copy_indirect_symbol) (info, hi, h);
 
-             h->root.u.i.link = (struct bfd_link_hash_entry *) vh;
+             h->root.u.i.link = (struct bfd_link_hash_entry *) hi;
              if (ELF_ST_VISIBILITY (sym->st_other) != STV_PROTECTED)
                {
                  /* If the new symbol is hidden or internal, completely undo
@@ -1221,10 +1220,10 @@ _bfd_elf_merge_symbol (bfd *abfd,
              h->size = 0;
              h->type = 0;
 
-             h = vh;
+             h = hi;
            }
          else
-           h = *sym_hash;
+           h = hi;
        }
 
       /* If the old symbol was undefined before, then it will still be
@@ -1347,15 +1346,12 @@ _bfd_elf_merge_symbol (bfd *abfd,
 
   /* We now know everything about the old and new symbols.  We ask the
      backend to check if we can merge them.  */
-  if (bed->merge_symbol
-      && !bed->merge_symbol (info, sym_hash, h, sym, psec, pvalue,
-                            pold_alignment, skip, override,
-                            type_change_ok, size_change_ok,
-                            &newdyn, &newdef, &newdyncommon, &newweak,
-                            abfd, &sec,
-                            &olddyn, &olddef, &olddyncommon, &oldweak,
-                            oldbfd, &oldsec))
-    return FALSE;
+  if (bed->merge_symbol != NULL)
+    {
+      if (!bed->merge_symbol (h, sym, psec, newdef, olddef, oldbfd, oldsec))
+       return FALSE;
+      sec = *psec;
+    }
 
   /* If both the old and the new symbols look like common symbols in a
      dynamic object, set the size of the symbol to the larger of the
@@ -1504,8 +1500,8 @@ _bfd_elf_merge_symbol (bfd *abfd,
          *type_change_ok = TRUE;
        }
 
-      if ((*sym_hash)->root.type == bfd_link_hash_indirect)
-       flip = *sym_hash;
+      if (hi->root.type == bfd_link_hash_indirect)
+       flip = hi;
       else
        /* This union may have been set to be non-NULL when this symbol
           was seen in a dynamic object.  We must force the union to be
@@ -1550,8 +1546,8 @@ _bfd_elf_merge_symbol (bfd *abfd,
       *size_change_ok = TRUE;
       *type_change_ok = TRUE;
 
-      if ((*sym_hash)->root.type == bfd_link_hash_indirect)
-       flip = *sym_hash;
+      if (hi->root.type == bfd_link_hash_indirect)
+       flip = hi;
       else
        h->verinfo.vertree = NULL;
     }
@@ -1578,7 +1574,7 @@ _bfd_elf_merge_symbol (bfd *abfd,
 
 /* This function is called to create an indirect symbol from the
    default for the symbol with the default version if needed. The
-   symbol is described by H, NAME, SYM, PSEC, VALUE, and OVERRIDE.  We
+   symbol is described by H, NAME, SYM, SEC, and VALUE.  We
    set DYNSYM if the new indirect symbol is dynamic.  */
 
 static bfd_boolean
@@ -1587,10 +1583,10 @@ _bfd_elf_add_default_symbol (bfd *abfd,
                             struct elf_link_hash_entry *h,
                             const char *name,
                             Elf_Internal_Sym *sym,
-                            asection **psec,
-                            bfd_vma *value,
-                            bfd_boolean *dynsym,
-                            bfd_boolean override)
+                            asection *sec,
+                            bfd_vma value,
+                            bfd **poldbfd,
+                            bfd_boolean *dynsym)
 {
   bfd_boolean type_change_ok;
   bfd_boolean size_change_ok;
@@ -1601,9 +1597,10 @@ _bfd_elf_add_default_symbol (bfd *abfd,
   const struct elf_backend_data *bed;
   bfd_boolean collect;
   bfd_boolean dynamic;
+  bfd_boolean override;
   char *p;
   size_t len, shortlen;
-  asection *sec;
+  asection *tmp_sec;
 
   /* If this symbol has a version, and it is the default version, we
      create an indirect symbol from the default name to the fully
@@ -1613,24 +1610,6 @@ _bfd_elf_add_default_symbol (bfd *abfd,
   if (p == NULL || p[1] != ELF_VER_CHR)
     return TRUE;
 
-  if (override)
-    {
-      /* We are overridden by an old definition. We need to check if we
-        need to create the indirect symbol from the default name.  */
-      hi = elf_link_hash_lookup (elf_hash_table (info), name, TRUE,
-                                FALSE, FALSE);
-      BFD_ASSERT (hi != NULL);
-      if (hi == h)
-       return TRUE;
-      while (hi->root.type == bfd_link_hash_indirect
-            || hi->root.type == bfd_link_hash_warning)
-       {
-         hi = (struct elf_link_hash_entry *) hi->root.u.i.link;
-         if (hi == h)
-           return TRUE;
-       }
-    }
-
   bed = get_elf_backend_data (abfd);
   collect = bed->collect;
   dynamic = (abfd->flags & DYNAMIC) != 0;
@@ -1648,9 +1627,9 @@ _bfd_elf_add_default_symbol (bfd *abfd,
      actually going to define an indirect symbol.  */
   type_change_ok = FALSE;
   size_change_ok = FALSE;
-  sec = *psec;
-  if (!_bfd_elf_merge_symbol (abfd, info, shortname, sym, &sec, value,
-                             NULL, NULL, &hi, &skip, &override,
+  tmp_sec = sec;
+  if (!_bfd_elf_merge_symbol (abfd, info, shortname, sym, &tmp_sec, &value,
+                             &hi, poldbfd, NULL, NULL, &skip, &override,
                              &type_change_ok, &size_change_ok))
     return FALSE;
 
@@ -1757,9 +1736,9 @@ nondefault:
   /* Once again, merge with any existing symbol.  */
   type_change_ok = FALSE;
   size_change_ok = FALSE;
-  sec = *psec;
-  if (!_bfd_elf_merge_symbol (abfd, info, shortname, sym, &sec, value,
-                             NULL, NULL, &hi, &skip, &override,
+  tmp_sec = sec;
+  if (!_bfd_elf_merge_symbol (abfd, info, shortname, sym, &tmp_sec, &value,
+                             &hi, NULL, NULL, NULL, &skip, &override,
                              &type_change_ok, &size_change_ok))
     return FALSE;
 
@@ -3859,7 +3838,6 @@ error_free_dyn:
       bfd_boolean common;
       unsigned int old_alignment;
       bfd *old_bfd;
-      bfd * undef_bfd = NULL;
 
       override = FALSE;
 
@@ -3979,6 +3957,13 @@ error_free_dyn:
          goto error_free_vers;
        }
 
+      /* Silently discard TLS symbols from --just-syms.  There's
+        no way to combine a static TLS block with a new TLS block
+        for this executable.  */
+      if (ELF_ST_TYPE (isym->st_info) == STT_TLS
+         && sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
+       continue;
+
       if (bfd_is_und_section (sec)
          || bfd_is_com_section (sec))
        definition = FALSE;
@@ -3998,22 +3983,6 @@ error_free_dyn:
          unsigned int vernum = 0;
          bfd_boolean skip;
 
-         /* If this is a definition of a symbol which was previously
-            referenced, then make a note of the bfd that contained the
-            reference.  This is used if we need to refer to the source
-            of the reference later on.  */
-         if (! bfd_is_und_section (sec))
-           {
-             h = elf_link_hash_lookup (elf_hash_table (info), name,
-                                       FALSE, FALSE, FALSE);
-
-             if (h != NULL
-                 && (h->root.type == bfd_link_hash_undefined
-                     || h->root.type == bfd_link_hash_undefweak)
-                 && h->root.u.undef.abfd)
-               undef_bfd = h->root.u.undef.abfd;
-           }
-
          if (ever == NULL)
            {
              if (info->default_imported_symver)
@@ -4121,23 +4090,9 @@ error_free_dyn:
              name = newname;
            }
 
-         /* If necessary, make a second attempt to locate the bfd
-            containing an unresolved reference to the current symbol.  */
-         if (! bfd_is_und_section (sec) && undef_bfd == NULL)
-           {
-             h = elf_link_hash_lookup (elf_hash_table (info), name,
-                                       FALSE, FALSE, FALSE);
-
-             if (h != NULL
-                 && (h->root.type == bfd_link_hash_undefined
-                     || h->root.type == bfd_link_hash_undefweak)
-                 && h->root.u.undef.abfd)
-               undef_bfd = h->root.u.undef.abfd;
-           }
-
-         if (!_bfd_elf_merge_symbol (abfd, info, name, isym, &sec,
-                                     &value, &old_weak, &old_alignment,
-                                     sym_hash, &skip, &override,
+         if (!_bfd_elf_merge_symbol (abfd, info, name, isym, &sec, &value,
+                                     sym_hash, &old_bfd, &old_weak,
+                                     &old_alignment, &skip, &override,
                                      &type_change_ok, &size_change_ok))
            goto error_free_vers;
 
@@ -4152,28 +4107,6 @@ error_free_dyn:
                 || h->root.type == bfd_link_hash_warning)
            h = (struct elf_link_hash_entry *) h->root.u.i.link;
 
-         /* Remember the old alignment if this is a common symbol, so
-            that we don't reduce the alignment later on.  We can't
-            check later, because _bfd_generic_link_add_one_symbol
-            will set a default for the alignment which we want to
-            override. We also remember the old bfd where the existing
-            definition comes from.  */
-         switch (h->root.type)
-           {
-           default:
-             break;
-
-           case bfd_link_hash_defined:
-           case bfd_link_hash_defweak:
-             old_bfd = h->root.u.def.section->owner;
-             break;
-
-           case bfd_link_hash_common:
-             old_bfd = h->root.u.c.p->section->owner;
-             old_alignment = h->root.u.c.p->alignment_power;
-             break;
-           }
-
          if (elf_tdata (abfd)->verdef != NULL
              && vernum > 1
              && definition)
@@ -4243,7 +4176,73 @@ error_free_dyn:
 
       if (is_elf_hash_table (htab))
        {
-         bfd_boolean dynsym;
+         /* Set a flag in the hash table entry indicating the type of
+            reference or definition we just found.  A dynamic symbol
+            is one which is referenced or defined by both a regular
+            object and a shared object.  */
+         bfd_boolean dynsym = FALSE;
+
+         /* Plugin symbols aren't normal.  Don't set def_regular or
+            ref_regular for them, or make them dynamic.  */
+         if ((abfd->flags & BFD_PLUGIN) != 0)
+           ;
+         else if (! dynamic)
+           {
+             if (! definition)
+               {
+                 h->ref_regular = 1;
+                 if (bind != STB_WEAK)
+                   h->ref_regular_nonweak = 1;
+               }
+             else
+               {
+                 h->def_regular = 1;
+                 if (h->def_dynamic)
+                   {
+                     h->def_dynamic = 0;
+                     h->ref_dynamic = 1;
+                   }
+               }
+
+             /* If the indirect symbol has been forced local, don't
+                make the real symbol dynamic.  */
+             if ((h == hi || !hi->forced_local)
+                 && (! info->executable
+                     || h->def_dynamic
+                     || h->ref_dynamic))
+               dynsym = TRUE;
+           }
+         else
+           {
+             if (! definition)
+               {
+                 h->ref_dynamic = 1;
+                 hi->ref_dynamic = 1;
+               }
+             else
+               {
+                 h->def_dynamic = 1;
+                 hi->def_dynamic = 1;
+               }
+
+             /* If the indirect symbol has been forced local, don't
+                make the real symbol dynamic.  */
+             if ((h == hi || !hi->forced_local)
+                 && (h->def_regular
+                     || h->ref_regular
+                     || (h->u.weakdef != NULL
+                         && ! new_weakdef
+                         && h->u.weakdef->dynindx != -1)))
+               dynsym = TRUE;
+           }
+
+         /* Check to see if we need to add an indirect symbol for
+            the default name.  */
+         if (definition
+             || (!override && h->root.type == bfd_link_hash_common))
+           if (!_bfd_elf_add_default_symbol (abfd, info, h, name, isym,
+                                             sec, value, &old_bfd, &dynsym))
+             goto error_free_vers;
 
          /* Check the alignment when a common symbol is involved. This
             can change when a common symbol is overridden by a normal
@@ -4259,6 +4258,9 @@ error_free_dyn:
              bfd *normal_bfd;
              bfd *common_bfd;
 
+             BFD_ASSERT (h->root.type == bfd_link_hash_defined
+                         || h->root.type == bfd_link_hash_defweak);
+
              symbol_align = ffs (h->root.u.def.value) - 1;
              if (h->root.u.def.section->owner != NULL
                  && (h->root.u.def.section->owner->flags & DYNAMIC) == 0)
@@ -4288,8 +4290,8 @@ error_free_dyn:
                  /* PR binutils/2735 */
                  if (normal_bfd == NULL)
                    (*_bfd_error_handler)
-                     (_("Warning: alignment %u of common symbol `%s' in %B"
-                        " is greater than the alignment (%u) of its section %A"),
+                     (_("Warning: alignment %u of common symbol `%s' in %B is"
+                        " greater than the alignment (%u) of its section %A"),
                       common_bfd, h->root.u.def.section,
                       1 << common_align, name, 1 << normal_align);
                  else
@@ -4302,7 +4304,8 @@ error_free_dyn:
            }
 
          /* Remember the symbol size if it isn't undefined.  */
-         if ((isym->st_size != 0 && isym->st_shndx != SHN_UNDEF)
+         if (isym->st_size != 0
+             && isym->st_shndx != SHN_UNDEF
              && (definition || h->size == 0))
            {
              if (h->size != 0
@@ -4322,7 +4325,7 @@ error_free_dyn:
             to be the size of the common symbol.  The code just above
             won't fix the size if a common symbol becomes larger.  We
             don't warn about a size change here, because that is
-            covered by --warn-common.  Allow changed between different
+            covered by --warn-common.  Allow changes between different
             function types.  */
          if (h->root.type == bfd_link_hash_common)
            h->size = h->root.u.c.size;
@@ -4355,85 +4358,20 @@ error_free_dyn:
          /* Merge st_other field.  */
          elf_merge_st_other (abfd, h, isym, definition, dynamic);
 
-         /* Set a flag in the hash table entry indicating the type of
-            reference or definition we just found.  Keep a count of
-            the number of dynamic symbols we find.  A dynamic symbol
-            is one which is referenced or defined by both a regular
-            object and a shared object.  */
-         dynsym = FALSE;
-
-         /* Plugin symbols aren't normal.  Don't set def_regular or
-            ref_regular for them, nor make them dynamic.  */
-         if ((abfd->flags & BFD_PLUGIN) != 0)
-           ;
-         else if (! dynamic)
-           {
-             if (! definition)
-               {
-                 h->ref_regular = 1;
-                 if (bind != STB_WEAK)
-                   h->ref_regular_nonweak = 1;
-               }
-             else
-               {
-                 h->def_regular = 1;
-                 if (h->def_dynamic)
-                   {
-                     h->def_dynamic = 0;
-                     h->ref_dynamic = 1;
-                   }
-               }
-
-             /* If the indirect symbol has been forced local, don't
-                make the real symbol dynamic.  */
-             if ((h == hi || !hi->forced_local)
-                 && (! info->executable
-                     || h->def_dynamic
-                     || h->ref_dynamic))
-               dynsym = TRUE;
-           }
-         else
-           {
-             if (! definition)
-               {
-                 h->ref_dynamic = 1;
-                 hi->ref_dynamic = 1;
-               }
-             else
-               {
-                 h->def_dynamic = 1;
-                 hi->def_dynamic = 1;
-               }
-
-             /* If the indirect symbol has been forced local, don't
-                make the real symbol dynamic.  */
-             if ((h == hi || !hi->forced_local)
-                 && (h->def_regular
-                     || h->ref_regular
-                     || (h->u.weakdef != NULL
-                         && ! new_weakdef
-                         && h->u.weakdef->dynindx != -1)))
-               dynsym = TRUE;
-           }
-
          /* We don't want to make debug symbol dynamic.  */
          if (definition && (sec->flags & SEC_DEBUGGING) && !info->relocatable)
            dynsym = FALSE;
 
+         /* Nor should we make plugin symbols dynamic.  */
+         if ((abfd->flags & BFD_PLUGIN) != 0)
+           dynsym = FALSE;
+
          if (definition)
            {
              h->target_internal = isym->st_target_internal;
              h->unique_global = (flags & BSF_GNU_UNIQUE) != 0;
            }
 
-         /* Check to see if we need to add an indirect symbol for
-            the default name.  */
-         if (definition || h->root.type == bfd_link_hash_common)
-           if (!_bfd_elf_add_default_symbol (abfd, info, h, name, isym,
-                                             &sec, &value, &dynsym,
-                                             override))
-             goto error_free_vers;
-
          if (definition && !dynamic)
            {
              char *p = strchr (name, ELF_VER_CHR);
@@ -4484,8 +4422,8 @@ error_free_dyn:
              && definition
              && ((dynsym
                   && h->ref_regular_nonweak
-                  && (undef_bfd == NULL
-                      || (undef_bfd->flags & BFD_PLUGIN) == 0))
+                  && (old_bfd == NULL
+                      || (old_bfd->flags & BFD_PLUGIN) == 0))
                  || (h->ref_dynamic_nonweak
                      && (elf_dyn_lib_class (abfd) & DYN_AS_NEEDED) != 0
                      && !on_needed_list (elf_dt_name (abfd), htab->needed))))
@@ -4498,17 +4436,13 @@ error_free_dyn:
                 Add a DT_NEEDED entry for it.  Issue an error if
                 --no-add-needed is used and the reference was not
                 a weak one.  */
-             if (undef_bfd != NULL
-                 && h->ref_regular_nonweak
+             if (old_bfd != NULL
                  && (elf_dyn_lib_class (abfd) & DYN_NO_NEEDED) != 0)
                {
                  (*_bfd_error_handler)
                    (_("%B: undefined reference to symbol '%s'"),
-                    undef_bfd, name);
-                 (*_bfd_error_handler)
-                   (_("note: '%s' is defined in DSO %B so try adding it to the linker command line"),
-                    abfd, name);
-                 bfd_set_error (bfd_error_invalid_operation);
+                    old_bfd, name);
+                 bfd_set_error (bfd_error_missing_dso);
                  goto error_free_vers;
                }
 
@@ -8158,17 +8092,14 @@ elf_link_sort_cmp2 (const void *A, const void *B)
 {
   const struct elf_link_sort_rela *a = (const struct elf_link_sort_rela *) A;
   const struct elf_link_sort_rela *b = (const struct elf_link_sort_rela *) B;
-  int copya, copyb;
 
-  if (a->u.offset < b->u.offset)
+  if (a->type < b->type)
     return -1;
-  if (a->u.offset > b->u.offset)
+  if (a->type > b->type)
     return 1;
-  copya = (a->type == reloc_class_copy) * 2 + (a->type == reloc_class_plt);
-  copyb = (b->type == reloc_class_copy) * 2 + (b->type == reloc_class_plt);
-  if (copya < copyb)
+  if (a->u.offset < b->u.offset)
     return -1;
-  if (copya > copyb)
+  if (a->u.offset > b->u.offset)
     return 1;
   if (a->rela->r_offset < b->rela->r_offset)
     return -1;
@@ -8395,7 +8326,7 @@ elf_link_sort_relocs (bfd *abfd, struct bfd_link_info *info, asection **psec)
            struct elf_link_sort_rela *s = (struct elf_link_sort_rela *) p;
 
            (*swap_in) (abfd, erel, s->rela);
-           s->type = (*bed->elf_backend_reloc_type_class) (s->rela);
+           s->type = (*bed->elf_backend_reloc_type_class) (info, o, s->rela);
            s->u.sym_mask = r_sym_mask;
            p += sort_elt;
            erel += ext_size;
This page took 0.034578 seconds and 4 git commands to generate.