Branch data 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 : 35704 : ppc64_reloc_simple_type (Ebl *ebl __attribute__ ((unused)), int type,
46 : : int *addsub __attribute__ ((unused)))
47 : : {
48 [ + - + + ]: 35704 : switch (type)
49 : : {
50 : : case R_PPC64_ADDR64:
51 : : case R_PPC64_UADDR64:
52 : : return ELF_T_XWORD;
53 : 35140 : case R_PPC64_ADDR32:
54 : : case R_PPC64_UADDR32:
55 : 35140 : return ELF_T_WORD;
56 : 0 : case R_PPC64_UADDR16:
57 : 0 : return ELF_T_HALF;
58 : 32 : default:
59 : 32 : 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 : 410 : ppc64_dynamic_tag_check (int64_t tag)
87 : : {
88 : 410 : return (tag == DT_PPC64_GLINK
89 : : || tag == DT_PPC64_OPD
90 : : || tag == DT_PPC64_OPDSZ
91 : 410 : || 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 : 1248 : 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 : 1248 : size_t shstrndx;
104 [ + - ]: 1248 : if (elf_getshdrstrndx (elf, &shstrndx) != 0)
105 : : return false;
106 : 1248 : const char *sname = elf_strptr (elf, shstrndx, destshdr->sh_name);
107 [ + - ]: 1248 : if (sname == NULL)
108 : : return false;
109 : 1248 : return strcmp (sname, ".opd") == 0;
110 : : }
111 : :
112 : :
113 : : /* Check if backend uses a bss PLT in this file. */
114 : : bool
115 : 14 : ppc64_bss_plt_p (Elf *elf __attribute__ ((unused)))
116 : : {
117 : 14 : 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 : 46 : ppc64_machine_flag_check (GElf_Word flags)
126 : : {
127 : 46 : 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 : : }
|