Preserve all mapping symbols in ARM and AArch64 object files.
authorNick Clifton <nickc@redhat.com>
Wed, 29 Jun 2016 10:17:40 +0000 (11:17 +0100)
committerNick Clifton <nickc@redhat.com>
Wed, 29 Jun 2016 10:17:40 +0000 (11:17 +0100)
bfd * elfnn-aarch64.c (is_aarch64_mapping_symbol): New function.
Returns TRUE for AArch64 mapping symbols.
(elfNN_aarch64_backend_symbol_processing): New function.  Marks
mapping symbols as precious in object files so that they will not
be stripped.
(elf_backend_symbol_processing): Define.

* elf32-arm.c (is_arm_mapping_symbol): New function.  Returns TRUE
for ARM mapping symbols.
(elf32_arm_backend_symbol_processing): Make use of the new function.

bfd/ChangeLog
bfd/elf32-arm.c
bfd/elfnn-aarch64.c

index 9e2534e03b0096f07b610a0454f2ac729d998fec..90e34ac86549a4a0202aa08115a1ef2e448fd4dd 100644 (file)
@@ -1,3 +1,16 @@
+2016-06-29  Nick Clifton  <nickc@redhat.com>
+
+       * elfnn-aarch64.c (is_aarch64_mapping_symbol): New function.
+       Returns TRUE for AArch64 mapping symbols.
+       (elfNN_aarch64_backend_symbol_processing): New function.  Marks
+       mapping symbols as precious in object files so that they will not
+       be stripped.
+       (elf_backend_symbol_processing): Define.
+
+       * elf32-arm.c (is_arm_mapping_symbol): New function.  Returns TRUE
+       for ARM mapping symbols.
+       (elf32_arm_backend_symbol_processing): Make use of the new function.
+
 2016-06-28  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR ld/20306
index 04e776c99f7b193686f80d13662bcc4c9959872d..3d4a458fe46b2f2e0674ff31d95fa57dab51999c 100644 (file)
@@ -18266,6 +18266,28 @@ elf32_arm_copy_special_section_fields (const bfd *ibfd ATTRIBUTE_UNUSED,
   return FALSE;
 }
 
+/* Returns TRUE if NAME is an ARM mapping symbol.
+   Traditionally the symbols $a, $d and $t have been used.
+   The ARM ELF standard also defines $x (for A64 code).  It also allows a
+   period initiated suffix to be added to the symbol: "$[adtx]\.[:sym_char]+".
+   Other tools might also produce $b (Thumb BL), $f, $p, $m and $v, but we do
+   not support them here.  $t.x indicates the start of ThumbEE instructions.  */
+
+static bfd_boolean
+is_arm_mapping_symbol (const char * name)
+{
+  return name != NULL /* Paranoia.  */
+    && name[0] == '$' /* Note: if objcopy --prefix-symbols has been used then
+                        the mapping symbols could have acquired a prefix.
+                        We do not support this here, since such symbols no
+                        longer conform to the ARM ELF ABI.  */
+    && (name[1] == 'a' || name[1] == 'd' || name[1] == 't' || name[1] == 'x')
+    && (name[2] == 0 || name[2] == '.');
+  /* FIXME: Strictly speaking the symbol is only a valid mapping symbol if
+     any characters that follow the period are legal characters for the body
+     of a symbol's name.  For now we just assume that this is the case.  */
+}
+
 /* Make sure that mapping symbols in object files are not removed via the
    "strip --strip-unneeded" tool.  These symbols are needed in order to
    correctly generate interworking veneers, and for byte swapping code
@@ -18276,11 +18298,8 @@ static void
 elf32_arm_backend_symbol_processing (bfd *abfd, asymbol *sym)
 {
   if (((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
-      && sym->name != NULL
       && sym->section != bfd_abs_section_ptr
-      && (strcmp (sym->name, "$a") == 0
-         || strcmp (sym->name, "$t") == 0
-         || strcmp (sym->name, "$d") == 0))
+      && is_arm_mapping_symbol (sym->name))
     sym->flags |= BSF_KEEP;
 }
 
index fa66b0f595042c72729243cfb374208613ec904b..3435a3d67339858726177a6096bd8f3260d91686 100644 (file)
@@ -9212,6 +9212,40 @@ elfNN_aarch64_plt_sym_val (bfd_vma i, const asection *plt,
   return plt->vma + PLT_ENTRY_SIZE + i * PLT_SMALL_ENTRY_SIZE;
 }
 
+/* Returns TRUE if NAME is an AArch64 mapping symbol.
+   The ARM ELF standard defines $x (for A64 code) and $d (for data).
+   It also allows a period initiated suffix to be added to the symbol, ie:
+   "$[adtx]\.[:sym_char]+".  */
+
+static bfd_boolean
+is_aarch64_mapping_symbol (const char * name)
+{
+  return name != NULL /* Paranoia.  */
+    && name[0] == '$' /* Note: if objcopy --prefix-symbols has been used then
+                        the mapping symbols could have acquired a prefix.
+                        We do not support this here, since such symbols no
+                        longer conform to the ARM ELF ABI.  */
+    && (name[1] == 'd' || name[1] == 'x')
+    && (name[2] == 0 || name[2] == '.');
+  /* FIXME: Strictly speaking the symbol is only a valid mapping symbol if
+     any characters that follow the period are legal characters for the body
+     of a symbol's name.  For now we just assume that this is the case.  */
+}
+
+/* Make sure that mapping symbols in object files are not removed via the
+   "strip --strip-unneeded" tool.  These symbols might needed in order to
+   correctly generate linked files.  Once an object file has been linked,
+   it should be safe to remove them.  */
+
+static void
+elfNN_aarch64_backend_symbol_processing (bfd *abfd, asymbol *sym)
+{
+  if (((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
+      && sym->section != bfd_abs_section_ptr
+      && is_aarch64_mapping_symbol (sym->name))
+    sym->flags |= BSF_KEEP;
+}
+
 
 /* We use this so we can override certain functions
    (though currently we don't).  */
@@ -9351,6 +9385,9 @@ const struct elf_size_info elfNN_aarch64_size_info =
 #define elf_backend_write_section              \
   elfNN_aarch64_write_section
 
+#define elf_backend_symbol_processing          \
+  elfNN_aarch64_backend_symbol_processing
+
 #define elf_backend_can_refcount       1
 #define elf_backend_can_gc_sections    1
 #define elf_backend_plt_readonly       1