Stop symbols generated by the annobin gcc plugin from breaking the disassembly of...
authorNick Clifton <nickc@redhat.com>
Thu, 10 Sep 2020 12:23:11 +0000 (13:23 +0100)
committerNick Clifton <nickc@redhat.com>
Thu, 10 Sep 2020 12:23:11 +0000 (13:23 +0100)
* ppc-dis.c (ppc_symbol_is_valid): New function.  Returns false
for hidden, local, no-type symbols.
(disassemble_init_powerpc): Point the symbol_is_valid field in the
info structure at the new function.

opcodes/ChangeLog
opcodes/ppc-dis.c

index 865bf148fe74a041f880c576616e0809fde49b5c..d4d1865b584813111c3ad5a43f2c977db94f85ea 100644 (file)
@@ -1,3 +1,10 @@
+2020-09-10  Nick Clifton  <nickc@redhat.com>
+
+       * ppc-dis.c (ppc_symbol_is_valid): New function.  Returns false
+       for hidden, local, no-type symbols.
+       (disassemble_init_powerpc): Point the symbol_is_valid field in the
+       info structure at the new function.
+
 2020-09-10  Cooper Qu  <cooper.qu@linux.alibaba.com>
 
        * csky-opc.h (csky_v2_opcodes): Add L2Cache instructions.
index eca1f36710814cc991f13a2cdbb0d5062ef53355..4e8e3cb462835bbdb9e87b6af40c5fdeaf86d3b8 100644 (file)
@@ -399,12 +399,36 @@ static unsigned short vle_opcd_indices[VLE_OPCD_SEGS + 1];
 #define SPE2_OPCD_SEGS (1 + SPE2_XOP_TO_SEG (SPE2_XOP (-1)))
 static unsigned short spe2_opcd_indices[SPE2_OPCD_SEGS + 1];
 
+static bfd_boolean
+ppc_symbol_is_valid (asymbol *sym,
+                    struct disassemble_info *info ATTRIBUTE_UNUSED)
+{
+  elf_symbol_type * est;
+
+  if (sym == NULL)
+    return FALSE;
+
+  est = elf_symbol_from (NULL, sym);
+  
+  /* Ignore ELF hidden, local, no-type symbols.
+     These are generated by annobin.  */
+  if (est != NULL
+      && ELF_ST_VISIBILITY (est->internal_elf_sym.st_other) == STV_HIDDEN
+      && ELF_ST_BIND (est->internal_elf_sym.st_info) == STB_LOCAL
+      && ELF_ST_TYPE (est->internal_elf_sym.st_info) == STT_NOTYPE)
+    return FALSE;
+
+  return TRUE;
+}
+
 /* Calculate opcode table indices to speed up disassembly,
    and init dialect.  */
 
 void
 disassemble_init_powerpc (struct disassemble_info *info)
 {
+  info->symbol_is_valid = ppc_symbol_is_valid;
+
   if (powerpc_opcd_indices[PPC_OPCD_SEGS] == 0)
     {
       unsigned seg, idx, op;