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:
parent
6844c0ccea
commit
d691934d08
3 changed files with 73 additions and 4 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue