Treat the .gnu.debuglink and .gnu.debugaltlink sections as debug sections when readin...
[deliverable/binutils-gdb.git] / bfd / elfxx-x86.c
index 8d08a69d22c3800f5b3ba6183463c45691bc0dfe..78ed41ad381f771ce0e6d17decf224d6bb6894df 100644 (file)
@@ -1381,7 +1381,8 @@ _bfd_x86_elf_size_dynamic_sections (bfd *output_bfd,
                {
                  info->callbacks->einfo
                    (_("%P%X: read-only segment has dynamic IFUNC relocations;"
-                      " recompile with -fPIC\n"));
+                      " recompile with %s\n"),
+                    bfd_link_dll (info) ? "-fPIC" : "-fPIE");
                  bfd_set_error (bfd_error_bad_value);
                  return FALSE;
                }
@@ -2583,9 +2584,17 @@ _bfd_x86_elf_link_setup_gnu_properties
 
   features = 0;
   if (htab->params->ibt)
-    features = GNU_PROPERTY_X86_FEATURE_1_IBT;
+    {
+      features = GNU_PROPERTY_X86_FEATURE_1_IBT;
+      htab->params->cet_report &= ~cet_report_ibt;
+    }
   if (htab->params->shstk)
-    features |= GNU_PROPERTY_X86_FEATURE_1_SHSTK;
+    {
+      features |= GNU_PROPERTY_X86_FEATURE_1_SHSTK;
+      htab->params->cet_report &= ~cet_report_shstk;
+    }
+  if (!(htab->params->cet_report & (cet_report_ibt | cet_report_shstk)))
+    htab->params->cet_report = cet_report_none;
 
   if (ebfd != NULL)
     {
@@ -2626,6 +2635,54 @@ error_alignment:
        }
     }
 
+  if (htab->params->cet_report)
+    {
+      /* Report missing IBT and SHSTK properties.  */
+      bfd *abfd;
+      const char *msg;
+      elf_property_list *p;
+      bfd_boolean missing_ibt, missing_shstk;
+      bfd_boolean check_ibt
+       = !!(htab->params->cet_report & cet_report_ibt);
+      bfd_boolean check_shstk
+       = !!(htab->params->cet_report & cet_report_shstk);
+
+      if ((htab->params->cet_report & cet_report_warning))
+       msg = _("%P: %pB: warning: missing %s\n");
+      else
+       msg = _("%X%P: %pB: error: missing %s\n");
+
+      for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link.next)
+       if (!(abfd->flags & (DYNAMIC | BFD_PLUGIN | BFD_LINKER_CREATED))
+           && bfd_get_flavour (abfd) == bfd_target_elf_flavour)
+         {
+           for (p = elf_properties (abfd); p; p = p->next)
+             if (p->property.pr_type == GNU_PROPERTY_X86_FEATURE_1_AND)
+               break;
+
+           missing_ibt = check_ibt;
+           missing_shstk = check_shstk;
+           if (p)
+             {
+               missing_ibt &= !(p->property.u.number
+                                & GNU_PROPERTY_X86_FEATURE_1_IBT);
+               missing_shstk &= !(p->property.u.number
+                                  & GNU_PROPERTY_X86_FEATURE_1_SHSTK);
+             }
+           if (missing_ibt || missing_shstk)
+             {
+               const char *missing;
+               if (missing_ibt && missing_shstk)
+                 missing = _("IBT and SHSTK properties");
+               else if (missing_ibt)
+                 missing = _("IBT property");
+               else
+                 missing = _("SHSTK property");
+               info->callbacks->einfo (msg, abfd, missing);
+             }
+         }
+    }
+
   pbfd = _bfd_elf_link_setup_gnu_properties (info);
 
   htab->r_info = init_table->r_info;
This page took 0.024218 seconds and 4 git commands to generate.