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