mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-28 04:25:10 +08:00
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
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user