s390: Add DT_JMPREL pointing to .rela.[i]plt with static-pie
[binutils-gdb.git] / bfd / ecoff.c
index f09fc1dd0a6b46e49af16e3033daa7ca0bd7aa23..d2081055835613eecaa3638318abc60cfee37650 100644 (file)
@@ -1,5 +1,5 @@
 /* Generic ECOFF (Extended-COFF) routines.
-   Copyright (C) 1990-2021 Free Software Foundation, Inc.
+   Copyright (C) 1990-2022 Free Software Foundation, Inc.
    Original version by Per Bothner.
    Full support added by Ian Lance Taylor, ian@cygnus.com.
 
@@ -46,7 +46,6 @@
 #include "libiberty.h"
 
 #define streq(a, b)    (strcmp ((a), (b)) == 0)
-#define strneq(a, b, n)        (strncmp ((a), (b), (n)) == 0)
 
 \f
 /* This stuff is somewhat copied from coffcode.h.  */
@@ -1607,22 +1606,16 @@ ecoff_slurp_reloc_table (bfd *abfd,
       (*backend->swap_reloc_in) (abfd,
                                 external_relocs + i * external_reloc_size,
                                 &intern);
+      rptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
+      rptr->addend = 0;
 
       if (intern.r_extern)
        {
          /* r_symndx is an index into the external symbols.  */
-         BFD_ASSERT (intern.r_symndx >= 0
-                     && (intern.r_symndx
-                         < (ecoff_data (abfd)
-                            ->debug_info.symbolic_header.iextMax)));
-         rptr->sym_ptr_ptr = symbols + intern.r_symndx;
-         rptr->addend = 0;
-       }
-      else if (intern.r_symndx == RELOC_SECTION_NONE
-              || intern.r_symndx == RELOC_SECTION_ABS)
-       {
-         rptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
-         rptr->addend = 0;
+         if (intern.r_symndx >= 0
+             && (intern.r_symndx
+                 < (ecoff_data (abfd)->debug_info.symbolic_header.iextMax)))
+           rptr->sym_ptr_ptr = symbols + intern.r_symndx;
        }
       else
        {
@@ -1646,15 +1639,20 @@ ecoff_slurp_reloc_table (bfd *abfd,
            case RELOC_SECTION_FINI:  sec_name = _FINI;  break;
            case RELOC_SECTION_LITA:  sec_name = _LITA;  break;
            case RELOC_SECTION_RCONST: sec_name = _RCONST; break;
-           default: abort ();
+           default:
+             sec_name = NULL;
+             break;
            }
 
-         sec = bfd_get_section_by_name (abfd, sec_name);
-         if (sec == NULL)
-           abort ();
-         rptr->sym_ptr_ptr = sec->symbol_ptr_ptr;
-
-         rptr->addend = - bfd_section_vma (sec);
+         if (sec_name != NULL)
+           {
+             sec = bfd_get_section_by_name (abfd, sec_name);
+             if (sec != NULL)
+               {
+                 rptr->sym_ptr_ptr = sec->symbol_ptr_ptr;
+                 rptr->addend = - bfd_section_vma (sec);
+               }
+           }
        }
 
       rptr->address = intern.r_vaddr - bfd_section_vma (section);
@@ -2870,14 +2868,14 @@ _bfd_ecoff_slurp_armap (bfd *abfd)
     return bfd_slurp_armap (abfd);
 
   /* See if the first element is an armap.  */
-  if (! strneq (nextname, ecoff_backend (abfd)->armap_start, ARMAP_START_LENGTH)
+  if (strncmp (nextname, ecoff_backend (abfd)->armap_start, ARMAP_START_LENGTH) != 0
       || nextname[ARMAP_HEADER_MARKER_INDEX] != ARMAP_MARKER
       || (nextname[ARMAP_HEADER_ENDIAN_INDEX] != ARMAP_BIG_ENDIAN
          && nextname[ARMAP_HEADER_ENDIAN_INDEX] != ARMAP_LITTLE_ENDIAN)
       || nextname[ARMAP_OBJECT_MARKER_INDEX] != ARMAP_MARKER
       || (nextname[ARMAP_OBJECT_ENDIAN_INDEX] != ARMAP_BIG_ENDIAN
          && nextname[ARMAP_OBJECT_ENDIAN_INDEX] != ARMAP_LITTLE_ENDIAN)
-      || ! strneq (nextname + ARMAP_END_INDEX, ARMAP_END, sizeof ARMAP_END - 1))
+      || strncmp (nextname + ARMAP_END_INDEX, ARMAP_END, sizeof ARMAP_END - 1) != 0)
     {
       abfd->has_armap = false;
       return true;
@@ -3641,7 +3639,9 @@ ecoff_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info)
          hash = srch;
        }
 
-      element = (*backend->get_elt_at_filepos) (abfd, (file_ptr) file_offset);
+      element = (*backend->get_elt_at_filepos) (abfd,
+                                               (file_ptr) file_offset,
+                                               info);
       if (element == NULL)
        return false;