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