|| (_dl_verbose && sym->st_size < refsym->st_size))
|| (GL(dl_verbose) && sym->st_size < refsym->st_size))
__process_machine_rela (struct link_map *map,			const Elf32_Rela *reloc,			const Elf32_Sym *sym,			const Elf32_Sym *refsym,			Elf32_Addr *const reloc_addr,			Elf32_Addr const finaladdr,			int rinfo){  switch (rinfo)    {    case R_PPC_NONE:      return;    case R_PPC_ADDR32:    case R_PPC_UADDR32:    case R_PPC_GLOB_DAT:    case R_PPC_RELATIVE:      *reloc_addr = finaladdr;      return;    case R_PPC_ADDR24:      if (finaladdr > 0x01fffffc && finaladdr < 0xfe000000)	dl_reloc_overflow (map,  "R_PPC_ADDR24", reloc_addr, sym, refsym);      *reloc_addr = (*reloc_addr & 0xfc000003) | (finaladdr & 0x3fffffc);      break;    case R_PPC_ADDR16:    case R_PPC_UADDR16:      if (finaladdr > 0x7fff && finaladdr < 0x8000)	dl_reloc_overflow (map,  "R_PPC_ADDR16", reloc_addr, sym, refsym);      *(Elf32_Half*) reloc_addr = finaladdr;      break;    case R_PPC_ADDR16_LO:      *(Elf32_Half*) reloc_addr = finaladdr;      break;    case R_PPC_ADDR16_HI:      *(Elf32_Half*) reloc_addr = finaladdr >> 16;      break;    case R_PPC_ADDR16_HA:      *(Elf32_Half*) reloc_addr = (finaladdr + 0x8000) >> 16;      break;    case R_PPC_ADDR14:    case R_PPC_ADDR14_BRTAKEN:    case R_PPC_ADDR14_BRNTAKEN:      if (finaladdr > 0x7fff && finaladdr < 0x8000)	dl_reloc_overflow (map,  "R_PPC_ADDR14", reloc_addr, sym, refsym);      *reloc_addr = (*reloc_addr & 0xffff0003) | (finaladdr & 0xfffc);      if (rinfo != R_PPC_ADDR14)	*reloc_addr = ((*reloc_addr & 0xffdfffff)		       | ((rinfo == R_PPC_ADDR14_BRTAKEN)			  ^ (finaladdr >> 31)) << 21);      break;    case R_PPC_REL24:      {	Elf32_Sword delta = finaladdr - (Elf32_Word) reloc_addr;	if (delta << 6 >> 6 != delta)	  dl_reloc_overflow (map,  "R_PPC_REL24", reloc_addr, sym, refsym);	*reloc_addr = (*reloc_addr & 0xfc000003) | (delta & 0x3fffffc);      }      break;    case R_PPC_COPY:      if (sym == NULL)	/* This can happen in trace mode when an object could not be	   found.  */	return;      if (sym->st_size > refsym->st_size	  || (_dl_verbose && sym->st_size < refsym->st_size))	{	  const char *strtab;	  strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);	  _dl_error_printf ("\%s: Symbol `%s' has different size in shared object, onsider re-linking\n",			    _dl_argv[0] ?: "<program name unknown>",			    strtab + refsym->st_name);	}      memcpy (reloc_addr, (char *) finaladdr, MIN (sym->st_size,						   refsym->st_size));      return;    case R_PPC_REL32:      *reloc_addr = finaladdr - (Elf32_Word) reloc_addr;      return;    case R_PPC_JMP_SLOT:      /* It used to be that elf_machine_fixup_plt was used here,	 but that doesn't work when ld.so relocates itself	 for the second time.  On the bright side, there's         no need to worry about thread-safety here.  */      {	Elf32_Sword delta = finaladdr - (Elf32_Word) reloc_addr;	if (delta << 6 >> 6 == delta)	  *reloc_addr = OPCODE_B (delta);	else if (finaladdr <= 0x01fffffc || finaladdr >= 0xfe000000)	  *reloc_addr = OPCODE_BA (finaladdr);	else	  {	    Elf32_Word *plt, *data_words;	    Elf32_Word index, offset, num_plt_entries;	    plt = (Elf32_Word *) D_PTR (map, l_info[DT_PLTGOT]);	    offset = reloc_addr - plt;	    if (offset < PLT_DOUBLE_SIZE*2 + PLT_INITIAL_ENTRY_WORDS)	      {		index = (offset - PLT_INITIAL_ENTRY_WORDS)/2;		num_plt_entries = (map->l_info[DT_PLTRELSZ]->d_un.d_val				   / sizeof(Elf32_Rela));		data_words = plt + PLT_DATA_START_WORDS (num_plt_entries);		data_words[index] = finaladdr;		reloc_addr[0] = OPCODE_LI (11, index * 4);		reloc_addr[1] = OPCODE_B ((PLT_LONGBRANCH_ENTRY_WORDS					   - (offset+1))					  * 4);		MODIFIED_CODE_NOQUEUE (reloc_addr + 1);	      }	    else	      {		reloc_addr[0] = OPCODE_LIS_HI (12, finaladdr);		reloc_addr[1] = OPCODE_ADDI (12, 12, finaladdr);		reloc_addr[2] = OPCODE_MTCTR (12);		reloc_addr[3] = OPCODE_BCTR ();		MODIFIED_CODE_NOQUEUE (reloc_addr + 3);	      }	  }      }      break;    default:      _dl_reloc_bad_type (map, rinfo, 0);      return;    }  MODIFIED_CODE_NOQUEUE (reloc_addr);}