This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc 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 glibc 2/2] aarch64: handle STO_AARCH64_VARIANT_PCS


* Szabolcs Nagy:

>    /* Check for unexpected PLT reloc type.  */
>    if (__builtin_expect (r_type == AARCH64_R(JUMP_SLOT), 1))
>      {
> -      if (__builtin_expect (map->l_mach.plt, 0) == 0)
> -	*reloc_addr += l_addr;
> -      else
> -	*reloc_addr = map->l_mach.plt;
> +      if (map->l_mach.plt == 0)
> +	{
> +	  /* Prelinking.  */
> +	  *reloc_addr += l_addr;
> +	  return;
> +	}
> +
> +      if (__glibc_unlikely (map->l_mach.variant_pcs))
> +	{
> +	  /* Check the symbol table for variant PCS symbols.  */
> +	  const Elf_Symndx symndx = ELFW (R_SYM) (reloc->r_info);
> +	  const ElfW (Sym) *symtab =
> +	    (const void *)D_PTR (map, l_info[DT_SYMTAB]);
> +	  const ElfW (Sym) *sym = &symtab[symndx];
> +	  if (__glibc_unlikely (sym->st_other & STO_AARCH64_VARIANT_PCS))
> +	    {
> +	      /* Avoid lazy resolution of variant PCS symbols.  */
> +	      const struct r_found_version *version = NULL;
> +	      if (map->l_info[VERSYMIDX (DT_VERSYM)] != NULL)
> +		{
> +		  const ElfW (Half) *vernum =
> +		    (const void *)D_PTR (map, l_info[VERSYMIDX (DT_VERSYM)]);
> +		  version = &map->l_versions[vernum[symndx] & 0x7fff];
> +		}
> +	      elf_machine_rela (map, reloc, sym, version, reloc_addr,
> +				skip_ifunc);
> +	      return;
> +	    }
> +	}
> +
> +      *reloc_addr = map->l_mach.plt;

Looking at this, I wonder if it would be more natural to handle this as
a new relocation type.  This way, you will get an error from old dynamic
linkers.

Thanks,
Florian


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