ARM mapping symbols and --strip-unneeded
Richard Earnshaw (lists)
Richard.Earnshaw@arm.com
Wed Jun 29 09:26:00 GMT 2016
On 29/06/16 10:24, Nick Clifton wrote:
> Hi Richard,
>
>> Might be safer to use strncmp (sym, type, 2) since 'extended' mapping
>> symbols can be produced by some tools.
>
> We might as well extract mapping symbol determination into a separate
> function - I have a feeling that it is going to be needed again in the
> future. So what do you think of this patch ?
>
Even better. Thanks.
R.
> Cheers
> Nick
>
> diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
> index 04e776c..105e3cc 100644
> --- a/bfd/elf32-arm.c
> +++ b/bfd/elf32-arm.c
> @@ -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_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_mapping_symbol (sym->name))
> sym->flags |= BSF_KEEP;
> }
>
More information about the Binutils
mailing list