Fix detection of missing plugin for LTO objects.
[external/binutils.git] / bfd / elf-eh-frame.c
index 95697c4..6919ac3 100644 (file)
@@ -1,5 +1,5 @@
 /* .eh_frame section optimization.
-   Copyright (C) 2001-2018 Free Software Foundation, Inc.
+   Copyright (C) 2001-2019 Free Software Foundation, Inc.
    Written by Jakub Jelinek <jakub@redhat.com>.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -797,6 +797,8 @@ _bfd_elf_parse_eh_frame (bfd *abfd, struct bfd_link_info *info,
              while (*aug != '\0')
                switch (*aug++)
                  {
+                 case 'B':
+                   break;
                  case 'L':
                    REQUIRE (read_byte (&buf, end, &cie->lsda_encoding));
                    ENSURE_NO_RELOCS (buf);
@@ -939,7 +941,7 @@ _bfd_elf_parse_eh_frame (bfd *abfd, struct bfd_link_info *info,
            {
              (*info->callbacks->minfo)
                /* xgettext:c-format */
-               (_("discarding zero address range FDE in %B(%A).\n"),
+               (_("discarding zero address range FDE in %pB(%pA).\n"),
                 abfd, sec);
              this_inf->u.fde.cie_inf = NULL;
            }
@@ -1042,9 +1044,9 @@ _bfd_elf_parse_eh_frame (bfd *abfd, struct bfd_link_info *info,
   goto success;
 
  free_no_table:
-  (*info->callbacks->einfo)
+  _bfd_error_handler
     /* xgettext:c-format */
-    (_("%P: error in %B(%A); no .eh_frame_hdr table will be created.\n"),
+    (_("error in %pB(%pA); no .eh_frame_hdr table will be created"),
      abfd, sec);
   hdr_info->u.dwarf.table = FALSE;
   if (sec_info)
@@ -1532,16 +1534,16 @@ _bfd_elf_discard_section_eh_frame
                hdr_info->u.dwarf.table = FALSE;
                if (num_warnings_issued < 10)
                  {
-                   (*info->callbacks->einfo)
+                   _bfd_error_handler
                      /* xgettext:c-format */
-                     (_("%P: FDE encoding in %B(%A) prevents .eh_frame_hdr"
-                        " table being created.\n"), abfd, sec);
+                     (_("FDE encoding in %pB(%pA) prevents .eh_frame_hdr"
+                        " table being created"), abfd, sec);
                    num_warnings_issued ++;
                  }
                else if (num_warnings_issued == 10)
                  {
-                   (*info->callbacks->einfo)
-                     (_("%P: Further warnings about FDE encoding preventing .eh_frame_hdr generation dropped.\n"));
+                   _bfd_error_handler
+                     (_("further warnings about FDE encoding preventing .eh_frame_hdr generation dropped"));
                    num_warnings_issued ++;
                  }
              }
@@ -1863,7 +1865,7 @@ _bfd_elf_write_section_eh_frame_entry (bfd *abfd, struct bfd_link_info *info,
       if (addr <= last_addr)
        {
          /* xgettext:c-format */
-         _bfd_error_handler (_("%B: %A not in order"), sec->owner, sec);
+         _bfd_error_handler (_("%pB: %pA not in order"), sec->owner, sec);
          return FALSE;
        }
 
@@ -1877,7 +1879,7 @@ _bfd_elf_write_section_eh_frame_entry (bfd *abfd, struct bfd_link_info *info,
   if (addr & 1)
     {
       /* xgettext:c-format */
-      _bfd_error_handler (_("%B: %A invalid input section size"),
+      _bfd_error_handler (_("%pB: %pA invalid input section size"),
                          sec->owner, sec);
       bfd_set_error (bfd_error_bad_value);
       return FALSE;
@@ -1885,7 +1887,7 @@ _bfd_elf_write_section_eh_frame_entry (bfd *abfd, struct bfd_link_info *info,
   if (last_addr >= addr + sec->rawsize)
     {
       /* xgettext:c-format */
-      _bfd_error_handler (_("%B: %A points past end of text section"),
+      _bfd_error_handler (_("%pB: %pA points past end of text section"),
                          sec->owner, sec);
       bfd_set_error (bfd_error_bad_value);
       return FALSE;
@@ -1991,7 +1993,7 @@ _bfd_elf_write_section_eh_frame (bfd *abfd,
              || ent->u.cie.per_encoding_relative)
            {
              char *aug;
-             unsigned int action, extra_string, extra_data;
+             unsigned int version, action, extra_string, extra_data;
              unsigned int per_width, per_encoding;
 
              /* Need to find 'R' or 'L' augmentation's argument and modify
@@ -2002,13 +2004,17 @@ _bfd_elf_write_section_eh_frame (bfd *abfd,
              extra_string = extra_augmentation_string_bytes (ent);
              extra_data = extra_augmentation_data_bytes (ent);
 
-             /* Skip length, id and version.  */
-             buf += 9;
+             /* Skip length, id.  */
+             buf += 8;
+             version = *buf++;
              aug = (char *) buf;
              buf += strlen (aug) + 1;
              skip_leb128 (&buf, end);
              skip_leb128 (&buf, end);
-             skip_leb128 (&buf, end);
+             if (version == 1)
+               skip_bytes (&buf, end, 1);
+             else
+               skip_leb128 (&buf, end);
              if (*aug == 'z')
                {
                  /* The uleb128 will always be a single byte for the kind
@@ -2133,9 +2139,9 @@ _bfd_elf_write_section_eh_frame (bfd *abfd,
                        address += elf_gp (abfd);
                        break;
                      default:
-                       (*info->callbacks->einfo)
-                         (_("%P: DW_EH_PE_datarel unspecified"
-                            " for this architecture.\n"));
+                       _bfd_error_handler
+                         (_("DW_EH_PE_datarel unspecified"
+                            " for this architecture"));
                        /* Fall thru */
                      case bfd_arch_frv:
                      case bfd_arch_i386:
@@ -2304,7 +2310,7 @@ _bfd_elf_fixup_eh_frame_hdr (struct bfd_link_info *info)
       if (sec->output_section != osec)
        {
          _bfd_error_handler
-           (_("Invalid output section for .eh_frame_entry: %A"),
+           (_("invalid output section for .eh_frame_entry: %pA"),
             sec->output_section);
          return FALSE;
        }
@@ -2327,7 +2333,7 @@ _bfd_elf_fixup_eh_frame_hdr (struct bfd_link_info *info)
   if (i != 0)
     {
       _bfd_error_handler
-       (_("Invalid contents in %A section"), osec);
+       (_("invalid contents in %pA section"), osec);
       return FALSE;
     }
 
@@ -2483,10 +2489,9 @@ write_dwarf_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
            overlap = TRUE;
        }
       if (overflow)
-       (*info->callbacks->einfo) (_("%P: .eh_frame_hdr entry overflow.\n"));
+       _bfd_error_handler (_(".eh_frame_hdr entry overflow"));
       if (overlap)
-       (*info->callbacks->einfo)
-         (_("%P: .eh_frame_hdr refers to overlapping FDEs.\n"));
+       _bfd_error_handler (_(".eh_frame_hdr refers to overlapping FDEs"));
       if (overflow || overlap)
        {
          bfd_set_error (bfd_error_bad_value);