Re: SHF_LINK_ORDER fixup_link_order in ld
authorAlan Modra <amodra@gmail.com>
Wed, 13 Jan 2021 22:18:49 +0000 (08:48 +1030)
committerAlan Modra <amodra@gmail.com>
Wed, 13 Jan 2021 22:21:29 +0000 (08:51 +1030)
PR 27160
* ldelfgen.c (compare_link_order): Protect access of ELF section
data.
(add_link_order_input_section): Remove redundant NULL check.
Use bfd_get_flavour.
(ldelf_map_segments): Use bfd_get_flavour.

ld/ChangeLog
ld/ldelfgen.c

index 2dad0b9878df46a730d810e8c52a062640135251..60a31032b77b3e2724558cd3178983b861df1e1c 100644 (file)
@@ -1,3 +1,12 @@
+2021-01-14  Alan Modra  <amodra@gmail.com>
+
+       PR 27160
+       * ldelfgen.c (compare_link_order): Protect access of ELF section
+       data.
+       (add_link_order_input_section): Remove redundant NULL check.
+       Use bfd_get_flavour.
+       (ldelf_map_segments): Use bfd_get_flavour.
+
 2021-01-13  H.J. Lu  <hongjiu.lu@intel.com>
 
        * ldelfgen.c (add_link_order_input_section): Check for ELF input
index 47e7a2a68edae4eb05866a36a9204e9f8ed3de08..df3dae0abe8c45b08086257531a48f582df8705a 100644 (file)
@@ -79,9 +79,8 @@ add_link_order_input_section (lang_input_section_type *is,
   os_info->isec[os_info->count].idx = os_info->count;
   os_info->count++;
   s = is->section;
-  if (s->owner->xvec->flavour == bfd_target_elf_flavour
+  if (bfd_get_flavour (s->owner) == bfd_target_elf_flavour
       && (s->flags & SEC_LINKER_CREATED) == 0
-      && elf_section_data (s) != NULL
       && elf_linked_to_section (s) != NULL)
     os_info->ordered++;
   return FALSE;
@@ -145,10 +144,15 @@ compare_link_order (const void *a, const void *b)
 {
   const struct os_sections_input *ai = a;
   const struct os_sections_input *bi = b;
-  asection *asec = elf_linked_to_section (ai->is->section);
-  asection *bsec = elf_linked_to_section (bi->is->section);
+  asection *asec = NULL;
+  asection *bsec = NULL;
   bfd_vma apos, bpos;
 
+  if (bfd_get_flavour (ai->is->section->owner) == bfd_target_elf_flavour)
+    asec = elf_linked_to_section (ai->is->section);
+  if (bfd_get_flavour (bi->is->section->owner) == bfd_target_elf_flavour)
+    bsec = elf_linked_to_section (bi->is->section);
+
   /* Place unordered sections before ordered sections.  */
   if (asec == NULL || bsec == NULL)
     {
@@ -257,7 +261,7 @@ ldelf_map_segments (bfd_boolean need_layout)
       lang_relax_sections (need_layout);
       need_layout = FALSE;
 
-      if (link_info.output_bfd->xvec->flavour == bfd_target_elf_flavour)
+      if (bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour)
        {
          lang_output_section_statement_type *os;
          if (!done_link_order_scan)
@@ -285,7 +289,7 @@ ldelf_map_segments (bfd_boolean need_layout)
            }
        }
 
-      if (link_info.output_bfd->xvec->flavour == bfd_target_elf_flavour
+      if (bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour
          && !bfd_link_relocatable (&link_info))
        {
          bfd_size_type phdr_size;
@@ -319,7 +323,7 @@ ldelf_map_segments (bfd_boolean need_layout)
   if (tries == 0)
     einfo (_("%F%P: looping in map_segments"));
 
-  if (link_info.output_bfd->xvec->flavour == bfd_target_elf_flavour
+  if (bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour
       && lang_phdr_list == NULL)
     {
       /* If we don't have user supplied phdrs, strip zero-sized dynamic