Fix SBO bit in disassembly mask for ldrah on AArch64.
[deliverable/binutils-gdb.git] / binutils / readelf.c
index 8335538e0334572d164e4fd50f292ea25ac42bbb..88fb356cd8d6eead02ab3b24d2f5452a56f3a532 100644 (file)
@@ -11266,7 +11266,7 @@ get_symbol_version_string (Filedata *                   filedata,
 
   vers_data = byte_get (data, 2);
 
-  if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data <= 1)
+  if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data == 0)
     return NULL;
 
   /* Usually we'd only see verdef for defined symbols, and verneed for
@@ -11301,12 +11301,14 @@ get_symbol_version_string (Filedata *                   filedata,
              ivd.vd_ndx = 0;
              ivd.vd_aux = 0;
              ivd.vd_next = 0;
+             ivd.vd_flags = 0;
            }
          else
            {
              ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
              ivd.vd_aux = BYTE_GET (evd.vd_aux);
              ivd.vd_next = BYTE_GET (evd.vd_next);
+             ivd.vd_flags = BYTE_GET (evd.vd_flags);
            }
 
          off += ivd.vd_next;
@@ -11315,6 +11317,9 @@ get_symbol_version_string (Filedata *                   filedata,
 
       if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
        {
+         if (ivd.vd_ndx == 1 && ivd.vd_flags == VER_FLG_BASE) 
+           return NULL;
+
          off -= ivd.vd_next;
          off += ivd.vd_aux;
 
@@ -12654,6 +12659,8 @@ is_16bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
       return reloc_type == 9; /* R_NIOS_16.  */
     case EM_OR1K:
       return reloc_type == 2; /* R_OR1K_16.  */
+    case EM_RISCV:
+      return reloc_type == 55; /* R_RISCV_SET16.  */
     case EM_TI_PRU:
       return reloc_type == 8; /* R_PRU_BFD_RELOC_16.  */
     case EM_TI_C6000:
@@ -12670,6 +12677,36 @@ is_16bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
     }
 }
 
+/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
+   a 8-bit absolute RELA relocation used in DWARF debug sections.  */
+
+static bfd_boolean
+is_8bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
+{
+  switch (filedata->file_header.e_machine)
+    {
+    case EM_RISCV:
+      return reloc_type == 54; /* R_RISCV_SET8.  */
+    default:
+      return FALSE;
+    }
+}
+
+/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
+   a 6-bit absolute RELA relocation used in DWARF debug sections.  */
+
+static bfd_boolean
+is_6bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
+{
+  switch (filedata->file_header.e_machine)
+    {
+    case EM_RISCV:
+      return reloc_type == 53; /* R_RISCV_SET6.  */
+    default:
+      return FALSE;
+    }
+}
+
 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
    a 32-bit inplace add RELA relocation used in DWARF debug sections.  */
 
@@ -12798,6 +12835,21 @@ is_8bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
     }
 }
 
+/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
+   a 6-bit inplace sub RELA relocation used in DWARF debug sections.  */
+
+static bfd_boolean
+is_6bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
+{
+  switch (filedata->file_header.e_machine)
+    {
+    case EM_RISCV:
+      return reloc_type == 52; /* R_RISCV_SUB6.  */
+    default:
+      return FALSE;
+    }
+}
+
 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
    relocation entries (possibly formerly used for SHT_GROUP sections).  */
 
@@ -13001,6 +13053,9 @@ apply_relocations (Filedata *                 filedata,
            reloc_size = 3;
          else if (is_16bit_abs_reloc (filedata, reloc_type))
            reloc_size = 2;
+         else if (is_8bit_abs_reloc (filedata, reloc_type)
+                  || is_6bit_abs_reloc (filedata, reloc_type))
+           reloc_size = 1;
          else if ((reloc_subtract = is_32bit_inplace_sub_reloc (filedata,
                                                                 reloc_type))
                   || is_32bit_inplace_add_reloc (filedata, reloc_type))
@@ -13029,6 +13084,12 @@ apply_relocations (Filedata *                 filedata,
              reloc_size = 1;
              reloc_inplace = TRUE;
            }
+         else if ((reloc_subtract = is_6bit_inplace_sub_reloc (filedata,
+                                                               reloc_type)))
+           {
+             reloc_size = 1;
+             reloc_inplace = TRUE;
+           }
          else
            {
              static unsigned int prev_reloc = 0;
@@ -13101,7 +13162,12 @@ apply_relocations (Filedata *                 filedata,
                   || filedata->file_header.e_machine == EM_CYGNUS_D30V)
                  && reloc_type == 12)
              || reloc_inplace)
-           addend += byte_get (rloc, reloc_size);
+           {
+             if (is_6bit_inplace_sub_reloc (filedata, reloc_type))
+               addend += byte_get (rloc, reloc_size) & 0x3f;
+             else
+               addend += byte_get (rloc, reloc_size);
+           }
 
          if (is_32bit_pcrel_reloc (filedata, reloc_type)
              || is_64bit_pcrel_reloc (filedata, reloc_type))
@@ -13112,6 +13178,16 @@ apply_relocations (Filedata *                 filedata,
              byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
                        reloc_size);
            }
+         else if (is_6bit_abs_reloc (filedata, reloc_type)
+                  || is_6bit_inplace_sub_reloc (filedata, reloc_type))
+           {
+             if (reloc_subtract)
+               addend -= sym->st_value;
+             else
+               addend += sym->st_value;
+             addend = (addend & 0x3f) | (byte_get (rloc, reloc_size) & 0xc0);
+             byte_put (rloc, addend, reloc_size);
+           }
          else if (reloc_subtract)
            byte_put (rloc, addend - sym->st_value, reloc_size);
          else
@@ -15504,6 +15580,10 @@ print_mips_ases (unsigned int mask)
     fputs ("\n\tXPA ASE", stdout);
   if (mask & AFL_ASE_MIPS16E2)
     fputs ("\n\tMIPS16e2 ASE", stdout);
+  if (mask & AFL_ASE_CRC)
+    fputs ("\n\tCRC ASE", stdout);
+  if (mask & AFL_ASE_GINV)
+    fputs ("\n\tGINV ASE", stdout);
   if (mask == 0)
     fprintf (stdout, "\n\t%s", _("None"));
   else if ((mask & ~AFL_ASE_MASK) != 0)
@@ -17625,6 +17705,20 @@ get_symbol_for_build_attribute (Filedata *       filedata,
   return saved_sym;
 }
 
+/* Returns true iff addr1 and addr2 are in the same section.  */
+
+static bfd_boolean
+same_section (Filedata * filedata, unsigned long addr1, unsigned long addr2)
+{
+  Elf_Internal_Shdr * a1;
+  Elf_Internal_Shdr * a2;
+
+  a1 = find_section_by_address (filedata, addr1);
+  a2 = find_section_by_address (filedata, addr2);
+  
+  return a1 == a2 && a1 != NULL;
+}
+
 static bfd_boolean
 print_gnu_build_attribute_description (Elf_Internal_Note *  pnote,
                                       Filedata *           filedata)
@@ -17706,8 +17800,14 @@ print_gnu_build_attribute_description (Elf_Internal_Note *  pnote,
 
   if (is_open_attr)
     {
-      /* FIXME: Need to properly allow for section alignment.  16 is just the alignment used on x86_64.  */
-      if (global_end > 0 && start > BFD_ALIGN (global_end, 16))
+      /* FIXME: Need to properly allow for section alignment.
+        16 is just the alignment used on x86_64.  */
+      if (global_end > 0
+         && start > BFD_ALIGN (global_end, 16)
+         /* Build notes are not guaranteed to be organised in order of
+            increasing address, but we should find the all of the notes
+            for one section in the same place.  */
+         && same_section (filedata, start, global_end))
        warn (_("Gap in build notes detected from %#lx to %#lx\n"),
              global_end + 1, start - 1);
 
This page took 0.030091 seconds and 4 git commands to generate.