/src/elfutils/backends/ppc64_init.c
Line | Count | Source |
1 | | /* Initialization of PPC64 specific backend library. |
2 | | Copyright (C) 2004, 2005, 2006, 2007, 2008, 2013, 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 <string.h> |
35 | | |
36 | | #define BACKEND ppc64_ |
37 | | #define RELOC_PREFIX R_PPC64_ |
38 | | #include "libebl_CPU.h" |
39 | | |
40 | | /* This defines the common reloc hooks based on ppc64_reloc.def. */ |
41 | | #include "common-reloc.c" |
42 | | |
43 | | |
44 | | Ebl * |
45 | | ppc64_init (Elf *elf __attribute__ ((unused)), |
46 | | GElf_Half machine __attribute__ ((unused)), |
47 | | Ebl *eh) |
48 | 2.12k | { |
49 | | /* We handle it. */ |
50 | 2.12k | ppc64_init_reloc (eh); |
51 | 2.12k | HOOK (eh, reloc_simple_type); |
52 | 2.12k | HOOK (eh, dynamic_tag_name); |
53 | 2.12k | HOOK (eh, dynamic_tag_check); |
54 | 2.12k | HOOK (eh, machine_flag_check); |
55 | 2.12k | HOOK (eh, copy_reloc_p); |
56 | 2.12k | HOOK (eh, check_special_symbol); |
57 | 2.12k | HOOK (eh, check_st_other_bits); |
58 | 2.12k | HOOK (eh, bss_plt_p); |
59 | 2.12k | HOOK (eh, return_value_location); |
60 | 2.12k | HOOK (eh, register_info); |
61 | 2.12k | HOOK (eh, core_note); |
62 | 2.12k | HOOK (eh, auxv_info); |
63 | 2.12k | HOOK (eh, check_object_attribute); |
64 | 2.12k | HOOK (eh, abi_cfi); |
65 | | /* gcc/config/ #define DWARF_FRAME_REGISTERS. */ |
66 | 2.12k | eh->frame_nregs = (114 - 1) + 32; |
67 | 2.12k | HOOK (eh, set_initial_registers_tid); |
68 | 2.12k | HOOK (eh, dwarf_to_regno); |
69 | 2.12k | HOOK (eh, unwind); |
70 | 2.12k | HOOK (eh, resolve_sym_value); |
71 | | |
72 | | /* Find the function descriptor .opd table for resolve_sym_value. */ |
73 | 2.12k | if (elf != NULL) |
74 | 2.12k | { |
75 | 2.12k | GElf_Ehdr ehdr_mem, *ehdr = gelf_getehdr (elf, &ehdr_mem); |
76 | 2.12k | size_t shstrndx; |
77 | 2.12k | if (ehdr != NULL && ehdr->e_type != ET_REL |
78 | 2.12k | && elf_getshdrstrndx (elf, &shstrndx) == 0) |
79 | 2.11k | { |
80 | | /* We could also try through DT_PPC64_OPD and DT_PPC64_OPDSZ. */ |
81 | 2.11k | GElf_Shdr opd_shdr_mem, *opd_shdr; |
82 | 2.11k | Elf_Scn *scn = NULL; |
83 | 94.8k | while ((scn = elf_nextscn (elf, scn)) != NULL) |
84 | 92.7k | { |
85 | 92.7k | opd_shdr = gelf_getshdr (scn, &opd_shdr_mem); |
86 | 92.7k | if (opd_shdr != NULL |
87 | 92.7k | && (opd_shdr->sh_flags & SHF_ALLOC) != 0 |
88 | 32.8k | && opd_shdr->sh_type == SHT_PROGBITS |
89 | 15.2k | && opd_shdr->sh_size > 0) |
90 | 15.1k | { |
91 | 15.1k | const char *name = elf_strptr (elf, shstrndx, |
92 | 15.1k | opd_shdr->sh_name); |
93 | 15.1k | if (name != NULL && strcmp (name, ".opd") == 0) |
94 | 37 | { |
95 | 37 | eh->fd_addr = opd_shdr->sh_addr; |
96 | 37 | eh->fd_data = elf_getdata (scn, NULL); |
97 | 37 | break; |
98 | 37 | } |
99 | 15.1k | } |
100 | 92.7k | } |
101 | 2.11k | } |
102 | 2.12k | } |
103 | | |
104 | 2.12k | return eh; |
105 | 2.12k | } |