LCOV - code coverage report
Current view: top level - libebl - eblopenbackend.c (source / functions) Hit Total Coverage
Test: elfutils-0.177 Lines: 136 194 70.1 %
Date: 2019-08-14 14:28:26 Functions: 24 41 58.5 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.13