1/* Generate ELF backend handle. 2 Copyright (C) 2000-2015 Red Hat, Inc. 3 This file is part of elfutils. 4 5 This file is free software; you can redistribute it and/or modify 6 it under the terms of either 7 8 * the GNU Lesser General Public License as published by the Free 9 Software Foundation; either version 3 of the License, or (at 10 your option) any later version 11 12 or 13 14 * the GNU General Public License as published by the Free 15 Software Foundation; either version 2 of the License, or (at 16 your option) any later version 17 18 or both in parallel, as here. 19 20 elfutils is distributed in the hope that it will be useful, but 21 WITHOUT ANY WARRANTY; without even the implied warranty of 22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 23 General Public License for more details. 24 25 You should have received copies of the GNU General Public License and 26 the GNU Lesser General Public License along with this program. If 27 not, see <http://www.gnu.org/licenses/>. */ 28 29#ifdef HAVE_CONFIG_H 30# include <config.h> 31#endif 32 33#include <assert.h> 34#include <dlfcn.h> 35#include <error.h> 36#include <libelfP.h> 37#include <dwarf.h> 38#include <stdlib.h> 39#include <string.h> 40#include <stdio.h> 41 42#include <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. */ 49static 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, 0, 0 }, 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}; 136#define nmachines (sizeof (machines) / sizeof (machines[0])) 137 138/* No machine prefix should be larger than this. */ 139#define MAX_PREFIX_LEN 16 140 141/* Default callbacks. Mostly they just return the error value. */ 142static const char *default_object_type_name (int ignore, char *buf, 143 size_t len); 144static const char *default_reloc_type_name (int ignore, char *buf, size_t len); 145static bool default_reloc_type_check (int ignore); 146static bool default_reloc_valid_use (Elf *elf, int ignore); 147static Elf_Type default_reloc_simple_type (Ebl *ebl, int ignore); 148static bool default_gotpc_reloc_check (Elf *elf, int ignore); 149static const char *default_segment_type_name (int ignore, char *buf, 150 size_t len); 151static const char *default_section_type_name (int ignore, char *buf, 152 size_t len); 153static const char *default_section_name (int ignore, int ignore2, char *buf, 154 size_t len); 155static const char *default_machine_flag_name (Elf64_Word *ignore); 156static bool default_machine_flag_check (Elf64_Word flags); 157static bool default_machine_section_flag_check (GElf_Xword flags); 158static const char *default_symbol_type_name (int ignore, char *buf, 159 size_t len); 160static const char *default_symbol_binding_name (int ignore, char *buf, 161 size_t len); 162static const char *default_dynamic_tag_name (int64_t ignore, char *buf, 163 size_t len); 164static bool default_dynamic_tag_check (int64_t ignore); 165static GElf_Word default_sh_flags_combine (GElf_Word flags1, GElf_Word flags2); 166static const char *default_osabi_name (int ignore, char *buf, size_t len); 167static void default_destr (struct ebl *ignore); 168static const char *default_core_note_type_name (uint32_t, char *buf, 169 size_t len); 170static const char *default_object_note_type_name (const char *name, uint32_t, 171 char *buf, size_t len); 172static int default_core_note (const GElf_Nhdr *nhdr, const char *name, 173 GElf_Word *regs_offset, size_t *nregloc, 174 const Ebl_Register_Location **reglocs, 175 size_t *nitems, const Ebl_Core_Item **); 176static int default_auxv_info (GElf_Xword a_type, 177 const char **name, const char **format); 178static bool default_object_note (const char *name, uint32_t type, 179 uint32_t descsz, const char *desc); 180static bool default_debugscn_p (const char *name); 181static bool default_copy_reloc_p (int reloc); 182static bool default_none_reloc_p (int reloc); 183static bool default_relative_reloc_p (int reloc); 184static bool default_check_special_symbol (Elf *elf, GElf_Ehdr *ehdr, 185 const GElf_Sym *sym, 186 const char *name, 187 const GElf_Shdr *destshdr); 188static bool default_check_st_other_bits (unsigned char st_other); 189static bool default_check_special_section (Ebl *, int, 190 const GElf_Shdr *, const char *); 191static bool default_bss_plt_p (Elf *elf); 192static int default_return_value_location (Dwarf_Die *functypedie, 193 const Dwarf_Op **locops); 194static ssize_t default_register_info (Ebl *ebl, 195 int regno, char *name, size_t namelen, 196 const char **prefix, 197 const char **setname, 198 int *bits, int *type); 199static int default_syscall_abi (Ebl *ebl, int *sp, int *pc, 200 int *callno, int args[6]); 201static bool default_check_object_attribute (Ebl *ebl, const char *vendor, 202 int tag, uint64_t value, 203 const char **tag_name, 204 const char **value_name); 205static bool default_check_reloc_target_type (Ebl *ebl, Elf64_Word sh_type); 206static int default_abi_cfi (Ebl *ebl, Dwarf_CIE *abi_info); 207 208 209static void 210fill_defaults (Ebl *result) 211{ 212 result->object_type_name = default_object_type_name; 213 result->reloc_type_name = default_reloc_type_name; 214 result->reloc_type_check = default_reloc_type_check; 215 result->reloc_valid_use = default_reloc_valid_use; 216 result->reloc_simple_type = default_reloc_simple_type; 217 result->gotpc_reloc_check = default_gotpc_reloc_check; 218 result->segment_type_name = default_segment_type_name; 219 result->section_type_name = default_section_type_name; 220 result->section_name = default_section_name; 221 result->machine_flag_name = default_machine_flag_name; 222 result->machine_flag_check = default_machine_flag_check; 223 result->machine_section_flag_check = default_machine_section_flag_check; 224 result->check_special_section = default_check_special_section; 225 result->symbol_type_name = default_symbol_type_name; 226 result->symbol_binding_name = default_symbol_binding_name; 227 result->dynamic_tag_name = default_dynamic_tag_name; 228 result->dynamic_tag_check = default_dynamic_tag_check; 229 result->sh_flags_combine = default_sh_flags_combine; 230 result->osabi_name = default_osabi_name; 231 result->core_note_type_name = default_core_note_type_name; 232 result->object_note_type_name = default_object_note_type_name; 233 result->core_note = default_core_note; 234 result->auxv_info = default_auxv_info; 235 result->object_note = default_object_note; 236 result->debugscn_p = default_debugscn_p; 237 result->copy_reloc_p = default_copy_reloc_p; 238 result->none_reloc_p = default_none_reloc_p; 239 result->relative_reloc_p = default_relative_reloc_p; 240 result->check_special_symbol = default_check_special_symbol; 241 result->check_st_other_bits = default_check_st_other_bits; 242 result->bss_plt_p = default_bss_plt_p; 243 result->return_value_location = default_return_value_location; 244 result->register_info = default_register_info; 245 result->syscall_abi = default_syscall_abi; 246 result->check_object_attribute = default_check_object_attribute; 247 result->check_reloc_target_type = default_check_reloc_target_type; 248 result->disasm = NULL; 249 result->abi_cfi = default_abi_cfi; 250 result->destr = default_destr; 251 result->sysvhash_entrysize = sizeof (Elf32_Word); 252} 253 254 255/* Find an appropriate backend for the file associated with ELF. */ 256static Ebl * 257openbackend (Elf *elf, const char *emulation, GElf_Half machine) 258{ 259 Ebl *result; 260 size_t cnt; 261 262 /* First allocate the data structure for the result. We do this 263 here since this assures that the structure is always large 264 enough. */ 265 result = (Ebl *) calloc (1, sizeof (Ebl)); 266 if (result == NULL) 267 { 268 // XXX uncomment 269 // __libebl_seterror (ELF_E_NOMEM); 270 return NULL; 271 } 272 273 /* Fill in the default callbacks. The initializer for the machine 274 specific module can overwrite the values. */ 275 fill_defaults (result); 276 277 /* XXX Currently all we do is to look at 'e_machine' value in the 278 ELF header. With an internal mapping table from EM_* value to 279 DSO name we try to load the appropriate module to handle this 280 binary type. 281 282 Multiple modules for the same machine type are possible and they 283 will be tried in sequence. The lookup process will only stop 284 when a module which can handle the machine type is found or all 285 available matching modules are tried. */ 286 for (cnt = 0; cnt < nmachines; ++cnt) 287 if ((emulation != NULL && strcmp (emulation, machines[cnt].emulation) == 0) 288 || (emulation == NULL && machines[cnt].em == machine)) 289 { 290 /* Well, we know the emulation name now. */ 291 result->emulation = machines[cnt].emulation; 292 293 /* We access some data structures directly. Make sure the 32 and 294 64 bit variants are laid out the same. */ 295 assert (offsetof (Elf32_Ehdr, e_machine) 296 == offsetof (Elf64_Ehdr, e_machine)); 297 assert (sizeof (((Elf32_Ehdr *) 0)->e_machine) 298 == sizeof (((Elf64_Ehdr *) 0)->e_machine)); 299 assert (offsetof (Elf, state.elf32.ehdr) 300 == offsetof (Elf, state.elf64.ehdr)); 301 302 /* Prefer taking the information from the ELF file. */ 303 if (elf == NULL) 304 { 305 result->machine = machines[cnt].em; 306 result->class = machines[cnt].class; 307 result->data = machines[cnt].data; 308 } 309 else 310 { 311 result->machine = elf->state.elf32.ehdr->e_machine; 312 result->class = elf->state.elf32.ehdr->e_ident[EI_CLASS]; 313 result->data = elf->state.elf32.ehdr->e_ident[EI_DATA]; 314 } 315 316#ifndef LIBEBL_SUBDIR 317# define LIBEBL_SUBDIR PACKAGE 318#endif 319#define ORIGINDIR "$ORIGIN/../$LIB/" LIBEBL_SUBDIR "/" 320 321 /* Give it a try. At least the machine type matches. First 322 try to load the module. */ 323 char dsoname[100]; 324 strcpy (stpcpy (stpcpy (dsoname, ORIGINDIR "libebl_"), 325 machines[cnt].dsoname), 326 ".so"); 327 328 void *h = dlopen (dsoname, RTLD_LAZY); 329 if (h == NULL) 330 { 331 strcpy (stpcpy (stpcpy (dsoname, "libebl_"), 332 machines[cnt].dsoname), 333 ".so"); 334 h = dlopen (dsoname, RTLD_LAZY); 335 } 336 337 /* Try without an explicit path. */ 338 if (h != NULL) 339 { 340 /* We managed to load the object. Now see whether the 341 initialization function likes our file. */ 342 static const char version[] = MODVERSION; 343 const char *modversion; 344 ebl_bhinit_t initp; 345 346 // We use a static number to help the compiler see we don't 347 // overflow the stack with an arbitrary number. 348 assert (machines[cnt].prefix_len <= MAX_PREFIX_LEN); 349 char symname[MAX_PREFIX_LEN + sizeof "_init"]; 350 351 strcpy (mempcpy (symname, machines[cnt].prefix, 352 machines[cnt].prefix_len), "_init"); 353 354 initp = (ebl_bhinit_t) dlsym (h, symname); 355 if (initp != NULL 356 && (modversion = initp (elf, machine, result, sizeof (Ebl))) 357 && strcmp (version, modversion) == 0) 358 { 359 /* We found a module to handle our file. */ 360 result->dlhandle = h; 361 result->elf = elf; 362 363 /* A few entries are mandatory. */ 364 assert (result->name != NULL); 365 assert (result->destr != NULL); 366 367 return result; 368 } 369 370 /* Not the module we need. */ 371 (void) dlclose (h); 372 } 373 374 /* We cannot find a DSO but the emulation/machine ID matches. 375 Return that information. */ 376 result->dlhandle = NULL; 377 result->elf = elf; 378 result->name = machines[cnt].prefix; 379 fill_defaults (result); 380 381 return result; 382 } 383 384 /* Nothing matched. We use only the default callbacks. */ 385 result->dlhandle = NULL; 386 result->elf = elf; 387 result->emulation = "<unknown>"; 388 result->name = "<unknown>"; 389 fill_defaults (result); 390 391 return result; 392} 393 394 395/* Find an appropriate backend for the file associated with ELF. */ 396Ebl * 397ebl_openbackend (Elf *elf) 398{ 399 GElf_Ehdr ehdr_mem; 400 GElf_Ehdr *ehdr; 401 402 /* Get the ELF header of the object. */ 403 ehdr = gelf_getehdr (elf, &ehdr_mem); 404 if (ehdr == NULL) 405 { 406 // XXX uncomment 407 // __libebl_seterror (elf_errno ()); 408 return NULL; 409 } 410 411 return openbackend (elf, NULL, ehdr->e_machine); 412} 413 414 415/* Find backend without underlying ELF file. */ 416Ebl * 417ebl_openbackend_machine (GElf_Half machine) 418{ 419 return openbackend (NULL, NULL, machine); 420} 421 422 423/* Find backend with given emulation name. */ 424Ebl * 425ebl_openbackend_emulation (const char *emulation) 426{ 427 return openbackend (NULL, emulation, EM_NONE); 428} 429 430 431/* Default callbacks. Mostly they just return the error value. */ 432static const char * 433default_object_type_name (int ignore __attribute__ ((unused)), 434 char *buf __attribute__ ((unused)), 435 size_t len __attribute__ ((unused))) 436{ 437 return NULL; 438} 439 440static const char * 441default_reloc_type_name (int ignore __attribute__ ((unused)), 442 char *buf __attribute__ ((unused)), 443 size_t len __attribute__ ((unused))) 444{ 445 return NULL; 446} 447 448static bool 449default_reloc_type_check (int ignore __attribute__ ((unused))) 450{ 451 return false; 452} 453 454static bool 455default_reloc_valid_use (Elf *elf __attribute__ ((unused)), 456 int ignore __attribute__ ((unused))) 457{ 458 return false; 459} 460 461static Elf_Type 462default_reloc_simple_type (Ebl *eh __attribute__ ((unused)), 463 int ignore __attribute__ ((unused))) 464{ 465 return ELF_T_NUM; 466} 467 468static bool 469default_gotpc_reloc_check (Elf *elf __attribute__ ((unused)), 470 int ignore __attribute__ ((unused))) 471{ 472 return false; 473} 474 475static const char * 476default_segment_type_name (int ignore __attribute__ ((unused)), 477 char *buf __attribute__ ((unused)), 478 size_t len __attribute__ ((unused))) 479{ 480 return NULL; 481} 482 483static const char * 484default_section_type_name (int ignore __attribute__ ((unused)), 485 char *buf __attribute__ ((unused)), 486 size_t len __attribute__ ((unused))) 487{ 488 return NULL; 489} 490 491static const char * 492default_section_name (int ignore __attribute__ ((unused)), 493 int ignore2 __attribute__ ((unused)), 494 char *buf __attribute__ ((unused)), 495 size_t len __attribute__ ((unused))) 496{ 497 return NULL; 498} 499 500static const char * 501default_machine_flag_name (Elf64_Word *ignore __attribute__ ((unused))) 502{ 503 return NULL; 504} 505 506static bool 507default_machine_flag_check (Elf64_Word flags __attribute__ ((unused))) 508{ 509 return flags == 0; 510} 511 512static bool 513default_machine_section_flag_check (GElf_Xword flags) 514{ 515 return flags == 0; 516} 517 518static bool 519default_check_special_section (Ebl *ebl __attribute__ ((unused)), 520 int ndx __attribute__ ((unused)), 521 const GElf_Shdr *shdr __attribute__ ((unused)), 522 const char *sname __attribute__ ((unused))) 523{ 524 return false; 525} 526 527static const char * 528default_symbol_type_name (int ignore __attribute__ ((unused)), 529 char *buf __attribute__ ((unused)), 530 size_t len __attribute__ ((unused))) 531{ 532 return NULL; 533} 534 535static const char * 536default_symbol_binding_name (int ignore __attribute__ ((unused)), 537 char *buf __attribute__ ((unused)), 538 size_t len __attribute__ ((unused))) 539{ 540 return NULL; 541} 542 543static const char * 544default_dynamic_tag_name (int64_t ignore __attribute__ ((unused)), 545 char *buf __attribute__ ((unused)), 546 size_t len __attribute__ ((unused))) 547{ 548 return NULL; 549} 550 551static bool 552default_dynamic_tag_check (int64_t ignore __attribute__ ((unused))) 553{ 554 return false; 555} 556 557static GElf_Word 558default_sh_flags_combine (GElf_Word flags1, GElf_Word flags2) 559{ 560 return SH_FLAGS_COMBINE (flags1, flags2); 561} 562 563static void 564default_destr (struct ebl *ignore __attribute__ ((unused))) 565{ 566} 567 568static const char * 569default_osabi_name (int ignore __attribute__ ((unused)), 570 char *buf __attribute__ ((unused)), 571 size_t len __attribute__ ((unused))) 572{ 573 return NULL; 574} 575 576static const char * 577default_core_note_type_name (uint32_t ignore __attribute__ ((unused)), 578 char *buf __attribute__ ((unused)), 579 size_t len __attribute__ ((unused))) 580{ 581 return NULL; 582} 583 584static int 585default_auxv_info (GElf_Xword a_type __attribute__ ((unused)), 586 const char **name __attribute__ ((unused)), 587 const char **format __attribute__ ((unused))) 588{ 589 return 0; 590} 591 592static int 593default_core_note (const GElf_Nhdr *nhdr __attribute__ ((unused)), 594 const char *name __attribute__ ((unused)), 595 GElf_Word *ro __attribute__ ((unused)), 596 size_t *nregloc __attribute__ ((unused)), 597 const Ebl_Register_Location **reglocs 598 __attribute__ ((unused)), 599 size_t *nitems __attribute__ ((unused)), 600 const Ebl_Core_Item **items __attribute__ ((unused))) 601{ 602 return 0; 603} 604 605static const char * 606default_object_note_type_name (const char *name __attribute__ ((unused)), 607 uint32_t ignore __attribute__ ((unused)), 608 char *buf __attribute__ ((unused)), 609 size_t len __attribute__ ((unused))) 610{ 611 return NULL; 612} 613 614static bool 615default_object_note (const char *name __attribute__ ((unused)), 616 uint32_t type __attribute__ ((unused)), 617 uint32_t descsz __attribute__ ((unused)), 618 const char *desc __attribute__ ((unused))) 619{ 620 return NULL; 621} 622 623static bool 624default_debugscn_p (const char *name) 625{ 626 /* We know by default only about the DWARF debug sections which have 627 fixed names. */ 628 static const char *dwarf_scn_names[] = 629 { 630 /* DWARF 1 */ 631 ".debug", 632 ".line", 633 /* GNU DWARF 1 extensions */ 634 ".debug_srcinfo", 635 ".debug_sfnames", 636 /* DWARF 1.1 and DWARF 2 */ 637 ".debug_aranges", 638 ".debug_pubnames", 639 /* DWARF 2 */ 640 ".debug_info", 641 ".debug_abbrev", 642 ".debug_line", 643 ".debug_frame", 644 ".debug_str", 645 ".debug_loc", 646 ".debug_macinfo", 647 /* DWARF 3 */ 648 ".debug_ranges", 649 ".debug_pubtypes", 650 /* DWARF 4 */ 651 ".debug_types", 652 /* GDB DWARF 4 extension */ 653 ".gdb_index", 654 /* GNU/DWARF 5 extension/proposal */ 655 ".debug_macro", 656 /* SGI/MIPS DWARF 2 extensions */ 657 ".debug_weaknames", 658 ".debug_funcnames", 659 ".debug_typenames", 660 ".debug_varnames" 661 }; 662 const size_t ndwarf_scn_names = (sizeof (dwarf_scn_names) 663 / sizeof (dwarf_scn_names[0])); 664 for (size_t cnt = 0; cnt < ndwarf_scn_names; ++cnt) 665 if (strcmp (name, dwarf_scn_names[cnt]) == 0 666 || (strncmp (name, ".zdebug", strlen (".zdebug")) == 0 667 && strcmp (&name[2], &dwarf_scn_names[cnt][1]) == 0)) 668 return true; 669 670 return false; 671} 672 673static bool 674default_copy_reloc_p (int reloc __attribute__ ((unused))) 675{ 676 return false; 677} 678strong_alias (default_copy_reloc_p, default_none_reloc_p) 679strong_alias (default_copy_reloc_p, default_relative_reloc_p) 680 681static bool 682default_check_special_symbol (Elf *elf __attribute__ ((unused)), 683 GElf_Ehdr *ehdr __attribute__ ((unused)), 684 const GElf_Sym *sym __attribute__ ((unused)), 685 const char *name __attribute__ ((unused)), 686 const GElf_Shdr *destshdr __attribute__ ((unused))) 687{ 688 return false; 689} 690 691static bool 692default_check_st_other_bits (unsigned char st_other __attribute__ ((unused))) 693{ 694 return false; 695} 696 697 698static bool 699default_bss_plt_p (Elf *elf __attribute__ ((unused))) 700{ 701 return false; 702} 703 704static int 705default_return_value_location (Dwarf_Die *functypedie __attribute__ ((unused)), 706 const Dwarf_Op **locops __attribute__ ((unused))) 707{ 708 return -2; 709} 710 711static ssize_t 712default_register_info (Ebl *ebl __attribute__ ((unused)), 713 int regno, char *name, size_t namelen, 714 const char **prefix, 715 const char **setname, 716 int *bits, int *type) 717{ 718 if (name == NULL) 719 return 0; 720 721 *setname = "???"; 722 *prefix = ""; 723 *bits = -1; 724 *type = DW_ATE_void; 725 return snprintf (name, namelen, "reg%d", regno); 726} 727 728static int 729default_syscall_abi (Ebl *ebl __attribute__ ((unused)), 730 int *sp, int *pc, int *callno, int args[6]) 731{ 732 *sp = *pc = *callno = -1; 733 args[0] = -1; 734 args[1] = -1; 735 args[2] = -1; 736 args[3] = -1; 737 args[4] = -1; 738 args[5] = -1; 739 return -1; 740} 741 742static bool 743default_check_object_attribute (Ebl *ebl __attribute__ ((unused)), 744 const char *vendor __attribute__ ((unused)), 745 int tag __attribute__ ((unused)), 746 uint64_t value __attribute__ ((unused)), 747 const char **tag_name, const char **value_name) 748{ 749 *tag_name = NULL; 750 *value_name = NULL; 751 return false; 752} 753 754static bool 755default_check_reloc_target_type (Ebl *ebl __attribute__ ((unused)), 756 Elf64_Word sh_type __attribute__ ((unused))) 757{ 758 return false; 759} 760 761static int 762default_abi_cfi (Ebl *ebl __attribute__ ((unused)), 763 Dwarf_CIE *abi_info __attribute__ ((unused))) 764{ 765 return -1; 766} 767