[PATCH 1/2] readelf: Fix symbol display for RELR relocs

Szabolcs Nagy szabolcs.nagy@arm.com
Wed May 29 10:39:18 GMT 2024


The 05/29/2024 10:54, Nick Clifton wrote:
> Hi Szabolcs,
> 
> > Filter symbols before binary searching for the right symbol to display
> > for a given address, such that only displayable symbols are present and
> > at most one per address.
> > 
> > The current logic does not handle multiple symbols for the same address
> > well if some of them are empty, the selected symbol is not stable with
> > respect to an unrelated symbol table change and on aarch64 often mapping
> > symbols are displayed which is not useful.
> > 
> > Filtering solves these problems at the cost of a linear scan of the
> > sorted symbol table.
> > 
> > The heuristic to select the best symbol likely could be improved, this
> > patch aims to improve symbol display for RELR without complex logic
> > such that the output is useful and stable for ld tests.
> > ---
> 
> I like the patch, but there are a couple of things that I think should be
> changed:
> 
> > +static bool
> > +is_aarch64_special_symbol_name (const char *name)
> > +{
> > +  if (!name || name[0] != '$')
> > +    return false;
> > +  if (name[1] == 'x' || name[1] == 'd')
> > +    return true;
> > +  else if (name[1] == 'm' || name[1] == 'f' || name[1] == 'p')
> > +    return true;
> > +  else
> > +    return false;
> > +  return name[2] == 0 || name[2] == '.';
> > +}
> 
> Can that last line (checking name[2]) ever be reached ?

i tried to copy the logic from bfd/cpu-aarch64.c, but i
see that i messed up: the 'return true;' should be nop ';'.


> > +  if (filedata->file_header.e_machine == EM_AARCH64)
> > +    {
> > +      /* Don't display mapping symbols.  */
> > +      if (is_aarch64_special_symbol_name (s))
> > +	return best;
> > +    }
> 
> I think that you should change this to calling a generic checking
> function which then runs architecture specific tests.  (Since there
> are other architectures which also have special symbols).  ie:
> 
>    if (is_special_symbol (filedata, s))
>      return best;

ok.

thanks for the quick review.

> 
>   [...]
> 
>   static bool
>   is_special_symbol (Filedata * filedata, Elf_Internal_Sym * s)
>   {
>      switch (filedata->file_header.e_machine)
>      {
>      case EM_AARCh64: return is_aarch64_special_symbol (s);
>   #if 0 /* Future expansion here...  */
>      case EM_MIPS: return is_mips_special_symbol (s);
>   #endif
>      default: return false;
>   }
> 
> Cheers
>   Nick
> 


More information about the Binutils mailing list