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