Preserve all mapping symbols in ARM and AArch64 object files.

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.
This commit is contained in:
Nick Clifton 2016-06-29 11:17:40 +01:00
parent 6844c0ccea
commit d691934d08
3 changed files with 73 additions and 4 deletions

View 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> 2016-06-28 H.J. Lu <hongjiu.lu@intel.com>
PR ld/20306 PR ld/20306

View File

@ -18266,6 +18266,28 @@ elf32_arm_copy_special_section_fields (const bfd *ibfd ATTRIBUTE_UNUSED,
return FALSE; 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 /* Make sure that mapping symbols in object files are not removed via the
"strip --strip-unneeded" tool. These symbols are needed in order to "strip --strip-unneeded" tool. These symbols are needed in order to
correctly generate interworking veneers, and for byte swapping code correctly generate interworking veneers, and for byte swapping code
@ -18276,11 +18298,8 @@ static void
elf32_arm_backend_symbol_processing (bfd *abfd, asymbol *sym) elf32_arm_backend_symbol_processing (bfd *abfd, asymbol *sym)
{ {
if (((abfd->flags & (EXEC_P | DYNAMIC)) == 0) if (((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
&& sym->name != NULL
&& sym->section != bfd_abs_section_ptr && sym->section != bfd_abs_section_ptr
&& (strcmp (sym->name, "$a") == 0 && is_arm_mapping_symbol (sym->name))
|| strcmp (sym->name, "$t") == 0
|| strcmp (sym->name, "$d") == 0))
sym->flags |= BSF_KEEP; sym->flags |= BSF_KEEP;
} }

View 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; 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 /* We use this so we can override certain functions
(though currently we don't). */ (though currently we don't). */
@ -9351,6 +9385,9 @@ const struct elf_size_info elfNN_aarch64_size_info =
#define elf_backend_write_section \ #define elf_backend_write_section \
elfNN_aarch64_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_refcount 1
#define elf_backend_can_gc_sections 1 #define elf_backend_can_gc_sections 1
#define elf_backend_plt_readonly 1 #define elf_backend_plt_readonly 1