1cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* PPC64 specific symbolic name handling.
2cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Copyright (C) 2004, 2005 Red Hat, Inc.
3cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   This file is part of Red Hat elfutils.
4cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Written by Ulrich Drepper <drepper@redhat.com>, 2004.
5cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
6cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is free software; you can redistribute it and/or modify
7cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   it under the terms of the GNU General Public License as published by the
8cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Free Software Foundation; version 2 of the License.
9cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
10cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is distributed in the hope that it will be useful, but
11cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   WITHOUT ANY WARRANTY; without even the implied warranty of
12cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   General Public License for more details.
14cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
15cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   You should have received a copy of the GNU General Public License along
16cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   with Red Hat elfutils; if not, write to the Free Software Foundation,
17cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
18cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
19cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is an included package of the Open Invention Network.
20cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   An included package of the Open Invention Network is a package for which
21cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Open Invention Network licensees cross-license their patents.  No patent
22cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   license is granted, either expressly or impliedly, by designation as an
23cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   included package.  Should you wish to participate in the Open Invention
24cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Network licensing program, please visit www.openinventionnetwork.com
25cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   <http://www.openinventionnetwork.com>.  */
26cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
27cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#ifdef HAVE_CONFIG_H
28cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng# include <config.h>
29cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#endif
30cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
31cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include <assert.h>
32cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include <elf.h>
33cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include <stddef.h>
34cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include <string.h>
35cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
36cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#define BACKEND		ppc64_
37cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include "libebl_CPU.h"
38cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
39cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
40cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Check for the simple reloc types.  */
41cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengElf_Type
42cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengppc64_reloc_simple_type (Ebl *ebl __attribute__ ((unused)), int type)
43cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng{
44cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  switch (type)
45cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    {
46cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    case R_PPC64_ADDR64:
47cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    case R_PPC64_UADDR64:
48cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng      return ELF_T_XWORD;
49cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    case R_PPC64_ADDR32:
50cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    case R_PPC64_UADDR32:
51cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng      return ELF_T_WORD;
52cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    case R_PPC64_UADDR16:
53cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng      return ELF_T_HALF;
54cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    default:
55cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng      return ELF_T_NUM;
56cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    }
57cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng}
58cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
59cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
60cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengconst char *
61cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengppc64_dynamic_tag_name (int64_t tag, char *buf __attribute__ ((unused)),
62cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng			size_t len __attribute__ ((unused)))
63cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng{
64cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  switch (tag)
65cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    {
66cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    case DT_PPC64_GLINK:
67cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng      return "PPC64_GLINK";
68cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    case DT_PPC64_OPD:
69cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng      return "PPC64_OPD";
70cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    case DT_PPC64_OPDSZ:
71cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng      return "PPC64_OPDSZ";
72cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    default:
73cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng      break;
74cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    }
75cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  return NULL;
76cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng}
77cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
78cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
79cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengbool
80cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengppc64_dynamic_tag_check (int64_t tag)
81cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng{
82cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  return (tag == DT_PPC64_GLINK
83cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng	  || tag == DT_PPC64_OPD
84cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng	  || tag == DT_PPC64_OPDSZ);
85cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng}
86cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
87cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
88cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Check whether given symbol's st_value and st_size are OK despite failing
89cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   normal checks.  */
90cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengbool
91cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengppc64_check_special_symbol (Elf *elf, GElf_Ehdr *ehdr,
92cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng			    const GElf_Sym *sym __attribute__ ((unused)),
93cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng			    const char *name __attribute__ ((unused)),
94cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng			    const GElf_Shdr *destshdr)
95cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng{
96cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  const char *sname = elf_strptr (elf, ehdr->e_shstrndx, destshdr->sh_name);
97cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  if (sname == NULL)
98cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    return false;
99cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  return strcmp (sname, ".opd") == 0;
100cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng}
101cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
102cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
103cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Check if backend uses a bss PLT in this file.  */
104cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengbool
105cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengppc64_bss_plt_p (Elf *elf __attribute__ ((unused)),
106cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng		 GElf_Ehdr *ehdr __attribute__ ((unused)))
107cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng{
108cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  return true;
109cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng}
110