Blame backends/ppc64_symbol.c

Packit 032894
/* PPC64 specific symbolic name handling.
Packit 032894
   Copyright (C) 2004, 2005, 2014 Red Hat, Inc.
Packit 032894
   This file is part of elfutils.
Packit 032894
   Written by Ulrich Drepper <drepper@redhat.com>, 2004.
Packit 032894
Packit 032894
   This file is free software; you can redistribute it and/or modify
Packit 032894
   it under the terms of either
Packit 032894
Packit 032894
     * the GNU Lesser General Public License as published by the Free
Packit 032894
       Software Foundation; either version 3 of the License, or (at
Packit 032894
       your option) any later version
Packit 032894
Packit 032894
   or
Packit 032894
Packit 032894
     * the GNU General Public License as published by the Free
Packit 032894
       Software Foundation; either version 2 of the License, or (at
Packit 032894
       your option) any later version
Packit 032894
Packit 032894
   or both in parallel, as here.
Packit 032894
Packit 032894
   elfutils is distributed in the hope that it will be useful, but
Packit 032894
   WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 032894
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 032894
   General Public License for more details.
Packit 032894
Packit 032894
   You should have received copies of the GNU General Public License and
Packit 032894
   the GNU Lesser General Public License along with this program.  If
Packit 032894
   not, see <http://www.gnu.org/licenses/>.  */
Packit 032894
Packit 032894
#ifdef HAVE_CONFIG_H
Packit 032894
# include <config.h>
Packit 032894
#endif
Packit 032894
Packit 032894
#include <assert.h>
Packit 032894
#include <elf.h>
Packit 032894
#include <stddef.h>
Packit 032894
#include <string.h>
Packit 032894
Packit 032894
#define BACKEND		ppc64_
Packit 032894
#include "libebl_CPU.h"
Packit 032894
Packit 032894
Packit 032894
/* Check for the simple reloc types.  */
Packit 032894
Elf_Type
Packit 032894
ppc64_reloc_simple_type (Ebl *ebl __attribute__ ((unused)), int type,
Packit 032894
			 int *addsub __attribute__ ((unused)))
Packit 032894
{
Packit 032894
  switch (type)
Packit 032894
    {
Packit 032894
    case R_PPC64_ADDR64:
Packit 032894
    case R_PPC64_UADDR64:
Packit 032894
      return ELF_T_XWORD;
Packit 032894
    case R_PPC64_ADDR32:
Packit 032894
    case R_PPC64_UADDR32:
Packit 032894
      return ELF_T_WORD;
Packit 032894
    case R_PPC64_UADDR16:
Packit 032894
      return ELF_T_HALF;
Packit 032894
    default:
Packit 032894
      return ELF_T_NUM;
Packit 032894
    }
Packit 032894
}
Packit 032894
Packit 032894
Packit 032894
const char *
Packit 032894
ppc64_dynamic_tag_name (int64_t tag, char *buf __attribute__ ((unused)),
Packit 032894
			size_t len __attribute__ ((unused)))
Packit 032894
{
Packit 032894
  switch (tag)
Packit 032894
    {
Packit 032894
    case DT_PPC64_GLINK:
Packit 032894
      return "PPC64_GLINK";
Packit 032894
    case DT_PPC64_OPD:
Packit 032894
      return "PPC64_OPD";
Packit 032894
    case DT_PPC64_OPDSZ:
Packit 032894
      return "PPC64_OPDSZ";
Packit 032894
    case DT_PPC64_OPT:
Packit 032894
      return "PPC64_OPT";
Packit 032894
    default:
Packit 032894
      break;
Packit 032894
    }
Packit 032894
  return NULL;
Packit 032894
}
Packit 032894
Packit 032894
Packit 032894
bool
Packit 032894
ppc64_dynamic_tag_check (int64_t tag)
Packit 032894
{
Packit 032894
  return (tag == DT_PPC64_GLINK
Packit 032894
	  || tag == DT_PPC64_OPD
Packit 032894
	  || tag == DT_PPC64_OPDSZ
Packit 032894
	  || tag == DT_PPC64_OPT);
Packit 032894
}
Packit 032894
Packit 032894
Packit 032894
/* Check whether given symbol's st_value and st_size are OK despite failing
Packit 032894
   normal checks.  */
Packit 032894
bool
Packit 032894
ppc64_check_special_symbol (Elf *elf,
Packit 032894
			    const GElf_Sym *sym __attribute__ ((unused)),
Packit 032894
			    const char *name __attribute__ ((unused)),
Packit 032894
			    const GElf_Shdr *destshdr)
Packit 032894
{
Packit 032894
  size_t shstrndx;
Packit 032894
  if (elf_getshdrstrndx (elf, &shstrndx) != 0)
Packit 032894
    return false;
Packit 032894
  const char *sname = elf_strptr (elf, shstrndx, destshdr->sh_name);
Packit 032894
  if (sname == NULL)
Packit 032894
    return false;
Packit 032894
  return strcmp (sname, ".opd") == 0;
Packit 032894
}
Packit 032894
Packit 032894
Packit 032894
/* Check if backend uses a bss PLT in this file.  */
Packit 032894
bool
Packit 032894
ppc64_bss_plt_p (Elf *elf __attribute__ ((unused)))
Packit 032894
{
Packit 032894
  return true;
Packit 032894
}
Packit 032894
Packit 032894
/* Check whether machine flags are valid.  PPC64 has three possible values:
Packit 032894
   0 - for unspecified ABI, or not using any specific ABI features.
Packit 032894
   1 - for the original ELF PPC64 ABI using function descriptors.
Packit 032894
   2 - for the revised ELFv2 PPC64 ABI without function descriptors.  */
Packit 032894
bool
Packit 032894
ppc64_machine_flag_check (GElf_Word flags)
Packit 032894
{
Packit 032894
  return flags == 0 || flags == 1 || flags == 2;
Packit 032894
}
Packit 032894
Packit 032894
bool
Packit 032894
ppc64_check_st_other_bits (unsigned char st_other)
Packit 032894
{
Packit 032894
  return (PPC64_LOCAL_ENTRY_OFFSET (st_other) != 0);
Packit 032894
}