1da0c48c4Sopenharmony_ci/* Generate ELF backend handle.
2da0c48c4Sopenharmony_ci   Copyright (C) 2000-2017 Red Hat, Inc.
3da0c48c4Sopenharmony_ci   This file is part of elfutils.
4da0c48c4Sopenharmony_ci
5da0c48c4Sopenharmony_ci   This file is free software; you can redistribute it and/or modify
6da0c48c4Sopenharmony_ci   it under the terms of either
7da0c48c4Sopenharmony_ci
8da0c48c4Sopenharmony_ci     * the GNU Lesser General Public License as published by the Free
9da0c48c4Sopenharmony_ci       Software Foundation; either version 3 of the License, or (at
10da0c48c4Sopenharmony_ci       your option) any later version
11da0c48c4Sopenharmony_ci
12da0c48c4Sopenharmony_ci   or
13da0c48c4Sopenharmony_ci
14da0c48c4Sopenharmony_ci     * the GNU General Public License as published by the Free
15da0c48c4Sopenharmony_ci       Software Foundation; either version 2 of the License, or (at
16da0c48c4Sopenharmony_ci       your option) any later version
17da0c48c4Sopenharmony_ci
18da0c48c4Sopenharmony_ci   or both in parallel, as here.
19da0c48c4Sopenharmony_ci
20da0c48c4Sopenharmony_ci   elfutils is distributed in the hope that it will be useful, but
21da0c48c4Sopenharmony_ci   WITHOUT ANY WARRANTY; without even the implied warranty of
22da0c48c4Sopenharmony_ci   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
23da0c48c4Sopenharmony_ci   General Public License for more details.
24da0c48c4Sopenharmony_ci
25da0c48c4Sopenharmony_ci   You should have received copies of the GNU General Public License and
26da0c48c4Sopenharmony_ci   the GNU Lesser General Public License along with this program.  If
27da0c48c4Sopenharmony_ci   not, see <http://www.gnu.org/licenses/>.  */
28da0c48c4Sopenharmony_ci
29da0c48c4Sopenharmony_ci#ifdef HAVE_CONFIG_H
30da0c48c4Sopenharmony_ci# include <config.h>
31da0c48c4Sopenharmony_ci#endif
32da0c48c4Sopenharmony_ci
33da0c48c4Sopenharmony_ci#include <assert.h>
34da0c48c4Sopenharmony_ci#include <libelfP.h>
35da0c48c4Sopenharmony_ci#include <dwarf.h>
36da0c48c4Sopenharmony_ci#include <stdlib.h>
37da0c48c4Sopenharmony_ci#include <string.h>
38da0c48c4Sopenharmony_ci#include <stdio.h>
39da0c48c4Sopenharmony_ci
40da0c48c4Sopenharmony_ci#include <system.h>
41da0c48c4Sopenharmony_ci#include <libeblP.h>
42da0c48c4Sopenharmony_ci
43da0c48c4Sopenharmony_ciEbl *i386_init (Elf *, GElf_Half, Ebl *);
44da0c48c4Sopenharmony_ciEbl *sh_init (Elf *, GElf_Half, Ebl *);
45da0c48c4Sopenharmony_ciEbl *x86_64_init (Elf *, GElf_Half, Ebl *);
46da0c48c4Sopenharmony_ciEbl *ia64_init (Elf *, GElf_Half, Ebl *);
47da0c48c4Sopenharmony_ciEbl *alpha_init (Elf *, GElf_Half, Ebl *);
48da0c48c4Sopenharmony_ciEbl *arm_init (Elf *, GElf_Half, Ebl *);
49da0c48c4Sopenharmony_ciEbl *aarch64_init (Elf *, GElf_Half, Ebl *);
50da0c48c4Sopenharmony_ciEbl *sparc_init (Elf *, GElf_Half, Ebl *);
51da0c48c4Sopenharmony_ciEbl *ppc_init (Elf *, GElf_Half, Ebl *);
52da0c48c4Sopenharmony_ciEbl *ppc64_init (Elf *, GElf_Half, Ebl *);
53da0c48c4Sopenharmony_ciEbl *s390_init (Elf *, GElf_Half, Ebl *);
54da0c48c4Sopenharmony_ciEbl *m68k_init (Elf *, GElf_Half, Ebl *);
55da0c48c4Sopenharmony_ciEbl *bpf_init (Elf *, GElf_Half, Ebl *);
56da0c48c4Sopenharmony_ciEbl *riscv_init (Elf *, GElf_Half, Ebl *);
57da0c48c4Sopenharmony_ciEbl *csky_init (Elf *, GElf_Half, Ebl *);
58da0c48c4Sopenharmony_ci
59da0c48c4Sopenharmony_ci/* This table should contain the complete list of architectures as far
60da0c48c4Sopenharmony_ci   as the ELF specification is concerned.  */
61da0c48c4Sopenharmony_ci/* XXX When things are stable replace the string pointers with char
62da0c48c4Sopenharmony_ci   arrays to avoid relocations.  */
63da0c48c4Sopenharmony_cistatic const struct
64da0c48c4Sopenharmony_ci{
65da0c48c4Sopenharmony_ci  ebl_bhinit_t init;
66da0c48c4Sopenharmony_ci  const char *emulation;
67da0c48c4Sopenharmony_ci  const char *prefix;
68da0c48c4Sopenharmony_ci  int prefix_len;
69da0c48c4Sopenharmony_ci  int em;
70da0c48c4Sopenharmony_ci  int class;
71da0c48c4Sopenharmony_ci  int data;
72da0c48c4Sopenharmony_ci} machines[] =
73da0c48c4Sopenharmony_ci{
74da0c48c4Sopenharmony_ci  { i386_init, "elf_i386", "i386", 4, EM_386, ELFCLASS32, ELFDATA2LSB },
75da0c48c4Sopenharmony_ci  { ia64_init, "elf_ia64", "ia64", 4, EM_IA_64, ELFCLASS64, ELFDATA2LSB },
76da0c48c4Sopenharmony_ci  { alpha_init, "elf_alpha", "alpha", 5, EM_ALPHA, ELFCLASS64, ELFDATA2LSB },
77da0c48c4Sopenharmony_ci  { x86_64_init, "elf_x86_64", "x86_64", 6, EM_X86_64, ELFCLASS64, ELFDATA2LSB },
78da0c48c4Sopenharmony_ci  { ppc_init, "elf_ppc", "ppc", 3, EM_PPC, ELFCLASS32, ELFDATA2MSB },
79da0c48c4Sopenharmony_ci  { ppc64_init, "elf_ppc64", "ppc64", 5, EM_PPC64, ELFCLASS64, ELFDATA2MSB },
80da0c48c4Sopenharmony_ci  // XXX class and machine fields need to be filled in for all archs.
81da0c48c4Sopenharmony_ci  { sh_init, "elf_sh", "sh", 2, EM_SH, 0, 0 },
82da0c48c4Sopenharmony_ci  { arm_init, "ebl_arm", "arm", 3, EM_ARM, 0, 0 },
83da0c48c4Sopenharmony_ci  { sparc_init, "elf_sparcv9", "sparc", 5, EM_SPARCV9, 0, 0 },
84da0c48c4Sopenharmony_ci  { sparc_init, "elf_sparc", "sparc", 5, EM_SPARC, 0, 0 },
85da0c48c4Sopenharmony_ci  { sparc_init, "elf_sparcv8plus", "sparc", 5, EM_SPARC32PLUS, 0, 0 },
86da0c48c4Sopenharmony_ci  { s390_init, "ebl_s390", "s390", 4, EM_S390, 0, 0 },
87da0c48c4Sopenharmony_ci
88da0c48c4Sopenharmony_ci  { NULL, "elf_tilegx", "tilegx", 6, EM_TILEGX, ELFCLASS64, ELFDATA2LSB },
89da0c48c4Sopenharmony_ci  { NULL, "elf_m32", "m32", 3, EM_M32, 0, 0 },
90da0c48c4Sopenharmony_ci  { m68k_init, "elf_m68k", "m68k", 4, EM_68K, ELFCLASS32, ELFDATA2MSB },
91da0c48c4Sopenharmony_ci  { NULL, "elf_m88k", "m88k", 4, EM_88K, 0, 0 },
92da0c48c4Sopenharmony_ci  { NULL, "elf_i860", "i860", 4, EM_860, 0, 0 },
93da0c48c4Sopenharmony_ci  { NULL, "ebl_s370", "s370", 4, EM_S370, 0, 0 },
94da0c48c4Sopenharmony_ci  { NULL, "elf_parisc", "parisc", 6, EM_PARISC, 0, 0 },
95da0c48c4Sopenharmony_ci  { NULL, "elf_vpp500", "vpp500", 5, EM_VPP500, 0, 0 },
96da0c48c4Sopenharmony_ci  { sparc_init, "elf_v8plus", "v8plus", 6, EM_SPARC32PLUS, 0, 0 },
97da0c48c4Sopenharmony_ci  { NULL, "elf_i960", "i960", 4, EM_960, 0, 0 },
98da0c48c4Sopenharmony_ci  { NULL, "ebl_v800", "v800", 4, EM_V800, 0, 0 },
99da0c48c4Sopenharmony_ci  { NULL, "ebl_fr20", "fr20", 4, EM_FR20, 0, 0 },
100da0c48c4Sopenharmony_ci  { NULL, "ebl_rh32", "rh32", 4, EM_RH32, 0, 0 },
101da0c48c4Sopenharmony_ci  { NULL, "ebl_rce", "rce", 3, EM_RCE, 0, 0 },
102da0c48c4Sopenharmony_ci  { NULL, "elf_tricore", "tricore", 7, EM_TRICORE, 0, 0 },
103da0c48c4Sopenharmony_ci  { NULL, "elf_arc", "arc", 3, EM_ARC, 0, 0 },
104da0c48c4Sopenharmony_ci  { NULL, "elf_h8_300", "h8_300", 6, EM_H8_300, 0, 0 },
105da0c48c4Sopenharmony_ci  { NULL, "elf_h8_300h", "h8_300h", 6, EM_H8_300H, 0, 0 },
106da0c48c4Sopenharmony_ci  { NULL, "elf_h8s", "h8s", 6, EM_H8S, 0, 0 },
107da0c48c4Sopenharmony_ci  { NULL, "elf_h8_500", "h8_500", 6, EM_H8_500, 0, 0 },
108da0c48c4Sopenharmony_ci  { NULL, "elf_coldfire", "coldfire", 8, EM_COLDFIRE, 0, 0 },
109da0c48c4Sopenharmony_ci  { m68k_init, "elf_68hc12", "68hc12", 6, EM_68HC12, 0, 0 },
110da0c48c4Sopenharmony_ci  { NULL, "elf_mma", "mma", 3, EM_MMA, 0, 0 },
111da0c48c4Sopenharmony_ci  { NULL, "elf_pcp", "pcp", 3, EM_PCP, 0, 0 },
112da0c48c4Sopenharmony_ci  { NULL, "elf_ncpu", "ncpu", 4, EM_NCPU, 0, 0 },
113da0c48c4Sopenharmony_ci  { NULL, "elf_ndr1", "ndr1", 4, EM_NDR1, 0, 0 },
114da0c48c4Sopenharmony_ci  { NULL, "elf_starcore", "starcore", 8, EM_STARCORE, 0, 0 },
115da0c48c4Sopenharmony_ci  { NULL, "elf_me16", "em16", 4, EM_ME16, 0, 0 },
116da0c48c4Sopenharmony_ci  { NULL, "elf_st100", "st100", 5, EM_ST100, 0, 0 },
117da0c48c4Sopenharmony_ci  { NULL, "elf_tinyj", "tinyj", 5, EM_TINYJ, 0, 0 },
118da0c48c4Sopenharmony_ci  { NULL, "elf_pdsp", "pdsp", 4, EM_PDSP, 0, 0 },
119da0c48c4Sopenharmony_ci  { NULL, "elf_fx66", "fx66", 4, EM_FX66, 0, 0 },
120da0c48c4Sopenharmony_ci  { NULL, "elf_st9plus", "st9plus", 7, EM_ST9PLUS, 0, 0 },
121da0c48c4Sopenharmony_ci  { NULL, "elf_st7", "st7", 3, EM_ST7, 0, 0 },
122da0c48c4Sopenharmony_ci  { m68k_init, "elf_68hc16", "68hc16", 6, EM_68HC16, 0, 0 },
123da0c48c4Sopenharmony_ci  { m68k_init, "elf_68hc11", "68hc11", 6, EM_68HC11, 0, 0 },
124da0c48c4Sopenharmony_ci  { m68k_init, "elf_68hc08", "68hc08", 6, EM_68HC08, 0, 0 },
125da0c48c4Sopenharmony_ci  { m68k_init, "elf_68hc05", "68hc05", 6, EM_68HC05, 0, 0 },
126da0c48c4Sopenharmony_ci  { NULL, "elf_svx", "svx", 3, EM_SVX, 0, 0 },
127da0c48c4Sopenharmony_ci  { NULL, "elf_st19", "st19", 4, EM_ST19, 0, 0 },
128da0c48c4Sopenharmony_ci  { NULL, "elf_vax", "vax", 3, EM_VAX, 0, 0 },
129da0c48c4Sopenharmony_ci  { NULL, "elf_cris", "cris", 4, EM_CRIS, 0, 0 },
130da0c48c4Sopenharmony_ci  { NULL, "elf_javelin", "javelin", 7, EM_JAVELIN, 0, 0 },
131da0c48c4Sopenharmony_ci  { NULL, "elf_firepath", "firepath", 8, EM_FIREPATH, 0, 0 },
132da0c48c4Sopenharmony_ci  { NULL, "elf_zsp", "zsp", 3, EM_ZSP, 0, 0 },
133da0c48c4Sopenharmony_ci  { NULL, "elf_mmix", "mmix", 4, EM_MMIX, 0, 0 },
134da0c48c4Sopenharmony_ci  { NULL, "elf_huany", "huany", 5, EM_HUANY, 0, 0 },
135da0c48c4Sopenharmony_ci  { NULL, "elf_prism", "prism", 5, EM_PRISM, 0, 0 },
136da0c48c4Sopenharmony_ci  { NULL, "elf_avr", "avr", 3, EM_AVR, 0, 0 },
137da0c48c4Sopenharmony_ci  { NULL, "elf_fr30", "fr30", 4, EM_FR30, 0, 0 },
138da0c48c4Sopenharmony_ci  { NULL, "elf_dv10", "dv10", 4, EM_D10V, 0, 0 },
139da0c48c4Sopenharmony_ci  { NULL, "elf_dv30", "dv30", 4, EM_D30V, 0, 0 },
140da0c48c4Sopenharmony_ci  { NULL, "elf_v850", "v850", 4, EM_V850, 0, 0 },
141da0c48c4Sopenharmony_ci  { NULL, "elf_m32r", "m32r", 4, EM_M32R, 0, 0 },
142da0c48c4Sopenharmony_ci  { NULL, "elf_mn10300", "mn10300", 7, EM_MN10300, 0, 0 },
143da0c48c4Sopenharmony_ci  { NULL, "elf_mn10200", "mn10200", 7, EM_MN10200, 0, 0 },
144da0c48c4Sopenharmony_ci  { NULL, "elf_pj", "pj", 2, EM_PJ, 0, 0 },
145da0c48c4Sopenharmony_ci  { NULL, "elf_openrisc", "openrisc", 8, EM_OPENRISC, 0, 0 },
146da0c48c4Sopenharmony_ci  { NULL, "elf_arc_a5", "arc_a5", 6, EM_ARC_A5, 0, 0 },
147da0c48c4Sopenharmony_ci  { NULL, "elf_xtensa", "xtensa", 6, EM_XTENSA, 0, 0 },
148da0c48c4Sopenharmony_ci  { aarch64_init, "elf_aarch64", "aarch64", 7, EM_AARCH64, ELFCLASS64, 0 },
149da0c48c4Sopenharmony_ci  { bpf_init, "elf_bpf", "bpf", 3, EM_BPF, 0, 0 },
150da0c48c4Sopenharmony_ci  { riscv_init, "elf_riscv", "riscv", 5, EM_RISCV, ELFCLASS64, ELFDATA2LSB },
151da0c48c4Sopenharmony_ci  { riscv_init, "elf_riscv", "riscv", 5, EM_RISCV, ELFCLASS32, ELFDATA2LSB },
152da0c48c4Sopenharmony_ci  { csky_init, "elf_csky", "csky", 4, EM_CSKY, ELFCLASS32, ELFDATA2LSB },
153da0c48c4Sopenharmony_ci};
154da0c48c4Sopenharmony_ci#define nmachines (sizeof (machines) / sizeof (machines[0]))
155da0c48c4Sopenharmony_ci
156da0c48c4Sopenharmony_ci/* No machine prefix should be larger than this.  */
157da0c48c4Sopenharmony_ci#define MAX_PREFIX_LEN 16
158da0c48c4Sopenharmony_ci
159da0c48c4Sopenharmony_ci/* Default callbacks.  Mostly they just return the error value.  */
160da0c48c4Sopenharmony_cistatic const char *default_reloc_type_name (int ignore, char *buf, size_t len);
161da0c48c4Sopenharmony_cistatic bool default_reloc_type_check (int ignore);
162da0c48c4Sopenharmony_cistatic bool default_reloc_valid_use (Elf *elf, int ignore);
163da0c48c4Sopenharmony_cistatic Elf_Type default_reloc_simple_type (Ebl *ebl, int ignore, int *addsub);
164da0c48c4Sopenharmony_cistatic bool default_gotpc_reloc_check (Elf *elf, int ignore);
165da0c48c4Sopenharmony_cistatic const char *default_segment_type_name (int ignore, char *buf,
166da0c48c4Sopenharmony_ci					      size_t len);
167da0c48c4Sopenharmony_cistatic const char *default_section_type_name (int ignore, char *buf,
168da0c48c4Sopenharmony_ci					      size_t len);
169da0c48c4Sopenharmony_cistatic const char *default_section_name (int ignore, int ignore2, char *buf,
170da0c48c4Sopenharmony_ci					 size_t len);
171da0c48c4Sopenharmony_cistatic const char *default_machine_flag_name (Elf64_Word orig, Elf64_Word *ignore);
172da0c48c4Sopenharmony_cistatic bool default_machine_flag_check (Elf64_Word flags);
173da0c48c4Sopenharmony_cistatic bool default_machine_section_flag_check (GElf_Xword flags);
174da0c48c4Sopenharmony_cistatic const char *default_symbol_type_name (int ignore, char *buf,
175da0c48c4Sopenharmony_ci					     size_t len);
176da0c48c4Sopenharmony_cistatic const char *default_symbol_binding_name (int ignore, char *buf,
177da0c48c4Sopenharmony_ci						size_t len);
178da0c48c4Sopenharmony_cistatic const char *default_dynamic_tag_name (int64_t ignore, char *buf,
179da0c48c4Sopenharmony_ci					     size_t len);
180da0c48c4Sopenharmony_cistatic bool default_dynamic_tag_check (int64_t ignore);
181da0c48c4Sopenharmony_cistatic const char *default_osabi_name (int ignore, char *buf, size_t len);
182da0c48c4Sopenharmony_cistatic void default_destr (struct ebl *ignore);
183da0c48c4Sopenharmony_cistatic const char *default_core_note_type_name (uint32_t, char *buf,
184da0c48c4Sopenharmony_ci						size_t len);
185da0c48c4Sopenharmony_cistatic const char *default_object_note_type_name (const char *name, uint32_t,
186da0c48c4Sopenharmony_ci						  char *buf, size_t len);
187da0c48c4Sopenharmony_cistatic int default_core_note (const GElf_Nhdr *nhdr, const char *name,
188da0c48c4Sopenharmony_ci			      GElf_Word *regs_offset, size_t *nregloc,
189da0c48c4Sopenharmony_ci			      const Ebl_Register_Location **reglocs,
190da0c48c4Sopenharmony_ci			      size_t *nitems, const Ebl_Core_Item **);
191da0c48c4Sopenharmony_cistatic int default_auxv_info (GElf_Xword a_type,
192da0c48c4Sopenharmony_ci			      const char **name, const char **format);
193da0c48c4Sopenharmony_cistatic bool default_object_note (const char *name, uint32_t type,
194da0c48c4Sopenharmony_ci				 uint32_t descsz, const char *desc);
195da0c48c4Sopenharmony_cistatic bool default_debugscn_p (const char *name);
196da0c48c4Sopenharmony_cistatic bool default_copy_reloc_p (int reloc);
197da0c48c4Sopenharmony_cistatic bool default_none_reloc_p (int reloc);
198da0c48c4Sopenharmony_cistatic bool default_relative_reloc_p (int reloc);
199da0c48c4Sopenharmony_cistatic bool default_check_special_symbol (Elf *elf,
200da0c48c4Sopenharmony_ci					  const GElf_Sym *sym,
201da0c48c4Sopenharmony_ci					  const char *name,
202da0c48c4Sopenharmony_ci					  const GElf_Shdr *destshdr);
203da0c48c4Sopenharmony_cistatic bool default_data_marker_symbol (const GElf_Sym *sym, const char *sname);
204da0c48c4Sopenharmony_cistatic bool default_check_st_other_bits (unsigned char st_other);
205da0c48c4Sopenharmony_cistatic bool default_check_special_section (Ebl *, int,
206da0c48c4Sopenharmony_ci					   const GElf_Shdr *, const char *);
207da0c48c4Sopenharmony_cistatic bool default_bss_plt_p (Elf *elf);
208da0c48c4Sopenharmony_cistatic int default_return_value_location (Dwarf_Die *functypedie,
209da0c48c4Sopenharmony_ci					  const Dwarf_Op **locops);
210da0c48c4Sopenharmony_cistatic ssize_t default_register_info (Ebl *ebl,
211da0c48c4Sopenharmony_ci				      int regno, char *name, size_t namelen,
212da0c48c4Sopenharmony_ci				      const char **prefix,
213da0c48c4Sopenharmony_ci				      const char **setname,
214da0c48c4Sopenharmony_ci				      int *bits, int *type);
215da0c48c4Sopenharmony_cistatic bool default_check_object_attribute (Ebl *ebl, const char *vendor,
216da0c48c4Sopenharmony_ci					    int tag, uint64_t value,
217da0c48c4Sopenharmony_ci					    const char **tag_name,
218da0c48c4Sopenharmony_ci					    const char **value_name);
219da0c48c4Sopenharmony_cistatic bool default_check_reloc_target_type (Ebl *ebl, Elf64_Word sh_type);
220da0c48c4Sopenharmony_cistatic int default_abi_cfi (Ebl *ebl, Dwarf_CIE *abi_info);
221da0c48c4Sopenharmony_ci
222da0c48c4Sopenharmony_ci
223da0c48c4Sopenharmony_cistatic void
224da0c48c4Sopenharmony_cifill_defaults (Ebl *result)
225da0c48c4Sopenharmony_ci{
226da0c48c4Sopenharmony_ci  result->reloc_type_name = default_reloc_type_name;
227da0c48c4Sopenharmony_ci  result->reloc_type_check = default_reloc_type_check;
228da0c48c4Sopenharmony_ci  result->reloc_valid_use = default_reloc_valid_use;
229da0c48c4Sopenharmony_ci  result->reloc_simple_type = default_reloc_simple_type;
230da0c48c4Sopenharmony_ci  result->gotpc_reloc_check = default_gotpc_reloc_check;
231da0c48c4Sopenharmony_ci  result->segment_type_name = default_segment_type_name;
232da0c48c4Sopenharmony_ci  result->section_type_name = default_section_type_name;
233da0c48c4Sopenharmony_ci  result->section_name = default_section_name;
234da0c48c4Sopenharmony_ci  result->machine_flag_name = default_machine_flag_name;
235da0c48c4Sopenharmony_ci  result->machine_flag_check = default_machine_flag_check;
236da0c48c4Sopenharmony_ci  result->machine_section_flag_check = default_machine_section_flag_check;
237da0c48c4Sopenharmony_ci  result->check_special_section = default_check_special_section;
238da0c48c4Sopenharmony_ci  result->symbol_type_name = default_symbol_type_name;
239da0c48c4Sopenharmony_ci  result->symbol_binding_name = default_symbol_binding_name;
240da0c48c4Sopenharmony_ci  result->dynamic_tag_name = default_dynamic_tag_name;
241da0c48c4Sopenharmony_ci  result->dynamic_tag_check = default_dynamic_tag_check;
242da0c48c4Sopenharmony_ci  result->osabi_name = default_osabi_name;
243da0c48c4Sopenharmony_ci  result->core_note_type_name = default_core_note_type_name;
244da0c48c4Sopenharmony_ci  result->object_note_type_name = default_object_note_type_name;
245da0c48c4Sopenharmony_ci  result->core_note = default_core_note;
246da0c48c4Sopenharmony_ci  result->auxv_info = default_auxv_info;
247da0c48c4Sopenharmony_ci  result->object_note = default_object_note;
248da0c48c4Sopenharmony_ci  result->debugscn_p = default_debugscn_p;
249da0c48c4Sopenharmony_ci  result->copy_reloc_p = default_copy_reloc_p;
250da0c48c4Sopenharmony_ci  result->none_reloc_p = default_none_reloc_p;
251da0c48c4Sopenharmony_ci  result->relative_reloc_p = default_relative_reloc_p;
252da0c48c4Sopenharmony_ci  result->check_special_symbol = default_check_special_symbol;
253da0c48c4Sopenharmony_ci  result->data_marker_symbol = default_data_marker_symbol;
254da0c48c4Sopenharmony_ci  result->check_st_other_bits = default_check_st_other_bits;
255da0c48c4Sopenharmony_ci  result->bss_plt_p = default_bss_plt_p;
256da0c48c4Sopenharmony_ci  result->return_value_location = default_return_value_location;
257da0c48c4Sopenharmony_ci  result->register_info = default_register_info;
258da0c48c4Sopenharmony_ci  result->check_object_attribute = default_check_object_attribute;
259da0c48c4Sopenharmony_ci  result->check_reloc_target_type = default_check_reloc_target_type;
260da0c48c4Sopenharmony_ci  result->disasm = NULL;
261da0c48c4Sopenharmony_ci  result->abi_cfi = default_abi_cfi;
262da0c48c4Sopenharmony_ci  result->destr = default_destr;
263da0c48c4Sopenharmony_ci  result->sysvhash_entrysize = sizeof (Elf32_Word);
264da0c48c4Sopenharmony_ci}
265da0c48c4Sopenharmony_ci
266da0c48c4Sopenharmony_ci/* Find an appropriate backend for the file associated with ELF.  */
267da0c48c4Sopenharmony_cistatic Ebl *
268da0c48c4Sopenharmony_ciopenbackend (Elf *elf, const char *emulation, GElf_Half machine)
269da0c48c4Sopenharmony_ci{
270da0c48c4Sopenharmony_ci  Ebl *result;
271da0c48c4Sopenharmony_ci  size_t cnt;
272da0c48c4Sopenharmony_ci
273da0c48c4Sopenharmony_ci  /* First allocate the data structure for the result.  We do this
274da0c48c4Sopenharmony_ci     here since this assures that the structure is always large
275da0c48c4Sopenharmony_ci     enough.  */
276da0c48c4Sopenharmony_ci  result = calloc (1, sizeof (Ebl));
277da0c48c4Sopenharmony_ci  if (result == NULL)
278da0c48c4Sopenharmony_ci    {
279da0c48c4Sopenharmony_ci      // XXX uncomment
280da0c48c4Sopenharmony_ci      // __libebl_seterror (ELF_E_NOMEM);
281da0c48c4Sopenharmony_ci      return NULL;
282da0c48c4Sopenharmony_ci    }
283da0c48c4Sopenharmony_ci
284da0c48c4Sopenharmony_ci  /* Fill in the default callbacks.  The initializer for the machine
285da0c48c4Sopenharmony_ci     specific module can overwrite the values.  */
286da0c48c4Sopenharmony_ci  fill_defaults (result);
287da0c48c4Sopenharmony_ci
288da0c48c4Sopenharmony_ci  /* XXX Currently all we do is to look at 'e_machine' value in the
289da0c48c4Sopenharmony_ci     ELF header.  With an internal mapping table from EM_* value to
290da0c48c4Sopenharmony_ci     DSO name we try to load the appropriate module to handle this
291da0c48c4Sopenharmony_ci     binary type.
292da0c48c4Sopenharmony_ci
293da0c48c4Sopenharmony_ci     Multiple modules for the same machine type are possible and they
294da0c48c4Sopenharmony_ci     will be tried in sequence.  The lookup process will only stop
295da0c48c4Sopenharmony_ci     when a module which can handle the machine type is found or all
296da0c48c4Sopenharmony_ci     available matching modules are tried.  */
297da0c48c4Sopenharmony_ci  for (cnt = 0; cnt < nmachines; ++cnt)
298da0c48c4Sopenharmony_ci    if ((emulation != NULL && strcmp (emulation, machines[cnt].emulation) == 0)
299da0c48c4Sopenharmony_ci	|| (emulation == NULL && machines[cnt].em == machine))
300da0c48c4Sopenharmony_ci      {
301da0c48c4Sopenharmony_ci	/* Well, we know the emulation name now.  */
302da0c48c4Sopenharmony_ci	result->emulation = machines[cnt].emulation;
303da0c48c4Sopenharmony_ci
304da0c48c4Sopenharmony_ci	/* We access some data structures directly.  Make sure the 32 and
305da0c48c4Sopenharmony_ci	   64 bit variants are laid out the same.  */
306da0c48c4Sopenharmony_ci	assert (offsetof (Elf32_Ehdr, e_machine)
307da0c48c4Sopenharmony_ci		== offsetof (Elf64_Ehdr, e_machine));
308da0c48c4Sopenharmony_ci	assert (sizeof (((Elf32_Ehdr *) 0)->e_machine)
309da0c48c4Sopenharmony_ci		== sizeof (((Elf64_Ehdr *) 0)->e_machine));
310da0c48c4Sopenharmony_ci	assert (offsetof (Elf, state.elf32.ehdr)
311da0c48c4Sopenharmony_ci		== offsetof (Elf, state.elf64.ehdr));
312da0c48c4Sopenharmony_ci
313da0c48c4Sopenharmony_ci	/* Prefer taking the information from the ELF file.  */
314da0c48c4Sopenharmony_ci	if (elf == NULL)
315da0c48c4Sopenharmony_ci	  {
316da0c48c4Sopenharmony_ci	    result->machine = machines[cnt].em;
317da0c48c4Sopenharmony_ci	    result->class = machines[cnt].class;
318da0c48c4Sopenharmony_ci	    result->data = machines[cnt].data;
319da0c48c4Sopenharmony_ci	  }
320da0c48c4Sopenharmony_ci	else
321da0c48c4Sopenharmony_ci	  {
322da0c48c4Sopenharmony_ci	    result->machine = elf->state.elf32.ehdr->e_machine;
323da0c48c4Sopenharmony_ci	    result->class = elf->state.elf32.ehdr->e_ident[EI_CLASS];
324da0c48c4Sopenharmony_ci	    result->data = elf->state.elf32.ehdr->e_ident[EI_DATA];
325da0c48c4Sopenharmony_ci	  }
326da0c48c4Sopenharmony_ci
327da0c48c4Sopenharmony_ci        if (machines[cnt].init &&
328da0c48c4Sopenharmony_ci            machines[cnt].init (elf, machine, result))
329da0c48c4Sopenharmony_ci          {
330da0c48c4Sopenharmony_ci            result->elf = elf;
331da0c48c4Sopenharmony_ci            /* A few entries are mandatory.  */
332da0c48c4Sopenharmony_ci            assert (result->destr != NULL);
333da0c48c4Sopenharmony_ci            return result;
334da0c48c4Sopenharmony_ci          }
335da0c48c4Sopenharmony_ci
336da0c48c4Sopenharmony_ci	/* We don't have a backend but the emulation/machine ID matches.
337da0c48c4Sopenharmony_ci	   Return that information.  */
338da0c48c4Sopenharmony_ci	result->elf = elf;
339da0c48c4Sopenharmony_ci	fill_defaults (result);
340da0c48c4Sopenharmony_ci
341da0c48c4Sopenharmony_ci	return result;
342da0c48c4Sopenharmony_ci      }
343da0c48c4Sopenharmony_ci
344da0c48c4Sopenharmony_ci  /* Nothing matched.  We use only the default callbacks.   */
345da0c48c4Sopenharmony_ci  result->elf = elf;
346da0c48c4Sopenharmony_ci  result->emulation = "<unknown>";
347da0c48c4Sopenharmony_ci  fill_defaults (result);
348da0c48c4Sopenharmony_ci
349da0c48c4Sopenharmony_ci  return result;
350da0c48c4Sopenharmony_ci}
351da0c48c4Sopenharmony_ci
352da0c48c4Sopenharmony_ci
353da0c48c4Sopenharmony_ci/* Find an appropriate backend for the file associated with ELF.  */
354da0c48c4Sopenharmony_ciEbl *
355da0c48c4Sopenharmony_ciebl_openbackend (Elf *elf)
356da0c48c4Sopenharmony_ci{
357da0c48c4Sopenharmony_ci  GElf_Ehdr ehdr_mem;
358da0c48c4Sopenharmony_ci  GElf_Ehdr *ehdr;
359da0c48c4Sopenharmony_ci
360da0c48c4Sopenharmony_ci  /* Get the ELF header of the object.  */
361da0c48c4Sopenharmony_ci  ehdr = gelf_getehdr (elf, &ehdr_mem);
362da0c48c4Sopenharmony_ci  if (ehdr == NULL)
363da0c48c4Sopenharmony_ci    {
364da0c48c4Sopenharmony_ci      // XXX uncomment
365da0c48c4Sopenharmony_ci      // __libebl_seterror (elf_errno ());
366da0c48c4Sopenharmony_ci      return NULL;
367da0c48c4Sopenharmony_ci    }
368da0c48c4Sopenharmony_ci
369da0c48c4Sopenharmony_ci  return openbackend (elf, NULL, ehdr->e_machine);
370da0c48c4Sopenharmony_ci}
371da0c48c4Sopenharmony_ci
372da0c48c4Sopenharmony_ci
373da0c48c4Sopenharmony_ci/* Find backend without underlying ELF file.  */
374da0c48c4Sopenharmony_ciEbl *
375da0c48c4Sopenharmony_ciebl_openbackend_machine (GElf_Half machine)
376da0c48c4Sopenharmony_ci{
377da0c48c4Sopenharmony_ci  return openbackend (NULL, NULL, machine);
378da0c48c4Sopenharmony_ci}
379da0c48c4Sopenharmony_ci
380da0c48c4Sopenharmony_ci
381da0c48c4Sopenharmony_ci/* Find backend with given emulation name.  */
382da0c48c4Sopenharmony_ciEbl *
383da0c48c4Sopenharmony_ciebl_openbackend_emulation (const char *emulation)
384da0c48c4Sopenharmony_ci{
385da0c48c4Sopenharmony_ci  return openbackend (NULL, emulation, EM_NONE);
386da0c48c4Sopenharmony_ci}
387da0c48c4Sopenharmony_ci
388da0c48c4Sopenharmony_ci
389da0c48c4Sopenharmony_ci/* Default callbacks.  Mostly they just return the error value.  */
390da0c48c4Sopenharmony_cistatic const char *
391da0c48c4Sopenharmony_cidefault_reloc_type_name (int ignore __attribute__ ((unused)),
392da0c48c4Sopenharmony_ci			 char *buf __attribute__ ((unused)),
393da0c48c4Sopenharmony_ci			 size_t len __attribute__ ((unused)))
394da0c48c4Sopenharmony_ci{
395da0c48c4Sopenharmony_ci  return NULL;
396da0c48c4Sopenharmony_ci}
397da0c48c4Sopenharmony_ci
398da0c48c4Sopenharmony_cistatic bool
399da0c48c4Sopenharmony_cidefault_reloc_type_check (int ignore __attribute__ ((unused)))
400da0c48c4Sopenharmony_ci{
401da0c48c4Sopenharmony_ci  return false;
402da0c48c4Sopenharmony_ci}
403da0c48c4Sopenharmony_ci
404da0c48c4Sopenharmony_cistatic bool
405da0c48c4Sopenharmony_cidefault_reloc_valid_use (Elf *elf __attribute__ ((unused)),
406da0c48c4Sopenharmony_ci			 int ignore __attribute__ ((unused)))
407da0c48c4Sopenharmony_ci{
408da0c48c4Sopenharmony_ci  return false;
409da0c48c4Sopenharmony_ci}
410da0c48c4Sopenharmony_ci
411da0c48c4Sopenharmony_cistatic Elf_Type
412da0c48c4Sopenharmony_cidefault_reloc_simple_type (Ebl *eh __attribute__ ((unused)),
413da0c48c4Sopenharmony_ci			   int ignore __attribute__ ((unused)),
414da0c48c4Sopenharmony_ci			   int *addsub __attribute__ ((unused)))
415da0c48c4Sopenharmony_ci{
416da0c48c4Sopenharmony_ci  return ELF_T_NUM;
417da0c48c4Sopenharmony_ci}
418da0c48c4Sopenharmony_ci
419da0c48c4Sopenharmony_cistatic bool
420da0c48c4Sopenharmony_cidefault_gotpc_reloc_check (Elf *elf __attribute__ ((unused)),
421da0c48c4Sopenharmony_ci			   int ignore __attribute__ ((unused)))
422da0c48c4Sopenharmony_ci{
423da0c48c4Sopenharmony_ci  return false;
424da0c48c4Sopenharmony_ci}
425da0c48c4Sopenharmony_ci
426da0c48c4Sopenharmony_cistatic const char *
427da0c48c4Sopenharmony_cidefault_segment_type_name (int ignore __attribute__ ((unused)),
428da0c48c4Sopenharmony_ci			   char *buf __attribute__ ((unused)),
429da0c48c4Sopenharmony_ci			   size_t len __attribute__ ((unused)))
430da0c48c4Sopenharmony_ci{
431da0c48c4Sopenharmony_ci  return NULL;
432da0c48c4Sopenharmony_ci}
433da0c48c4Sopenharmony_ci
434da0c48c4Sopenharmony_cistatic const char *
435da0c48c4Sopenharmony_cidefault_section_type_name (int ignore __attribute__ ((unused)),
436da0c48c4Sopenharmony_ci			   char *buf __attribute__ ((unused)),
437da0c48c4Sopenharmony_ci			   size_t len __attribute__ ((unused)))
438da0c48c4Sopenharmony_ci{
439da0c48c4Sopenharmony_ci  return NULL;
440da0c48c4Sopenharmony_ci}
441da0c48c4Sopenharmony_ci
442da0c48c4Sopenharmony_cistatic const char *
443da0c48c4Sopenharmony_cidefault_section_name (int ignore __attribute__ ((unused)),
444da0c48c4Sopenharmony_ci		      int ignore2 __attribute__ ((unused)),
445da0c48c4Sopenharmony_ci		      char *buf __attribute__ ((unused)),
446da0c48c4Sopenharmony_ci		      size_t len __attribute__ ((unused)))
447da0c48c4Sopenharmony_ci{
448da0c48c4Sopenharmony_ci  return NULL;
449da0c48c4Sopenharmony_ci}
450da0c48c4Sopenharmony_ci
451da0c48c4Sopenharmony_cistatic const char *
452da0c48c4Sopenharmony_cidefault_machine_flag_name (Elf64_Word orig __attribute__ ((unused)),
453da0c48c4Sopenharmony_ci			   Elf64_Word *ignore __attribute__ ((unused)))
454da0c48c4Sopenharmony_ci{
455da0c48c4Sopenharmony_ci  return NULL;
456da0c48c4Sopenharmony_ci}
457da0c48c4Sopenharmony_ci
458da0c48c4Sopenharmony_cistatic bool
459da0c48c4Sopenharmony_cidefault_machine_flag_check (Elf64_Word flags __attribute__ ((unused)))
460da0c48c4Sopenharmony_ci{
461da0c48c4Sopenharmony_ci  return flags == 0;
462da0c48c4Sopenharmony_ci}
463da0c48c4Sopenharmony_ci
464da0c48c4Sopenharmony_cistatic bool
465da0c48c4Sopenharmony_cidefault_machine_section_flag_check (GElf_Xword flags)
466da0c48c4Sopenharmony_ci{
467da0c48c4Sopenharmony_ci  return flags == 0;
468da0c48c4Sopenharmony_ci}
469da0c48c4Sopenharmony_ci
470da0c48c4Sopenharmony_cistatic bool
471da0c48c4Sopenharmony_cidefault_check_special_section (Ebl *ebl __attribute__ ((unused)),
472da0c48c4Sopenharmony_ci			       int ndx __attribute__ ((unused)),
473da0c48c4Sopenharmony_ci			       const GElf_Shdr *shdr __attribute__ ((unused)),
474da0c48c4Sopenharmony_ci			       const char *sname __attribute__ ((unused)))
475da0c48c4Sopenharmony_ci{
476da0c48c4Sopenharmony_ci  return false;
477da0c48c4Sopenharmony_ci}
478da0c48c4Sopenharmony_ci
479da0c48c4Sopenharmony_cistatic const char *
480da0c48c4Sopenharmony_cidefault_symbol_type_name (int ignore __attribute__ ((unused)),
481da0c48c4Sopenharmony_ci			  char *buf __attribute__ ((unused)),
482da0c48c4Sopenharmony_ci			  size_t len __attribute__ ((unused)))
483da0c48c4Sopenharmony_ci{
484da0c48c4Sopenharmony_ci  return NULL;
485da0c48c4Sopenharmony_ci}
486da0c48c4Sopenharmony_ci
487da0c48c4Sopenharmony_cistatic const char *
488da0c48c4Sopenharmony_cidefault_symbol_binding_name (int ignore __attribute__ ((unused)),
489da0c48c4Sopenharmony_ci			     char *buf __attribute__ ((unused)),
490da0c48c4Sopenharmony_ci			     size_t len __attribute__ ((unused)))
491da0c48c4Sopenharmony_ci{
492da0c48c4Sopenharmony_ci  return NULL;
493da0c48c4Sopenharmony_ci}
494da0c48c4Sopenharmony_ci
495da0c48c4Sopenharmony_cistatic const char *
496da0c48c4Sopenharmony_cidefault_dynamic_tag_name (int64_t ignore __attribute__ ((unused)),
497da0c48c4Sopenharmony_ci			  char *buf __attribute__ ((unused)),
498da0c48c4Sopenharmony_ci			  size_t len __attribute__ ((unused)))
499da0c48c4Sopenharmony_ci{
500da0c48c4Sopenharmony_ci  return NULL;
501da0c48c4Sopenharmony_ci}
502da0c48c4Sopenharmony_ci
503da0c48c4Sopenharmony_cistatic bool
504da0c48c4Sopenharmony_cidefault_dynamic_tag_check (int64_t ignore __attribute__ ((unused)))
505da0c48c4Sopenharmony_ci{
506da0c48c4Sopenharmony_ci  return false;
507da0c48c4Sopenharmony_ci}
508da0c48c4Sopenharmony_ci
509da0c48c4Sopenharmony_cistatic void
510da0c48c4Sopenharmony_cidefault_destr (struct ebl *ignore __attribute__ ((unused)))
511da0c48c4Sopenharmony_ci{
512da0c48c4Sopenharmony_ci}
513da0c48c4Sopenharmony_ci
514da0c48c4Sopenharmony_cistatic const char *
515da0c48c4Sopenharmony_cidefault_osabi_name (int ignore __attribute__ ((unused)),
516da0c48c4Sopenharmony_ci		    char *buf __attribute__ ((unused)),
517da0c48c4Sopenharmony_ci		    size_t len __attribute__ ((unused)))
518da0c48c4Sopenharmony_ci{
519da0c48c4Sopenharmony_ci  return NULL;
520da0c48c4Sopenharmony_ci}
521da0c48c4Sopenharmony_ci
522da0c48c4Sopenharmony_cistatic const char *
523da0c48c4Sopenharmony_cidefault_core_note_type_name (uint32_t ignore __attribute__ ((unused)),
524da0c48c4Sopenharmony_ci			     char *buf __attribute__ ((unused)),
525da0c48c4Sopenharmony_ci			     size_t len __attribute__ ((unused)))
526da0c48c4Sopenharmony_ci{
527da0c48c4Sopenharmony_ci  return NULL;
528da0c48c4Sopenharmony_ci}
529da0c48c4Sopenharmony_ci
530da0c48c4Sopenharmony_cistatic int
531da0c48c4Sopenharmony_cidefault_auxv_info (GElf_Xword a_type __attribute__ ((unused)),
532da0c48c4Sopenharmony_ci		   const char **name __attribute__ ((unused)),
533da0c48c4Sopenharmony_ci		   const char **format __attribute__ ((unused)))
534da0c48c4Sopenharmony_ci{
535da0c48c4Sopenharmony_ci  return 0;
536da0c48c4Sopenharmony_ci}
537da0c48c4Sopenharmony_ci
538da0c48c4Sopenharmony_cistatic int
539da0c48c4Sopenharmony_cidefault_core_note (const GElf_Nhdr *nhdr __attribute__ ((unused)),
540da0c48c4Sopenharmony_ci		   const char *name __attribute__ ((unused)),
541da0c48c4Sopenharmony_ci		   GElf_Word *ro __attribute__ ((unused)),
542da0c48c4Sopenharmony_ci		   size_t *nregloc  __attribute__ ((unused)),
543da0c48c4Sopenharmony_ci		   const Ebl_Register_Location **reglocs
544da0c48c4Sopenharmony_ci		   __attribute__ ((unused)),
545da0c48c4Sopenharmony_ci		   size_t *nitems __attribute__ ((unused)),
546da0c48c4Sopenharmony_ci		   const Ebl_Core_Item **items __attribute__ ((unused)))
547da0c48c4Sopenharmony_ci{
548da0c48c4Sopenharmony_ci  return 0;
549da0c48c4Sopenharmony_ci}
550da0c48c4Sopenharmony_ci
551da0c48c4Sopenharmony_cistatic const char *
552da0c48c4Sopenharmony_cidefault_object_note_type_name (const char *name __attribute__ ((unused)),
553da0c48c4Sopenharmony_ci			       uint32_t ignore __attribute__ ((unused)),
554da0c48c4Sopenharmony_ci			       char *buf __attribute__ ((unused)),
555da0c48c4Sopenharmony_ci			       size_t len __attribute__ ((unused)))
556da0c48c4Sopenharmony_ci{
557da0c48c4Sopenharmony_ci  return NULL;
558da0c48c4Sopenharmony_ci}
559da0c48c4Sopenharmony_ci
560da0c48c4Sopenharmony_cistatic bool
561da0c48c4Sopenharmony_cidefault_object_note (const char *name __attribute__ ((unused)),
562da0c48c4Sopenharmony_ci		     uint32_t type __attribute__ ((unused)),
563da0c48c4Sopenharmony_ci		     uint32_t descsz __attribute__ ((unused)),
564da0c48c4Sopenharmony_ci		     const char *desc __attribute__ ((unused)))
565da0c48c4Sopenharmony_ci{
566da0c48c4Sopenharmony_ci  return NULL;
567da0c48c4Sopenharmony_ci}
568da0c48c4Sopenharmony_ci
569da0c48c4Sopenharmony_cistatic bool
570da0c48c4Sopenharmony_cidefault_debugscn_p (const char *name)
571da0c48c4Sopenharmony_ci{
572da0c48c4Sopenharmony_ci  /* We know by default only about the DWARF debug sections which have
573da0c48c4Sopenharmony_ci     fixed names.  */
574da0c48c4Sopenharmony_ci  static const char *dwarf_scn_names[] =
575da0c48c4Sopenharmony_ci    {
576da0c48c4Sopenharmony_ci      /* DWARF 1 */
577da0c48c4Sopenharmony_ci      ".debug",
578da0c48c4Sopenharmony_ci      ".line",
579da0c48c4Sopenharmony_ci      /* GNU DWARF 1 extensions */
580da0c48c4Sopenharmony_ci      ".debug_srcinfo",
581da0c48c4Sopenharmony_ci      ".debug_sfnames",
582da0c48c4Sopenharmony_ci      /* DWARF 1.1 and DWARF 2 */
583da0c48c4Sopenharmony_ci      ".debug_aranges",
584da0c48c4Sopenharmony_ci      ".debug_pubnames",
585da0c48c4Sopenharmony_ci      /* DWARF 2 */
586da0c48c4Sopenharmony_ci      ".debug_info",
587da0c48c4Sopenharmony_ci      ".debug_abbrev",
588da0c48c4Sopenharmony_ci      ".debug_line",
589da0c48c4Sopenharmony_ci      ".debug_frame",
590da0c48c4Sopenharmony_ci      ".debug_str",
591da0c48c4Sopenharmony_ci      ".debug_loc",
592da0c48c4Sopenharmony_ci      ".debug_macinfo",
593da0c48c4Sopenharmony_ci      /* DWARF 3 */
594da0c48c4Sopenharmony_ci      ".debug_ranges",
595da0c48c4Sopenharmony_ci      ".debug_pubtypes",
596da0c48c4Sopenharmony_ci      /* DWARF 4 */
597da0c48c4Sopenharmony_ci      ".debug_types",
598da0c48c4Sopenharmony_ci      /* GDB DWARF 4 extension */
599da0c48c4Sopenharmony_ci      ".gdb_index",
600da0c48c4Sopenharmony_ci      /* GNU/DWARF 5 extension/proposal */
601da0c48c4Sopenharmony_ci      ".debug_macro",
602da0c48c4Sopenharmony_ci      /* DWARF 5 */
603da0c48c4Sopenharmony_ci      ".debug_addr",
604da0c48c4Sopenharmony_ci      ".debug_line_str",
605da0c48c4Sopenharmony_ci      ".debug_loclists",
606da0c48c4Sopenharmony_ci      ".debug_names",
607da0c48c4Sopenharmony_ci      ".debug_rnglists",
608da0c48c4Sopenharmony_ci      ".debug_str_offsets",
609da0c48c4Sopenharmony_ci      /* SGI/MIPS DWARF 2 extensions */
610da0c48c4Sopenharmony_ci      ".debug_weaknames",
611da0c48c4Sopenharmony_ci      ".debug_funcnames",
612da0c48c4Sopenharmony_ci      ".debug_typenames",
613da0c48c4Sopenharmony_ci      ".debug_varnames"
614da0c48c4Sopenharmony_ci    };
615da0c48c4Sopenharmony_ci  const size_t ndwarf_scn_names = (sizeof (dwarf_scn_names)
616da0c48c4Sopenharmony_ci				   / sizeof (dwarf_scn_names[0]));
617da0c48c4Sopenharmony_ci  for (size_t cnt = 0; cnt < ndwarf_scn_names; ++cnt)
618da0c48c4Sopenharmony_ci    if (strcmp (name, dwarf_scn_names[cnt]) == 0
619da0c48c4Sopenharmony_ci	|| (startswith (name, ".zdebug")
620da0c48c4Sopenharmony_ci	    && strcmp (&name[2], &dwarf_scn_names[cnt][1]) == 0)
621da0c48c4Sopenharmony_ci	|| (startswith (name, ".gnu.debuglto_")
622da0c48c4Sopenharmony_ci	    && strcmp (&name[14], dwarf_scn_names[cnt]) == 0))
623da0c48c4Sopenharmony_ci      return true;
624da0c48c4Sopenharmony_ci
625da0c48c4Sopenharmony_ci  return false;
626da0c48c4Sopenharmony_ci}
627da0c48c4Sopenharmony_ci
628da0c48c4Sopenharmony_cistatic bool
629da0c48c4Sopenharmony_cidefault_copy_reloc_p (int reloc __attribute__ ((unused)))
630da0c48c4Sopenharmony_ci{
631da0c48c4Sopenharmony_ci  return false;
632da0c48c4Sopenharmony_ci}
633da0c48c4Sopenharmony_cistrong_alias (default_copy_reloc_p, default_none_reloc_p)
634da0c48c4Sopenharmony_cistrong_alias (default_copy_reloc_p, default_relative_reloc_p)
635da0c48c4Sopenharmony_ci
636da0c48c4Sopenharmony_cistatic bool
637da0c48c4Sopenharmony_cidefault_check_special_symbol (Elf *elf __attribute__ ((unused)),
638da0c48c4Sopenharmony_ci			      const GElf_Sym *sym __attribute__ ((unused)),
639da0c48c4Sopenharmony_ci			      const char *name __attribute__ ((unused)),
640da0c48c4Sopenharmony_ci			      const GElf_Shdr *destshdr __attribute__ ((unused)))
641da0c48c4Sopenharmony_ci{
642da0c48c4Sopenharmony_ci  return false;
643da0c48c4Sopenharmony_ci}
644da0c48c4Sopenharmony_ci
645da0c48c4Sopenharmony_cistatic bool
646da0c48c4Sopenharmony_cidefault_data_marker_symbol (const GElf_Sym *sym __attribute__ ((unused)),
647da0c48c4Sopenharmony_ci			    const char *sname __attribute__ ((unused)))
648da0c48c4Sopenharmony_ci{
649da0c48c4Sopenharmony_ci  return false;
650da0c48c4Sopenharmony_ci}
651da0c48c4Sopenharmony_ci
652da0c48c4Sopenharmony_cistatic bool
653da0c48c4Sopenharmony_cidefault_check_st_other_bits (unsigned char st_other __attribute__ ((unused)))
654da0c48c4Sopenharmony_ci{
655da0c48c4Sopenharmony_ci  return false;
656da0c48c4Sopenharmony_ci}
657da0c48c4Sopenharmony_ci
658da0c48c4Sopenharmony_ci
659da0c48c4Sopenharmony_cistatic bool
660da0c48c4Sopenharmony_cidefault_bss_plt_p (Elf *elf __attribute__ ((unused)))
661da0c48c4Sopenharmony_ci{
662da0c48c4Sopenharmony_ci  return false;
663da0c48c4Sopenharmony_ci}
664da0c48c4Sopenharmony_ci
665da0c48c4Sopenharmony_cistatic int
666da0c48c4Sopenharmony_cidefault_return_value_location (Dwarf_Die *functypedie __attribute__ ((unused)),
667da0c48c4Sopenharmony_ci			       const Dwarf_Op **locops __attribute__ ((unused)))
668da0c48c4Sopenharmony_ci{
669da0c48c4Sopenharmony_ci  return -2;
670da0c48c4Sopenharmony_ci}
671da0c48c4Sopenharmony_ci
672da0c48c4Sopenharmony_cistatic ssize_t
673da0c48c4Sopenharmony_cidefault_register_info (Ebl *ebl __attribute__ ((unused)),
674da0c48c4Sopenharmony_ci		       int regno, char *name, size_t namelen,
675da0c48c4Sopenharmony_ci		       const char **prefix,
676da0c48c4Sopenharmony_ci		       const char **setname,
677da0c48c4Sopenharmony_ci		       int *bits, int *type)
678da0c48c4Sopenharmony_ci{
679da0c48c4Sopenharmony_ci  if (name == NULL)
680da0c48c4Sopenharmony_ci    return 0;
681da0c48c4Sopenharmony_ci
682da0c48c4Sopenharmony_ci  *setname = "???";
683da0c48c4Sopenharmony_ci  *prefix = "";
684da0c48c4Sopenharmony_ci  *bits = -1;
685da0c48c4Sopenharmony_ci  *type = DW_ATE_void;
686da0c48c4Sopenharmony_ci  return snprintf (name, namelen, "reg%d", regno);
687da0c48c4Sopenharmony_ci}
688da0c48c4Sopenharmony_ci
689da0c48c4Sopenharmony_cistatic bool
690da0c48c4Sopenharmony_cidefault_check_object_attribute (Ebl *ebl __attribute__ ((unused)),
691da0c48c4Sopenharmony_ci				const char *vendor  __attribute__ ((unused)),
692da0c48c4Sopenharmony_ci				int tag __attribute__ ((unused)),
693da0c48c4Sopenharmony_ci				uint64_t value __attribute__ ((unused)),
694da0c48c4Sopenharmony_ci				const char **tag_name, const char **value_name)
695da0c48c4Sopenharmony_ci{
696da0c48c4Sopenharmony_ci  *tag_name = NULL;
697da0c48c4Sopenharmony_ci  *value_name = NULL;
698da0c48c4Sopenharmony_ci  return false;
699da0c48c4Sopenharmony_ci}
700da0c48c4Sopenharmony_ci
701da0c48c4Sopenharmony_cistatic bool
702da0c48c4Sopenharmony_cidefault_check_reloc_target_type (Ebl *ebl __attribute__ ((unused)),
703da0c48c4Sopenharmony_ci				 Elf64_Word sh_type __attribute__ ((unused)))
704da0c48c4Sopenharmony_ci{
705da0c48c4Sopenharmony_ci  return false;
706da0c48c4Sopenharmony_ci}
707da0c48c4Sopenharmony_ci
708da0c48c4Sopenharmony_cistatic int
709da0c48c4Sopenharmony_cidefault_abi_cfi (Ebl *ebl __attribute__ ((unused)),
710da0c48c4Sopenharmony_ci		 Dwarf_CIE *abi_info __attribute__ ((unused)))
711da0c48c4Sopenharmony_ci{
712da0c48c4Sopenharmony_ci  return -1;
713da0c48c4Sopenharmony_ci}
714