Line data Source code
1 : /* PPC64 specific symbolic name handling.
2 : Copyright (C) 2004, 2005, 2014 Red Hat, Inc.
3 : This file is part of elfutils.
4 : Written by Ulrich Drepper <drepper@redhat.com>, 2004.
5 :
6 : This file is free software; you can redistribute it and/or modify
7 : it under the terms of either
8 :
9 : * the GNU Lesser General Public License as published by the Free
10 : Software Foundation; either version 3 of the License, or (at
11 : your option) any later version
12 :
13 : or
14 :
15 : * the GNU General Public License as published by the Free
16 : Software Foundation; either version 2 of the License, or (at
17 : your option) any later version
18 :
19 : or both in parallel, as here.
20 :
21 : elfutils is distributed in the hope that it will be useful, but
22 : WITHOUT ANY WARRANTY; without even the implied warranty of
23 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
24 : General Public License for more details.
25 :
26 : You should have received copies of the GNU General Public License and
27 : the GNU Lesser General Public License along with this program. If
28 : not, see <http://www.gnu.org/licenses/>. */
29 :
30 : #ifdef HAVE_CONFIG_H
31 : # include <config.h>
32 : #endif
33 :
34 : #include <assert.h>
35 : #include <elf.h>
36 : #include <stddef.h>
37 : #include <string.h>
38 :
39 : #define BACKEND ppc64_
40 : #include "libebl_CPU.h"
41 :
42 :
43 : /* Check for the simple reloc types. */
44 : Elf_Type
45 17902 : ppc64_reloc_simple_type (Ebl *ebl __attribute__ ((unused)), int type,
46 : int *addsub __attribute__ ((unused)))
47 : {
48 17902 : switch (type)
49 : {
50 : case R_PPC64_ADDR64:
51 : case R_PPC64_UADDR64:
52 : return ELF_T_XWORD;
53 17570 : case R_PPC64_ADDR32:
54 : case R_PPC64_UADDR32:
55 17570 : return ELF_T_WORD;
56 0 : case R_PPC64_UADDR16:
57 0 : return ELF_T_HALF;
58 38 : default:
59 38 : return ELF_T_NUM;
60 : }
61 : }
62 :
63 :
64 : const char *
65 0 : ppc64_dynamic_tag_name (int64_t tag, char *buf __attribute__ ((unused)),
66 : size_t len __attribute__ ((unused)))
67 : {
68 0 : switch (tag)
69 : {
70 : case DT_PPC64_GLINK:
71 : return "PPC64_GLINK";
72 0 : case DT_PPC64_OPD:
73 0 : return "PPC64_OPD";
74 0 : case DT_PPC64_OPDSZ:
75 0 : return "PPC64_OPDSZ";
76 0 : case DT_PPC64_OPT:
77 0 : return "PPC64_OPT";
78 : default:
79 0 : break;
80 : }
81 0 : return NULL;
82 : }
83 :
84 :
85 : bool
86 205 : ppc64_dynamic_tag_check (int64_t tag)
87 : {
88 205 : return (tag == DT_PPC64_GLINK
89 : || tag == DT_PPC64_OPD
90 : || tag == DT_PPC64_OPDSZ
91 205 : || tag == DT_PPC64_OPT);
92 : }
93 :
94 :
95 : /* Check whether given symbol's st_value and st_size are OK despite failing
96 : normal checks. */
97 : bool
98 624 : ppc64_check_special_symbol (Elf *elf,
99 : const GElf_Sym *sym __attribute__ ((unused)),
100 : const char *name __attribute__ ((unused)),
101 : const GElf_Shdr *destshdr)
102 : {
103 624 : size_t shstrndx;
104 624 : if (elf_getshdrstrndx (elf, &shstrndx) != 0)
105 : return false;
106 624 : const char *sname = elf_strptr (elf, shstrndx, destshdr->sh_name);
107 624 : if (sname == NULL)
108 : return false;
109 624 : return strcmp (sname, ".opd") == 0;
110 : }
111 :
112 :
113 : /* Check if backend uses a bss PLT in this file. */
114 : bool
115 7 : ppc64_bss_plt_p (Elf *elf __attribute__ ((unused)))
116 : {
117 7 : return true;
118 : }
119 :
120 : /* Check whether machine flags are valid. PPC64 has three possible values:
121 : 0 - for unspecified ABI, or not using any specific ABI features.
122 : 1 - for the original ELF PPC64 ABI using function descriptors.
123 : 2 - for the revised ELFv2 PPC64 ABI without function descriptors. */
124 : bool
125 23 : ppc64_machine_flag_check (GElf_Word flags)
126 : {
127 23 : return flags == 0 || flags == 1 || flags == 2;
128 : }
129 :
130 : bool
131 0 : ppc64_check_st_other_bits (unsigned char st_other)
132 : {
133 0 : return (PPC64_LOCAL_ENTRY_OFFSET (st_other) != 0);
134 : }
|