Coverage Report

Created: 2026-09-07 06:05

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