This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Don't relocate R_MIPS_JALR against dynamic symbols


Adam Nemet <anemet@caviumnetworks.com> writes:
> Index: elfxx-mips.c
> ===================================================================
> RCS file: /cvs/src/src/bfd/elfxx-mips.c,v
> retrieving revision 1.257
> diff -F^\([(a-zA-Z0-9_]\|#define\) -u -p -u -p -F^\([(a-zA-Z0-9_]\|#define\) -r1.257 elfxx-mips.c
> --- elfxx-mips.c	5 Aug 2009 21:17:51 -0000	1.257
> +++ elfxx-mips.c	22 Aug 2009 17:55:10 -0000
> @@ -5489,8 +5489,9 @@ mips_elf_calculate_relocation (bfd *abfd
>      case R_MIPS_JALR:
>        /* This relocation is only a hint.  In some cases, we optimize
>  	 it into a bal instruction.  But we don't try to optimize
> -	 branches to the PLT; that will wind up wasting time.  */
> -      if (h != NULL && h->root.plt.offset != (bfd_vma) -1)
> +	 branches to symbols in shared object; those either go to the
> +	 lazy stub or can only be resolved at run-time.  */
> +      if (h != NULL && !h->root.def_regular)
>  	return bfd_reloc_continue;
>        value = symbol + addend;
>        break;

I agree this is an improvement, but couldn't we still end up
using BAL when we shouldn't if:

  (a) the link is not -Bsymbolic
  (b) the function has a regular .o definition
  (c) no call references are lazily bound (either because the
      author decided to use %got* instead of %call*, or because
      -znow is in effect)

?  I think we want:

     if (h != NULL && !SYMBOL_CALLS_LOCAL (info, h))

instead.

Richard


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]