_dl_profile_map = l;
GL(dl_profile_map) = l;
elf_machine_runtime_setup (struct link_map *l, int lazy, int profile){  Elf64_Addr plt;  extern void _dl_runtime_resolve (void);  extern void _dl_runtime_profile (void);  if (l->l_info[DT_JMPREL] && lazy)    {      /* The GOT entries for the functions in the PLT have not been	 filled in yet.  Their initial contents are directed to the	 PLT which arranges for the dynamic linker to be called.  */      plt = D_PTR (l, l_info[DT_PLTGOT]);      /* This function will be called to perform the relocation.  */      if (!profile)        *(Elf64_Addr *)(plt + 16) = (Elf64_Addr) &_dl_runtime_resolve;      else	{	  *(Elf64_Addr *)(plt + 16) = (Elf64_Addr) &_dl_runtime_profile;	  if (_dl_name_match_p (_dl_profile, l))	    {	      /* This is the object we are looking for.  Say that we really		 want profiling and the timers are started.  */	      _dl_profile_map = l;	    }	}      /* Identify this shared object */      *(Elf64_Addr *)(plt + 24) = (Elf64_Addr) l;      /* If the first instruction of the plt entry is not	 "br $28, plt0", we have to reinitialize .plt for lazy relocation.  */      if (*(unsigned int *)(plt + 32) != 0xc39ffff7)	{	  unsigned int val = 0xc39ffff7;	  unsigned int *slot, *end;	  const Elf64_Rela *rela = (const Elf64_Rela *)				   D_PTR (l, l_info[DT_JMPREL]);	  Elf64_Addr l_addr = l->l_addr;	  /* br t12,.+4; ldq t12,12(t12); nop; jmp t12,(t12),.+4 */	  *(unsigned long *)plt = 0xa77b000cc3600000;	  *(unsigned long *)(plt + 8) = 0x6b7b000047ff041f;	  slot = (unsigned int *)(plt + 32);	  end = (unsigned int *)(plt + 32				 + l->l_info[DT_PLTRELSZ]->d_un.d_val / 2);	  while (slot < end)	    {	      /* br at,.plt+0 */	      *slot = val;	      *(Elf64_Addr *) rela->r_offset = (Elf64_Addr) slot - l_addr;	      val -= 3;	      slot += 3;	      ++rela;	    }	}    }  return lazy;}