Squashed 'third_party/elfutils/' content from commit 555e15e

Change-Id: I61cde98949e47e5c8c09c33260de17f30921be79
git-subtree-dir: third_party/elfutils
git-subtree-split: 555e15ebe8bf1eb33d00747173cfc80cc65648a4
diff --git a/libebl/ChangeLog b/libebl/ChangeLog
new file mode 100644
index 0000000..3ecd732
--- /dev/null
+++ b/libebl/ChangeLog
@@ -0,0 +1,1123 @@
+2018-02-09  Joshua Watt  <JPEWhacker@gmail.com>
+
+	* eblobjnote.c (ebl_object_note): Use FALLTHROUGH macro instead of
+	comment.
+
+2017-04-27  Ulf Hermann  <ulf.hermann@qt.io>
+
+	* Makefile.am: Use fpic_CFLAGS.
+
+2017-07-19  Gustavo Romero <gromero@linux.vnet.ibm.com>
+
+	* eblcorenotetypename.c: Add ppc64 HTM SPRs note as known type.
+
+2017-07-20  Mark Wielaard  <mark@klomp.org>
+
+	* Makefile.am (gen_SOURCES): Add ebl_data_marker_symbol.c.
+	* ebl-hooks.h (data_marker_symbol): New hook.
+	* ebl_data_marker_symbol.c: New file.
+	* eblopenbackend.c (default_data_marker_symbol): New function.
+	(fill_defaults): Add default_data_marker_symbol.
+	* libebl.h (ebl_data_marker_symbol): New function.
+
+2017-04-20  Ulf Hermann  <ulf.hermann@qt.io>
+
+	* libebl.h: Use __pure_attribute__.
+
+2017-02-15  Ulf Hermann  <ulf.hermann@qt.io>
+
+	* eblmachineflagname.c: Include system.h.
+	* eblopenbackend.c: Likewise.
+
+2016-07-08  Mark Wielaard  <mjw@redhat.com>
+
+	* Makefile.am (gen_SOURCES): Remove eblstrtab.c.
+	* eblstrtab.c: Removed.
+	* libebl.h (Ebl_Strtab): Removed.
+	(Ebl_Strent): Removed.
+	(ebl_strtabinit): Removed.
+	(ebl_strtabfree): Removed.
+	(ebl_strtabadd): Removed.
+	(ebl_strtabfinalize): Removed.
+	(ebl_strtaboffset): Removed.
+	(ebl_string): Removed.
+
+2016-07-06  Mark Wielaard  <mjw@redhat.com>
+
+	* Makefile.am (gen_SOURCES): Remove eblobjecttypename.c,
+	eblshflagscombine.c, eblwstrtab.c and eblgstrtab.c.
+	* ebl-hooks.h (object_type_name): Removed.
+	(sh_flags_combine): Likewise.
+	* eblgstrtab.c: Removed.
+	* eblobjecttypename.c: Removed.
+	* eblopenbackend.c (default_object_type_name): Removed.
+	(default_sh_flags_combine): Likewise.
+	(fill_defaults): Removed object_type_name and sh_flags_combine.
+	* eblshflagscombine.c: Removed.
+	* eblwstrtab.c: Removed.
+	* libebl.h (ebl_object_type_name): Removed.
+	(ebl_sh_flags_combine): Likewise.
+	(ebl_wstrtab*): Removed.
+	(ebl_gstrtab*): Likewise.
+
+2016-06-28  Richard Henderson <rth@redhat.com>
+
+	* ebl-hooks.h (EBLHOOK(disasm)): Add ebl parameter.
+	* eblopenbackend.c (machines): Add EM_BPF entry.
+
+2016-05-20  Andreas Schwab  <schwab@linux-m68k.org>
+
+	* eblopenbackend.c (machines) [EM_68K]: Set class and data.
+
+2016-02-12  Mark Wielaard  <mjw@redhat.com>
+
+	* eblobjnotetypename.c (ebl_object_note_type_name): Check name is
+	"Go" and use new goknowntypes then. Otherwise check name is not
+	"GNU" and return "unknown".
+
+2016-01-09  Mark Wielaard  <mjw@redhat.com>
+
+	* eblobjnote.c (ebl_object_note): Add brackets around if statement
+	body.
+
+2015-12-18  Mark Wielaard  <mjw@redhat.com>
+
+	* eblopenbackend.c (default_debugscn_p): Also match .zdebug sections.
+
+2015-12-08  Jose E. Marchesi  <jose.marchesi@oracle.com>
+
+	* libebl.h: Prototype for ebl_ra_offset.
+	* eblabicfi.c (ebl_ra_offset): New function.
+	* libeblP.h (struct ebl): new field ra_offset;
+
+2015-09-24  Jose E. Marchesi  <jose.marchesi@oracle.com>
+
+	* Makefile.am (AM_CFLAGS): Use -fPIC instead of -fpic to avoid
+	relocation overflows in some platforms.
+
+2015-09-22  Mark Wielaard  <mjw@redhat.com>
+
+	* *.c: Remove old-style function definitions.
+
+2015-09-09  Chih-Hung Hsieh  <chh@google.com>
+
+	* ebldwarftoregno.c (ebl_dwarf_to_regno): Remove redundant NULL tests
+	on parameters declared with __nonnull_attribute__.
+	* eblinitreg.c (ebl_frame_nregs): Likewise.
+	* eblnormalizepc.c (ebl_normalize_pc): Likewise.
+	* eblunwind.c (ebl_unwind): Likewise.
+
+2015-09-04  Chih-Hung Hsieh  <chh@google.com>
+
+	* eblopenbackend.c (ebl_openbackend_machine): Replace K&R function
+	definition with ansi-C definitions.
+	* eblstother.c (ebl_check_st_other_bits): Likewise.
+
+2015-06-12  Mark Wielaard  <mjw@redhat.com>
+
+	* eblcheckreloctargettype.c (ebl_check_reloc_target_type): Allow
+	SHT_INIT_ARRAY, SHT_FINI_ARRAY and SHT_PREINIT_ARRAY.
+
+2015-05-17  Mark Wielaard  <mjw@redhat.com>
+
+	* eblobjnote.c (ebl_object_note): If allocation buf is large, then
+	allocate it with malloc.
+
+2015-05-17  Mark Wielaard  <mjw@redhat.com>
+
+	* eblopenbackend.c (MAX_PREFIX_LEN): New define (16).
+	(openbackend): Stack allocate symname array using MAX_PREFIX_LEN.
+
+2015-01-27  Mark Wielaard  <mjw@redhat.com>
+
+	* libebl.h: Add comment from README that this is completely
+	UNSUPPORTED.
+
+2014-11-22  Mark Wielaard  <mjw@redhat.com>
+
+	* ebl-hooks.h (bss_plt_p): Remove ehdr argument.
+	* eblbsspltp.c (ebl_bss_plt_p): Likewise.
+	* eblopenbackend.c (default_bss_plt_p): Likewise.
+	* libebl.h (ebl_bss_plt_p): Likewise.
+
+2014-11-17  Mark Wielaard  <mjw@redhat.com>
+
+	* ebldebugscnp.c (ebl_debugscn_p): Check name is not NULL.
+
+2014-06-17  Mark Wielaard  <mjw@redhat.com>
+
+	* eblinitreg.c (ebl_func_addr_mask): New function.
+	* libebl.h (ebl_func_addr_mask): Define.
+	* libeblP.h (struct ebl): Add func_addr_mask.
+
+2014-05-19  Mark Wielaard  <mjw@redhat.com>
+
+	* Makefile.am (gen_SOURCES): Add eblcheckreloctargettype.c.
+	* eblcheckreloctargettype.c: New file.
+	* ebl-hooks.h (check_reloc_target_type): New hook.
+	* eblopenbackend.c (default_check_reloc_target_type): New function.
+	(fill_defaults): Assign default_check_reloc_target_type to
+	check_reloc_target_type.
+	* libebl.h (ebl_check_reloc_target_type): New function definition.
+
+2013-12-18  Mark Wielaard  <mjw@redhat.com>
+
+	* Makefile.am (gen_SOURCES): Add eblresolvesym.c.
+	* ebl-hooks.h (resolve_sym_value): New entry.
+	* eblresolvesym.c: New file.
+	* libebl.h (ebl_resolve_sym_value): New definition.
+	* libeblP.h (fd_addr): New field.
+	(fd_data): Likewise.
+
+2013-12-18  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+	unwinder: s390 and s390x
+	* Makefile.am (gen_SOURCES): Add eblnormalizepc.c and eblunwind.c.
+	* ebl-hooks.h (normalize_pc, unwind): New.
+	* eblnormalizepc.c: New file.
+	* eblunwind.c: New file.
+	* libebl.h (Ebl_Register_Location): Add field pc_register.
+	(ebl_normalize_pc): New declaration.
+	(ebl_tid_registers_get_t, ebl_pid_memory_read_t): New definitions.
+	(ebl_unwind): New declaration.
+
+2013-12-15  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+	unwinder: ppc and ppc64
+	* Makefile.am (gen_SOURCES): Add ebldwarftoregno.c.
+	* ebl-hooks.h (dwarf_to_regno): New.
+	* ebldwarftoregno.c: New file.
+	* libebl.h (Ebl_Core_Item): New field pc_register.
+	(ebl_tid_registers_t): Add FIRSTREG -1 to the comment.
+	(ebl_dwarf_to_regno): New.
+
+2013-11-25  Petr Machata  <pmachata@redhat.com>
+
+	* eblopenbackend.c (machines): Add entry for AArch64.
+
+2013-11-14  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+	Code cleanup: Remove const in prototype
+	* libebl.h (ebl_tid_registers_t): Remove const from firstreg.
+
+2013-11-07  Jan Kratochvil  <jan.kratochvil@redhat.com>
+	    Mark Wielaard  <mjw@redhat.com>
+
+	* Makefile.am (gen_SOURCES): Add eblinitreg.c.
+	* ebl-hooks.h (set_initial_registers_tid): New entry.
+	* eblinitreg.c: New file.
+	* libebl.h (ebl_tid_registers_t): New definition.
+	(ebl_set_initial_registers_tid, ebl_frame_nregs): New declarations.
+	* libeblP.h (struct ebl): New entry frame_nregs.
+
+2013-10-06  Mark Wielaard  <mjw@redhat.com>
+
+	* libebl.h (ebl_abi_cfi): Document restrictions using register
+	rules.
+
+2013-09-26  Petr Machata  <pmachata@redhat.com>
+
+	* eblcorenotetypename.c: Handle NT_ARM_TLS, NT_ARM_HW_BREAK,
+	NT_ARM_HW_WATCH, NT_SIGINFO, NT_FILE.
+
+2013-09-25  Mark Wielaard  <mjw@redhat.com>
+
+	* eblsectionstripp.c (ebl_section_strip_p): Check shdr_l is not NULL.
+
+2013-04-24  Mark Wielaard  <mjw@redhat.com>
+
+	* Makefile.am: Use AM_CPPFLAGS instead of INCLUDES.
+
+2012-10-12  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+	* ebl-hooks.h (abi_cfi): Extend its comment for return value.
+	* eblopenbackend.c (default_abi_cfi): Return -1.
+	* libebl.h (ebl_abi_cfi): Extend its comment for return value.
+
+2012-08-30  Petr Machata  <pmachata@redhat.com>
+
+	* eblcorenotetypename.c: Handle PPC_VSX, X86_XSTATE,
+	S390_HIGH_GPRS, S390_TIMER, S390_TODCMP, S390_TODPREG, S390_CTRS,
+	S390_PREFIX, S390_LAST_BREAK, S390_SYSTEM_CALL, and ARM_VFP.
+
+2012-08-22  Jeff Kenton  <jkenton@tilera.com>
+
+	* eblopenbackend.c (machines): Add tilegx.
+
+2011-06-26  Mark Wielaard  <mjw@redhat.com>
+
+	* eblopenbackend.c (default_debugscn_p): Add .debug_macro.
+
+2011-04-26  Mark Wielaard  <mjw@redhat.com>
+
+	* libebl.h (ebl_object_note_type_name): Add const char *name arg.
+	* eblhooks.h (object_note_type_name): Likewise.
+	* eblopenbackend.c (default_object_note_type_name): Likewise.
+	* eblobjnotetypename.c (ebl_object_note_type_name): Likewise.
+	And print version if name is "stapsdt".
+	* eblobjnote.c (ebl_object_note): Add output for "stapsdt" notes.
+
+2011-03-21  Marek Polacek  <mpolacek@redhat.com>
+
+	* ebldynamictagname.c: Fix typo in TLSDESC_GOT.
+
+2011-03-10  Mark Wielaard  <mjw@redhat.com>
+
+	* Makefile.am (gen_SOURCES): Add eblstother.c.
+	* eblstother.c: New file.
+	* ebl-hooks.h: Add check_st_other_bits hook.
+	* eblopenbackend.c (default_check_st_other_bits): New function.
+	(fill_defaults): Hook default_check_st_other_bits.
+	* libebl.h (ebl_check_st_other_bits): New prototype.
+
+2010-07-07  Roland McGrath  <roland@redhat.com>
+
+	* eblopenbackend.c (default_debugscn_p): Match .gdb_index section.
+
+2010-02-15  Roland McGrath  <roland@redhat.com>
+
+	* Makefile.am: Use config/eu.am for common stuff.
+
+2010-01-04  Roland McGrath  <roland@redhat.com>
+
+	* eblcorenote.c (ebl_core_note): Take GElf_Nhdr * and name data
+	pointer instead of only n_type and n_descsz.
+	* libebl.h: Update declaration.
+	* ebl-hooks.h: Update core_note hook signature.
+	* eblopenbackend.c (default_core_note): Likewise.
+
+2009-10-14  Roland McGrath  <roland@redhat.com>
+
+	* eblobjnote.c (ebl_object_note): Clean up NT_GNU_GOLD_VERSION printing.
+
+2009-10-05  Roland McGrath  <roland@redhat.com>
+
+	* eblopenbackend.c (default_debugscn_p): Match .debug_pubtypes and
+	.debug_types too.
+
+2009-09-02  Petr Machata  <pmachata@redhat.com>
+
+	* libebl/eblstrtab.c (morememory): Allocate memory in multiples of
+	pagesize.
+
+2009-08-06  Petr Machata  <pmachata@redhat.com>
+
+	* libebl/eblstrtab.c (ebl_strtabfinalize): Only call copystrings
+	if we have any strings to copy.
+
+2009-07-26  Mark Wielaard  <mjw@redhat.com>
+
+	* eblobjnote.c (ebl_object_note): Handle NT_GNU_GOLD_VERSION.
+
+	* eblobjnotetypename.c (ebl_object_note_type_name): Recognize
+	NT_GNU_GOLD_VERSION.
+
+2009-07-08  Roland McGrath  <roland@redhat.com>
+
+	* ebl-hooks.h: Add abi_cfi hook.
+	* eblopenbackend.c (default_abi_cfi): New function.
+	(fill_defaults): Add initializer.
+	* eblabicfi.c: New file.
+	* Makefile.am (gen_SOURCES): Add it.
+	* libebl.h: Declare ebl_abi_cfi.
+
+2009-07-08  Ulrich Drepper  <drepper@redhat.com>
+
+	* eblsymbolbindingname.c (ebl_symbol_binding_name): Handle
+	STB_GNU_UNIQUE.
+
+	* eblsymboltypename.c (ebl_symbol_type_name): Only handle STT_GNU_IFUNC
+	if the binary is marked as being for Linux.
+
+2009-04-01  Roland McGrath  <roland@redhat.com>
+
+	* eblsymboltypename.c (ebl_symbol_type_name): Add STT_GNU_IFUNC.
+
+	* eblauxvinfo.c (AUXV_TYPES): Add RANDOM and BASE_PLATFORM.
+
+2009-02-01  Ulrich Drepper  <drepper@redhat.com>
+
+	* eblreloctypename.c (ebl_reloc_type_name): Return "<INVALID RELOC>"
+	instead of "???" for invalid relocations.
+
+2008-08-01  Roland McGrath  <roland@redhat.com>
+
+	* eblcorenotetypename.c: Handle NT_386_IOPERM.
+
+2008-07-28  Roland McGrath  <roland@redhat.com>
+
+	* eblauxvinfo.c (AUXV_TYPES): Add EXECFN.
+
+	* eblauxvinfo.c (ebl_auxv_info): Handle missing elements of standard
+	table.
+
+2008-07-04  Roland McGrath  <roland@redhat.com>
+
+	* libebl.h: Declare ebl_syscall_abi.
+	* ebl_syscall_abi.c: New file.
+	* Makefile.am (gen_SOURCES): Add it.
+	* ebl-hooks.h: New hook syscall_abi.
+	* eblopenbackend.c (default_syscall_abi): New function.
+	(fill_defaults): Use it.
+
+2008-03-31  Roland McGrath  <roland@redhat.com>
+
+	* ebldynamictagname.c (ebl_dynamic_tag_name): Use hex for unknown tag.
+
+	* ebl-hooks.h: Add check_special_section hook.
+	* eblopenbackend.c (fill_defaults): Set new hook to ...
+	(default_check_special_section): ... this, new function.
+	* ebl_check_special_section.c: New file.
+	* Makefile.am (gen_SOURCES): Add it.
+	* libebl.h: Declare it.
+
+2008-02-20  Roland McGrath  <roland@redhat.com>
+
+	* libebl.h: Declare ebl_check_object_attribute.
+	* eblcheckobjattr.c: New file.
+	* Makefile.am (gen_SOURCES): Add it.
+	* ebl-hooks.h: Add check_object_attribute hook.
+	* eblopenbackend.c (default_check_object_attribute): New function.
+	(fill_defaults): Initialize pointer to it.
+
+2008-02-19  Roland McGrath  <roland@redhat.com>
+
+	* eblsectiontypename.c (ebl_section_type_name):
+	Handle SHT_GNU_ATTRIBUTES.
+
+2008-02-08  Roland McGrath  <roland@redhat.com>
+
+	* eblcorenotetypename.c (ebl_core_note_type_name): Handle NT_PPC_SPE.
+
+2008-01-30  Roland McGrath  <roland@redhat.com>
+
+	* eblcorenotetypename.c (ebl_core_note_type_name): Handle NT_386_TLS.
+
+2007-10-18  Roland McGrath  <roland@redhat.com>
+
+	* eblcorenotetypename.c (ebl_core_note_type_name): Handle NT_PPC_VMX.
+
+2007-10-11  Roland McGrath  <roland@redhat.com>
+
+	* eblobjnote.c (ebl_object_note): Translate target format (byte-swap)
+	for NT_GNU_ABI_TAG contents.
+
+2007-08-22  Roland McGrath  <roland@redhat.com>
+
+	* libebl.h (Ebl_Core_Item): New member `group'.
+
+2007-08-19  Roland McGrath  <roland@redhat.com>
+
+	* ebl-hooks.h: Add new hook auxv_info.
+	* eblopenbackend.c (default_auxv_info): New function.
+	(fill_defaults): Initialize auxv_info hook.
+	* eblauxvinfo.c : New file.
+	* Makefile.am (gen_SOURCES): Add it.
+	* libebl.h: Declare ebl_auxv_info.
+
+	* eblcorenote.c: Rewritten with new signature.
+	* Makefile.am (gen_SOURCES): Add it.
+	* libebl.h (Ebl_Register_Location, Ebl_Core_Item): New types.
+	(ebl_core_note_info): Completely revamp signature.
+	* ebl-hooks.h: Update decl.
+	* eblopenbackend.c (default_core_note): Update signature.
+
+2007-07-09  Roland McGrath  <roland@redhat.com>
+
+	* eblobjnotetypename.c (ebl_object_note_type_name): Handle
+	NT_GNU_HWCAP, NT_GNU_BUILD_ID.
+
+	* eblobjnote.c (ebl_object_note): Handle NT_GNU_BUILD_ID.
+
+2007-04-22  Roland McGrath  <roland@redhat.com>
+
+	* eblcorenotetypename.c (ebl_core_note_type_name): Handle NT_PRXFPREG.
+
+2007-03-10  Roland McGrath  <roland@redhat.com>
+
+	* eblcorenote.c (ebl_core_note): For normally-zero types,
+	print in hex if not zero.
+
+2007-01-11  Roland McGrath  <roland@redhat.com>
+
+	* ebl-hooks.h (machine_section_flag_check): New hook.
+	* libebl.h: Declare ebl_machine_section_flag_check.
+	* eblmachinesectionflagcheck.c: New file.
+	* Makefile.am (gen_SOURCES): Add it.
+	* eblopenbackend.c (default_machine_section_flag_check): New function.
+	(fill_defaults): Use it.
+
+2006-09-04  Roland McGrath  <roland@redhat.com>
+
+	* ebl-hooks.h: Replace register_name hook with register_info.
+	Also yield natural bit width and base type encoding.
+	* eblopenbackend.c (default_register_name): Renamed
+	default_register_info, new args added.
+	(fill_defaults): Update initialization.
+	* eblregname.c: File renamed ...
+	* eblreginfo.c: ... to this.
+	(ebl_register_name): Renamed to ebl_register_info, new args added.
+	* libebl.h: Update decl.
+
+	* Makefile.am (gen_SOURCES): Update list.
+
+2006-07-06  Ulrich Drepper  <drepper@redhat.com>
+
+	* ebldynamictagname.c: Add support for DT_GNU_HASH.
+	* ebldynamictagcheck.c: Likewise.
+	* eblsectiontypename.c: Add support for SHT_GNU_HASH.
+
+2006-07-05  Ulrich Drepper  <drepper@redhat.com>
+
+	* Makefile.am (gen_SOURCES): Add eblsysvhashentrysize.c.
+	* libeblP.h (struct ebl): Add sysvhash_entrysize element.
+	* eblopenbackend.c (fill_defaults): Initialize sysvhash_entrysize.
+
+	* eblopenbackend.c (openbackend): If possible, fill machine, class,
+	and data values in from the ELF file.
+
+2006-07-04  Ulrich Drepper  <drepper@redhat.com>
+
+	* Makefile.am (gen_SOURCES): Add eblrelativerelocp.c.
+	* eblrelativerelocp.c: New file.
+	* ebl-hooks.c: Add relative_reloc_p.
+	* eblopenbackend.c (default_relative_reloc_p): New function.
+	(fill_defaults): Hook it up.
+	* libebl.h: Declare ebl_relative_reloc_p.
+
+2006-06-12  Ulrich Drepper  <drepper@redhat.com>
+
+	* Makefile.am (gen_SOURCES): Add eblnonerelocp.c.
+	* eblnonerelocp.c: New file.
+	* ebl-hooks.c: Add none_reloc_p.
+	* eblopenbackend.c (default_none_reloc_p): New function.
+	(fill_defaults): Hook it up.
+	* libebl.h: Declare ebl_none_reloc_p.
+
+2006-05-27  Ulrich Drepper  <drepper@redhat.com>
+
+	* libebl.h: Add extern "C".
+
+2005-11-25  Roland McGrath  <roland@redhat.com>
+
+	* eblregname.c: New file.
+	* Makefile.am (gen_SOURCES): Add it.
+	* ebl-hooks.h: Declare register_name hook.
+	* libebl.h: Declare ebl_register_name.
+	* eblopenbackend.c (default_register_name): New function.
+	(fill_defaults): Use it.
+
+2005-11-16  Roland McGrath  <roland@redhat.com>
+
+	* libebl.h: Use "" for elf-knowledge.h, not <>.
+
+2005-11-15  Roland McGrath  <roland@redhat.com>
+
+	* Makefile.am: Removed everything for building libebl_*.so modules,
+	now in ../backends/Makefile.am instead.
+	* alpha_init.c: Moved to ../backends.
+	* alpha_reloc.def: Likewise.
+	* alpha_retval.c: Likewise.
+	* alpha_symbol.c: Likewise.
+	* arm_init.c: Likewise.
+	* arm_reloc.def: Likewise.
+	* arm_symbol.c: Likewise.
+	* common-reloc.c: Likewise.
+	* i386_corenote.c: Likewise.
+	* i386_init.c: Likewise.
+	* i386_reloc.def: Likewise.
+	* i386_retval.c: Likewise.
+	* i386_symbol.c: Likewise.
+	* ia64_init.c: Likewise.
+	* ia64_reloc.def: Likewise.
+	* ia64_symbol.c: Likewise.
+	* libebl_CPU.h: Likewise.
+	* ppc64_init.c: Likewise.
+	* ppc64_reloc.def: Likewise.
+	* ppc64_retval.c: Likewise.
+	* ppc64_symbol.c: Likewise.
+	* ppc_init.c: Likewise.
+	* ppc_reloc.def: Likewise.
+	* ppc_retval.c: Likewise.
+	* ppc_symbol.c: Likewise.
+	* s390_init.c: Likewise.
+	* s390_reloc.def: Likewise.
+	* s390_symbol.c: Likewise.
+	* sh_init.c: Likewise.
+	* sh_reloc.def: Likewise.
+	* sh_symbol.c: Likewise.
+	* sparc_init.c: Likewise.
+	* sparc_reloc.def: Likewise.
+	* sparc_symbol.c: Likewise.
+	* x86_64_corenote.c: Likewise.
+	* x86_64_init.c: Likewise.
+	* x86_64_reloc.def: Likewise.
+	* x86_64_retval.c: Likewise.
+	* x86_64_symbol.c: Likewise.
+
+	* libebl.h: Comment fixes.
+
+	* alpha_retval.c: New file.
+	* Makefile.am (alpha_SRCS): Add it.
+	* alpha_init.c (alpha_init): Initialize return_value_location hook.
+
+	* ppc64_retval.c: New file.
+	* Makefile.am (ppc64_SRCS): Add it.
+	* ppc64_init.c (ppc64_init): Initialize return_value_location hook.
+
+	* ppc_retval.c: New file.
+	* Makefile.am (ppc_SRCS): Add it.
+	* ppc_init.c (ppc_init): Initialize return_value_location hook.
+
+2005-11-14  Roland McGrath  <roland@redhat.com>
+
+	* ia64_init.c (ia64_init): Initialize EH->reloc_simple_type.
+	* sh_init.c (sh_init): Likewise.
+	* x86_64_init.c (x86_64_init): Likewise.
+
+	* sparc_symbol.c (sparc_reloc_simple_type): New function.
+	* sparc_init.c (sparc_init): Use it.
+
+	* arm_symbol.c (arm_reloc_simple_type): New function.
+	* arm_init.c (arm_init): Use it.
+
+	* alpha_symbol.c (alpha_reloc_simple_type): New function.
+	* alpha_init.c (alpha_init): Use it.
+
+	* ia64_reloc.def: Update bits per H. J. Lu <hjl@lucon.org>.
+
+	* arm_reloc.def: Update bits per Daniel Jacobowitz <drow@false.org>.
+
+	* alpha_reloc.def: Update bits per Richard Henderson <rth@redhat.com>.
+
+2005-11-13  Roland McGrath  <roland@redhat.com>
+
+	* x86_64_retval.c: New file.
+	* Makefile.am (x86_64_SRCS): Add it.
+	* x86_64_init.c (x86_64_init): Use x86_64_return_value_location.
+
+	* i386_retval.c: New file.
+	* Makefile.am (i386_SRCS): Add it.
+	(libdw): New variable.
+	(libebl_%.so): Use $(libdw) in link; use --as-needed.
+	* i386_init.c (i386_init): Use i386_return_value_location.
+
+	* eblretval.c: New file.
+	* Makefile.am (gen_SOURCES): Add it.
+	(INCLUDES): Search in libdw.
+	* libebl.h: Include <libdw.h>.   Declare ebl_return_value_location.
+	* ebl-hooks.h: Declare return_value_location hook.
+	* eblopenbackend.c (default_return_value_location): New function.
+	(fill_defaults): Use it.
+
+2005-11-10  Roland McGrath  <roland@redhat.com>
+
+	* s390_init.c: New file.
+	* s390_reloc.def: New file.
+	* s390_symbol.c: New file.
+	* Makefile.am (modules, libebl_pic): Add s390.
+	(s390_SRCS, libebl_s390_pic_a_SOURCES): New variables.
+	(am_libebl_s390_pic_a_OBJECTS): New variable.
+
+	* ppc64_init.c: Use common-reloc.c.
+	* ppc64_symbol.c (ppc64_backend_name): Removed.
+	(ppc64_reloc_type_check, ppc64_reloc_type_name): Likewise.
+	(ppc64_copy_reloc_p, ppc64_reloc_valid_use): Likewise.
+
+	* ppc_init.c: Use common-reloc.c.
+	* ppc_symbol.c (ppc_backend_name): Removed.
+	(ppc_reloc_type_name, ppc_reloc_type_check): Likewise.
+	(ppc_reloc_valid_use, ppc_copy_reloc_p): Likewise.
+
+	* sparc_init.c: Use common-reloc.c.
+	* sparc_symbol.c (sparc_backend_name): Removed.
+	(sparc_reloc_type_name, sparc_reloc_type_check): Likewise.
+	(sparc_copy_reloc_p): Likewise.
+
+	* arm_init.c: Use common-reloc.c.
+	* arm_symbol.c (arm_backend_name): Removed.
+	(arm_reloc_type_name, arm_reloc_type_check, arm_copy_reloc_p): Removed.
+
+	* alpha_init.c: Use common-reloc.c.
+	* alpha_symbol.c (alpha_backend_name): Removed.
+	(alpha_reloc_type_name, alpha_reloc_type_check): Likewise.
+	(alpha_copy_reloc_p): Likewise.
+
+	* ia64_symbol.c (ia64_backend_name): Removed.
+	(ia64_reloc_type_name, ia64_reloc_type_check): Likewise.
+	(ia64_copy_reloc_p): Likewise.
+
+	* x86_64_init.c: Use common-reloc.c.
+	* x86_64_symbol.c (x86_64_backend_name): Removed.
+	(x86_64_copy_reloc_p, x86_64_reloc_valid_use): Likewise.
+	(x86_64_reloc_type_check, x86_64_reloc_type_name): Likewise.
+
+	* sh_init.c: Use common-reloc.c.
+	* sh_symbol.c: All functions removed.
+	(sh_reloc_simple_type): New function.
+	(sh_gotpc_reloc_check): New function.
+
+	* common-reloc.c: New file.
+	* Makefile.am (noinst_HEADERS): Add it.
+	* i386_init.c: Include it.
+
+	* sh_reloc.def: New file.
+	* i386_reloc.def: New file.
+	* alpha_reloc.def: New file.
+	* arm_reloc.def: New file.
+	* i386_reloc.def: New file.
+	* ia64_reloc.def: New file.
+	* ppc64_reloc.def: New file.
+	* ppc_reloc.def: New file.
+	* sh_reloc.def: New file.
+	* sparc_reloc.def: New file.
+	* x86_64_reloc.def: New file.
+	* Makefile.am (EXTRA_DIST): Add $(modules:=_reloc.def).
+
+	* libebl_alpha.map: Removed.
+	* libebl_ia64.map: Removed.
+	* libebl_ppc.map: Removed.
+	* libebl_sparc.map: Removed.
+	* libebl_arm.map: Removed.
+	* libebl_i386.map: Removed.
+	* libebl_ppc64.map: Removed.
+	* libebl_sh.map: Removed.
+	* libebl_x86_64.map: Removed.
+	* Makefile.am (EXTRA_DIST): Remove them.
+	(libebl_%.map, libebl_%.so): New pattern rules.
+
+	* libebl_alpha.h: Removed.
+	* libebl_ia64.h: Removed.
+	* libebl_ppc.h: Removed.
+	* libebl_sparc.h: Removed.
+	* libebl_arm.h: Removed.
+	* libebl_i386.h: Removed.
+	* libebl_ppc64.h: Removed.
+	* libebl_sh.h: Removed.
+	* libebl_x86_64.h: Removed.
+	* Makefile.am (noinst_HEADERS): Remove them.
+
+	* x86_64_corenote.c: Use libebl_CPU.h instead.
+	* x86_64_symbol.c: Likewise.
+	* i386_corenote.c: Likewise.
+
+2005-11-09  Roland McGrath  <roland@redhat.com>
+
+	* ia64_symbol.c (ia64_reloc_simple_type): New function.
+
+	* ebl-hooks.h (reloc_simple_type): Take the Ebl handle, not Elf handle.
+	* eblrelocsimpletype.c (ebl_reloc_simple_type): Update caller.
+	* eblopenbackend.c (default_reloc_simple_type): Update signature.
+	* i386_symbol.c (i386_reloc_simple_type): Likewise.
+	* ppc64_symbol.c (ppc64_reloc_simple_type): Likewise.
+	* ppc_symbol.c (ppc_reloc_simple_type): Likewise.
+	* x86_64_symbol.c (x86_64_reloc_simple_type): Likewise.
+
+	* i386_symbol.c (i386_backend_name): Removed.
+	(i386_reloc_type_name, i386_reloc_type_check): Likewise.
+	(i386_reloc_valid_use): Removed.
+	(i386_copy_reloc_p): Removed.
+
+	* alpha_destr.c: Removed.
+	* arm_destr.c: Removed.
+	* i386_destr.c: Removed.
+	* ia64_destr.c: Removed.
+	* ppc64_destr.c: Removed.
+	* ppc_destr.c: Removed.
+	* sh_destr.c: Removed.
+	* sparc_destr.c: Removed.
+	* x86_64_destr.c: Removed.
+
+	* ebl-hooks.h: New file, broken out of ...
+	* libeblP.h (struct ebl): ... here.  #include that for hook
+	declarations, after defining EBLHOOK macro.
+	* libebl_CPU.h: New file.
+	* Makefile.am (noinst_HEADERS): Add them.
+
+	* libeblP.h (struct ebl): Use uint_fast16_t for machine,
+	and uint_fast8_t for class and data.
+
+2005-08-14  Roland McGrath  <roland@redhat.com>
+
+	* ia64_symbol.c (ia64_section_type_name): New function.
+	(ia64_dynamic_tag_check): New function.
+	(ia64_reloc_valid_use): New function.
+	* libebl_ia64.h: Declare them.
+	* ia64_init.c (ia64_init): Use them.
+	* Makefile.am (libebl_ia64.so): Link with libelf.
+
+2005-08-28  Ulrich Drepper  <drepper@redhat.com>
+
+	* Makefile.am: Use $(LINK) not $(CC) when creating DSOs.
+
+2005-08-13  Roland McGrath  <roland@redhat.com>
+
+	* ia64_symbol.c (ia64_machine_flag_check): New function.
+	* libebl_ia64.h: Declare it.
+	* ia64_init.c (ia64_init): Use it.
+
+2005-08-13  Ulrich Drepper  <drepper@redhat.com>
+
+	* libebl.h: Add ehdr parameter to ebl_bss_plt_p and
+	ebl_check_special_symbol.
+	* libeblP.h (struct ebl): Adjust callback functions.
+	* eblopenbackend.c: Adjust dummy functions.
+	* ebl_check_special_symbol.c: Add parameter and pass it on.
+	* eblbsspltp.c: Likewise.
+	* ppc_symbol.c (find_dyn_got): With ehdr passed, simplify search for
+	the dynamic section entry.
+	(ppc_check_special_symbol): Add ehdr parameter.
+	(ppc_bss_plt_p): Likewise.
+	* libebl_ppc.h: Adjust prototypes.
+	* ppc64_symbol.c (ppc_check_special_symbol): Add ehdr parameter.
+	(ppc_bss_plt_p): Likewise.
+	* libebl_ppc64.h: Adjust prototypes.
+
+2005-08-12  Roland McGrath  <roland@redhat.com>
+
+	* ppc_symbol.c (find_dyn_got): New function, broken out of ...
+	(ppc_bss_plt_p): ... here.  Call that.
+	(ppc_check_special_symbol): Use find_dyn_got to fetch value to check
+	against _GLOBAL_OFFSET_TABLE_.
+
+	* libeblP.h (struct ebl): Add bss_plt_p hook.
+	* eblopenbackend.c (default_bss_plt_p): New function.
+	(fill_defaults): Use it.
+	* eblbsspltp.c: New file.
+	* Makefile.am (gen_SOURCES): Add it.
+	* libebl.h: Declare ebl_bss_plt_p.
+	* ppc_symbol.c (ppc_bss_plt_p): New function.
+	* libebl_ppc.h: Declare it.
+	* ppc_init.c (ppc_init): Use it.
+	* ppc64_symbol.c (ppc64_bss_plt_p): New function.
+	* libebl_ppc64.h: Declare it.
+	* ppc64_init.c (ppc64_init): Use it.
+
+	* ebl_check_special_symbol.c: New file.
+	* Makefile.am (gen_SOURCES): Add it.
+	* libebl.h: Declare ebl_check_special_symbol.
+	* libeblP.h (struct ebl): Add check_special_symbol hook.
+	* eblopenbackend.c (default_check_special_symbol): New function.
+	(fill_defaults): Use it.
+	* ppc_symbol.c (ppc_check_special_symbol): New function.
+	* libebl_ppc.h: Add prototype.
+	* ppc_init.c (ppc_init): Use it.
+	* ppc64_symbol.c (ppc64_check_special_symbol): New function.
+	* libebl_ppc64.h: Add prototype.
+	* ppc64_init.c (ppc64_init): Use it.
+
+2005-08-07  Ulrich Drepper  <drepper@redhat.com>
+
+	* ppc_init.c: Add support for new DT_PPC_* and R_PPC_* values.
+	* ppc_symbol.c: Likewise.
+	* libebl_ppc.h: Likewise.
+	* ppc64_init.c: There is now also a dynamic_tag_check functions
+	* ppc64_symbol.c: Add dynamic_tag_check.
+	* libebl_ppc64.h: Add prototype.
+	* alpha_init.c: Add support for new DT_ALPHA_* value.
+	* alpha_symbol.c: Likewise.
+	* libebl_alpha.h: Likewise.
+
+2005-08-03  Ulrich Drepper  <drepper@redhat.com>
+
+	* libebl_alpha.map: Remove unnecessary exports.
+	* libebl_arm.map: Likewise.
+	* libebl_i386.map: Likewise.
+	* libebl_ia64.map: Likewise.
+	* libebl_ppc.map: Likewise.
+	* libebl_ppc64.map: Likewise.
+	* libebl_sh.map: Likewise.
+	* libebl_sparc.map: Likewise.
+	* libebl_x86_64.map: Likewise.
+
+2005-08-02  Ulrich Drepper  <drepper@redhat.com>
+
+	* Makefile.am (libebl_a_SOURCES): Add eblelfclass.c, eblelfdata.c,
+	and eblelfmachine.c.
+	* elbopenbackend.c (machines): Add class and data fields.  Initialize
+	them.
+	(ebl_openbackend): Initialize machine, class, data fields in result.
+	* libebl.h: Declare Add eblelfclass, eblelfdata, and eblelfmachine.
+	* libeblP.h (Ebl): Add machine, class, data fields.
+
+2005-07-23  Ulrich Drepper  <drepper@redhat.com>
+
+	* eblsectionstripp.c: New file.
+	* Makefile.am (gen_SOURCES): Add eblsectionstripp.c.
+	* i386_init.c (i386_init): Install specific debugscn_p callback.
+	* i386_symbol.c (i386_debugscn_p): New function.
+	* libebl.h: Declare ebl_section_strip_p.
+	* libebl_i386.h: Declare i386_debugscn_p.
+
+	* libebl.h: Move Ebl definition to...
+	* libeblP.h: ...here.
+
+2005-07-21  Roland McGrath  <roland@redhat.com>
+
+	* Makefile.am (install-ebl-modules): New target, commands from ...
+	(install): ... here.  Make this depend on it.
+	(LIBEBL_SUBDIR): New variable, substituted by configure.
+	(install-ebl-modules): Install in $(libdir)/$(LIBEBL_SUBDIR).
+	* eblopenbackend.c (openbackend): Use LIBEBL_SUBDIR in module name.
+
+2005-07-21  Ulrich Drepper  <drepper@redhat.com>
+
+	* eblcopyrelocp.c: New file.
+	* Makefile.am (gen_SOURCES): Add eblcopyrelocp.c.
+	* libebl.h: Declare ebl_copy_reloc_p.
+	* eblopenbackend.c (fill_defaults): Fill in copy_reloc_p.
+	(default_copy_reloc_p): New function.
+	* alpha_init.c: Define and use arch-specific copy_reloc_p function.
+	* alpha_symbol.c: Likewise.
+	* arm_init.c: Likewise.
+	* arm_symbol.c: Likewise.
+	* i386_init.c: Likewise.
+	* i386_symbol.c: Likewise.
+	* ia64_init.c: Likewise.
+	* ia64_symbol.c: Likewise.
+	* ppc64_init.c: Likewise.
+	* ppc64_symbol.c: Likewise.
+	* ppc_init.c: Likewise.
+	* ppc_symbol.c: Likewise.
+	* sh_init.c: Likewise.
+	* sh_symbol.c: Likewise.
+	* sparc_init.c: Likewise.
+	* sparc_symbol.c: Likewise.
+	* x86_64_init.c: Likewise.
+	* x86_64_symbol.c: Likewise.
+	* libebl_alpha.h: Declare the copy_reloc_p function.
+	* libebl_arm.h: Likewise.
+	* libebl_i386.h: Likewise.
+	* libebl_ia64.h: Likewise.
+	* libebl_ppc.h: Likewise.
+	* libebl_ppc64.h: Likewise.
+	* libebl_sh.h: Likewise.
+	* libebl_sparc.h: Likewise.
+	* libebl_x86_64.h: Likewise.
+
+2005-05-31  Roland McGrath  <roland@redhat.com>
+
+	* Makefile.am (libebl_*_so_SOURCES): Set to $(*_SRCS) so dependency
+	tracking works right.
+
+2005-05-21  Ulrich Drepper  <drepper@redhat.com>
+
+	* libebl_x86_64.map: Add x86_64_core_note.
+
+2005-05-19  Roland McGrath  <roland@redhat.com>
+
+	* libebl_i386.map: Add i386_reloc_valid_use, i386_reloc_simple_type.
+	* libebl_ppc.map: Add ppc_reloc_simple_type.
+	* libebl_ppc64.map: Add ppc64_reloc_simple_type.
+	* libebl_x86_64.map: Add x86_64_reloc_simple_type.
+
+2005-05-11  Ulrich Drepper  <drepper@redhat.com>
+
+	* eblcorenote.c: Handle new AT_* values and files with different
+	endianess.
+	* Makefile.am (x86_64_SRCS): Add x86_64_corenote.c.
+	* x86-64_corenote.c: New file.
+	* x86_64_init.c: Hook in x86_64_corenote.
+	* i386_corenote.c: Make file usable on 64-bit platforms.
+
+	* eblopenbackend.c: If modules version comparison fails, reinitialize
+	hooks.
+
+2005-05-10  Ulrich Drepper  <drepper@redhat.com>
+
+	* eblopenbackend.c: Require the init function to return a string.
+	Compare it with MODVERSION from config.h.
+	* alpha_init.c: Change return type.  Return MODVERSION or NULL.
+	* arm_init.c: Likewise.
+	* eblopenbackend.c: Likewise.
+	* i386_init.c: Likewise.
+	* ia64_init.c: Likewise.
+	* ppc64_init.c: Likewise.
+	* ppc_init.c: Likewise.
+	* sh_init.c: Likewise.
+	* sparc_init.c: Likewise.
+	* x86_64_init.c: Likewise.
+	* libeblP.h: Adjust ebl_bhinit_t.
+	* libebl_alpha.h: Adjust init function prototype.
+	* libebl_arm.h: Likewise.
+	* libebl_i386.h: Likewise.
+	* libebl_ia64.h: Likewise.
+	* libebl_ppc.h: Likewise.
+	* libebl_ppc64.h: Likewise.
+	* libebl_sh.h: Likewise.
+	* libebl_sparc.h: Likewise.
+	* libebl_x86_64.h: Likewise.
+
+	* mips_destr.c: Removed.
+	* mips_init.c: Removed.
+	* mips_symbol.c: Removed.
+	* libebl_mips.h: Removed.
+	* libebl_mips.map: Removed.
+
+2005-05-03  Roland McGrath  <roland@redhat.com>
+
+	* libebl.h (Ebl): Add `reloc_simple_type' member.
+	* eblopenbackend.c (default_reloc_simple_type): New function.
+	(openbackend): Use that as default reloc_simple_type callback.
+	* eblrelocsimpletype.c: New file.
+	* Makefile.am (gen_SOURCES): Add it.
+	* i386_symbol.c (i386_reloc_simple_type): New function.
+	* libebl_i386.h: Declare it.
+	* i386_init.c (i386_init): Use it.
+	* x86_64_symbol.c (x86_64_reloc_simple_type): New function.
+	* libebl_x86_64.h: Declare it.
+	* x86_64_init.c (x86_64_init): Use it.
+	* ppc_symbol.c (ppc_reloc_simple_type): New function.
+	* libebl_ppc.h: Declare it.
+	* ppc_init.c (ppc_init): Use it.
+	* ppc64_symbol.c (ppc64_reloc_simple_type): New function.
+	* libebl_ppc64.h: Declare it.
+	* ppc64_init.c (ppc64_init): Use it.
+
+2005-03-17  Ulrich Drepper  <drepper@redhat.com>
+
+	* eblcorenote.c (ebl_core_note): Add support for AT_SECURE.
+
+2005-02-15  Ulrich Drepper  <drepper@redhat.com>
+
+	* Makefile.am (AM_CFLAGS): Add -Wformat=2.
+
+2005-02-14  Ulrich Drepper  <drepper@redhat.com>
+
+	* alpha_destr.c: Add __attribute__((unused)) where needed.
+	* alpha_init.c: Likewise.
+	* alpha_symbol.c: Likewise.
+	* arm_destr.c: Likewise.
+	* arm_init.c: Likewise.
+	* arm_symbol.c: Likewise.
+	* i386_corenote.c: Likewise.
+	* i386_destr.c: Likewise.
+	* i386_init.c: Likewise.
+	* i386_symbol.c: Likewise.
+	* ia64_destr.c: Likewise.
+	* ia64_init.c: Likewise.
+	* ia64_symbol.c: Likewise.
+	* mips_destr.c: Likewise.
+	* mips_init.c: Likewise.
+	* mips_symbol.c: Likewise.
+	* ppc64_destr.c: Likewise.
+	* ppc64_init.c: Likewise.
+	* ppc64_symbol.c: Likewise.
+	* ppc_destr.c: Likewise.
+	* ppc_init.c: Likewise.
+	* ppc_symbol.c: Likewise.
+	* sh_destr.c: Likewise.
+	* sh_init.c: Likewise.
+	* sh_symbol.c: Likewise.
+	* sparc_destr.c: Likewise.
+	* sparc_init.c: Likewise.
+	* sparc_symbol.c: Likewise.
+	* x86_64_destr.c: Likewise.
+	* x86_64_init.c: Likewise.
+	* x86_64_symbol.c: Likewise.
+
+	* x86_64_symbol.c (reloc_map_table): Fix entries for R_X86_64_64
+	and R_X86_64_32..
+
+2005-02-06  Ulrich Drepper  <drepper@redhat.com>
+
+	* eblstrtab.c: A few cleanups.
+
+	* eblopenbackend.c: Mark unused parameters.
+
+	* eblgstrtab.c: Cleanups a few printf format strings.
+
+	* Makefile.am: Cleanup AM_CFLAGS handling.  Add -Wunused -Wextra.
+
+2005-02-05  Ulrich Drepper  <drepper@redhat.com>
+
+	* Makefile.am: Check for text relocations in constructed DSOs.
+
+	* eblstrtab.c: Minor cleanups.
+
+	* Makefile.am (AM_CFLAGS): Add -std=gnu99 and -fmudflap for MUDFLAP.
+
+2004-08-16  Ulrich Drepper  <drepper@redhat.com>
+
+	* Makefile.am (AM_CFLAGS): Add LIBSTR definition with base name of
+	the lib directory.
+	* eblopenbackend.c (openbackend): Use LIBSTR instead of hardcoded
+	lib in path to ebl modules.
+
+2004-04-01  Ulrich Drepper  <drepper@redhat.com>
+
+	* Makefile.am: Add rules for ppc and ppc64 ebl module.
+	* ppc_init..c: New file.
+	* ppc_destr.c: New file.
+	* ppc_symbol.c: New file.
+	* libebl_ppc.h: New file.
+	* libebl_ppc.map: New file.
+	* ppc64_init..c: New file.
+	* ppc64_destr.c: New file.
+	* ppc64_symbol.c: New file.
+	* libebl_ppc64.h: New file.
+	* libebl_ppc64.map: New file.
+
+2004-01-20  Ulrich Drepper  <drepper@redhat.com>
+
+	* Makefile.am: Support building with mudflap.
+
+2004-01-18  Ulrich Drepper  <drepper@redhat.com>
+
+	* libeblP.h (_): Use elfutils domain.
+
+2004-01-16  Ulrich Drepper  <drepper@redhat.com>
+
+	* eblsectionname.c: Add support for SHN_BEFORE and SHN_AFTER.
+
+2004-01-13  Ulrich Drepper  <drepper@redhat.com>
+
+	* eblsegmenttypename.c ((ebl_segment_type_name): Add support for
+	PT_GNU_RELRO.
+
+2004-01-08  Ulrich Drepper  <drepper@redhat.com>
+
+	* libebl.h: Remove last traces of libtool.
+
+2004-01-05  Ulrich Drepper  <drepper@redhat.com>
+
+	* elf-knowledge.h: Move to libelf subdir.
+
+	* Makefile.am (EXTRA_DIST): Remove libebl.map.
+	* libebl.map: Removed.
+
+2003-12-08  Ulrich Drepper  <drepper@redhat.com>
+
+	* eblsectiontypename.c (ebl_section_type_name): Add support for
+	SHT_SUNW_move, SHT_CHECKSUM, and SHT_GNU_LIBLIST.
+
+2003-11-19  Ulrich Drepper  <drepper@redhat.com>
+
+	* ia64_symbol.c (ia64_dynamic_tag_name): New function.
+	* libebl_ia64.h (ia64_dynamic_tag_name): Declare.
+	* ia64_init.c (ia64_init): Register i164_dynamic_tag_name.
+
+2003-09-24  Ulrich Drepper  <drepper@redhat.com>
+
+	* ia64_init.c (ia64_init): Initialize segment_type_name callback.
+	* ia64_symbol.c (ia64_segment_type_name): Define.
+	* libebl_ia64.h (ia64_segment_type_name): Declare.
+
+2003-09-22  Ulrich Drepper  <drepper@redhat.com>
+
+	* Makefile.am (AM_CFLAGS): Add -fpic.
+
+2003-08-14  Ulrich Drepper  <drepper@redhat.com>
+
+	* Makefile.am (install): Remove dependency on libebl.so.
+
+2003-08-13  Ulrich Drepper  <drepper@redhat.com>
+
+	* eblopenbackend.c: Adjust relative path to arch-specific DSOs
+	assuming the code ends up in the application.  Add second dlopen()
+	try without any path, just the filename.
+	* Makefile.in: Remove rules to build and install libebl.so.
+
+2003-08-11  Ulrich Drepper  <drepper@redhat.com>
+
+        * Moved to CVS archive.
diff --git a/libebl/Makefile.am b/libebl/Makefile.am
new file mode 100644
index 0000000..737de6b
--- /dev/null
+++ b/libebl/Makefile.am
@@ -0,0 +1,63 @@
+## Process this file with automake to create Makefile.in
+##
+## Copyright (C) 2000-2010, 2013, 2016, 2017 Red Hat, Inc.
+## This file is part of elfutils.
+##
+## This file is free software; you can redistribute it and/or modify
+## it under the terms of either
+##
+##   * the GNU Lesser General Public License as published by the Free
+##     Software Foundation; either version 3 of the License, or (at
+##     your option) any later version
+##
+## or
+##
+##   * the GNU General Public License as published by the Free
+##     Software Foundation; either version 2 of the License, or (at
+##     your option) any later version
+##
+## or both in parallel, as here.
+##
+## elfutils is distributed in the hope that it will be useful, but
+## WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+## General Public License for more details.
+##
+## You should have received copies of the GNU General Public License and
+## the GNU Lesser General Public License along with this program.  If
+## not, see <http://www.gnu.org/licenses/>.
+##
+include $(top_srcdir)/config/eu.am
+AM_CFLAGS += $(fpic_CFLAGS)
+AM_CPPFLAGS += -I$(srcdir)/../libelf -I$(srcdir)/../libdw -I$(srcdir)/../libasm
+VERSION = 1
+LIBEBL_SUBDIR = @LIBEBL_SUBDIR@
+
+lib_LIBRARIES = libebl.a
+
+pkginclude_HEADERS = libebl.h
+
+gen_SOURCES = eblopenbackend.c eblclosebackend.c \
+	      eblreloctypename.c eblsegmenttypename.c \
+	      eblsectiontypename.c eblmachineflagname.c \
+	      eblsymboltypename.c ebldynamictagname.c eblsectionname.c \
+	      eblsymbolbindingname.c eblbackendname.c eblosabiname.c \
+	      eblmachineflagcheck.c eblmachinesectionflagcheck.c \
+	      eblreloctypecheck.c eblrelocvaliduse.c eblrelocsimpletype.c \
+	      ebldynamictagcheck.c eblcorenotetypename.c eblobjnotetypename.c \
+	      eblcorenote.c eblobjnote.c ebldebugscnp.c \
+	      eblgotpcreloccheck.c eblcopyrelocp.c eblsectionstripp.c \
+	      eblelfclass.c eblelfdata.c eblelfmachine.c \
+	      ebl_check_special_symbol.c eblbsspltp.c eblretval.c \
+	      eblreginfo.c eblnonerelocp.c eblrelativerelocp.c \
+	      eblsysvhashentrysize.c eblauxvinfo.c eblcheckobjattr.c \
+	      ebl_check_special_section.c ebl_syscall_abi.c eblabicfi.c \
+	      eblstother.c eblinitreg.c ebldwarftoregno.c eblnormalizepc.c \
+	      eblunwind.c eblresolvesym.c eblcheckreloctargettype.c \
+	      ebl_data_marker_symbol.c
+
+libebl_a_SOURCES = $(gen_SOURCES)
+
+noinst_HEADERS = libeblP.h ebl-hooks.h
+
+CLEANFILES += $(am_libebl_pic_a_OBJECTS)
diff --git a/libebl/ebl-hooks.h b/libebl/ebl-hooks.h
new file mode 100644
index 0000000..f3a0e64
--- /dev/null
+++ b/libebl/ebl-hooks.h
@@ -0,0 +1,192 @@
+/* Backend hook signatures internal interface for libebl.
+   Copyright (C) 2000-2011, 2013, 2014, 2016, 2017 Red Hat, Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+/* Return symbolic representation of relocation type.  */
+const char *EBLHOOK(reloc_type_name) (int, char *, size_t);
+
+/* Check relocation type.  */
+bool EBLHOOK(reloc_type_check) (int);
+
+/* Check if relocation type is for simple absolute relocations.  */
+Elf_Type EBLHOOK(reloc_simple_type) (Ebl *, int);
+
+/* Check relocation type use.  */
+bool EBLHOOK(reloc_valid_use) (Elf *, int);
+
+/* Return true if the symbol type is that referencing the GOT.  */
+bool EBLHOOK(gotpc_reloc_check) (Elf *, int);
+
+/* Return symbolic representation of segment type.  */
+const char *EBLHOOK(segment_type_name) (int, char *, size_t);
+
+/* Return symbolic representation of section type.  */
+const char *EBLHOOK(section_type_name) (int, char *, size_t);
+
+/* Return section name.  */
+const char *EBLHOOK(section_name) (int, int, char *, size_t);
+
+/* Return next machine flag name.  */
+const char *EBLHOOK(machine_flag_name) (GElf_Word *);
+
+/* Check whether machine flags are valid.  */
+bool EBLHOOK(machine_flag_check) (GElf_Word);
+
+/* Check whether SHF_MASKPROC flag bits are valid.  */
+bool EBLHOOK(machine_section_flag_check) (GElf_Xword);
+
+/* Check whether the section with the given index, header, and name
+   is a special machine section that is valid despite a combination
+   of flags or other details that are not generically valid.  */
+bool EBLHOOK(check_special_section) (Ebl *, int,
+				     const GElf_Shdr *, const char *);
+
+/* Return symbolic representation of symbol type.  */
+const char *EBLHOOK(symbol_type_name) (int, char *, size_t);
+
+/* Return symbolic representation of symbol binding.  */
+const char *EBLHOOK(symbol_binding_name) (int, char *, size_t);
+
+/* Return symbolic representation of dynamic tag.  */
+const char *EBLHOOK(dynamic_tag_name) (int64_t, char *, size_t);
+
+/* Check dynamic tag.  */
+bool EBLHOOK(dynamic_tag_check) (int64_t);
+
+/* Return symbolic representation of OS ABI.  */
+const char *EBLHOOK(osabi_name) (int, char *, size_t);
+
+/* Name of a note entry type for core files.  */
+const char *EBLHOOK(core_note_type_name) (uint32_t, char *, size_t);
+
+/* Name of a note entry type for object files.  */
+const char *EBLHOOK(object_note_type_name) (const char *, uint32_t,
+					    char *, size_t);
+
+/* Describe core note format.  */
+int EBLHOOK(core_note) (const GElf_Nhdr *, const char *,
+			GElf_Word *, size_t *, const Ebl_Register_Location **,
+			size_t *, const Ebl_Core_Item **);
+
+/* Handle object file note.  */
+bool EBLHOOK(object_note) (const char *, uint32_t, uint32_t, const char *);
+
+/* Check object attribute.  */
+bool EBLHOOK(check_object_attribute) (Ebl *, const char *, int, uint64_t,
+				      const char **, const char **);
+
+/* Check reloc target section type.  */
+bool EBLHOOK(check_reloc_target_type) (Ebl *, Elf64_Word);
+
+/* Describe auxv element type.  */
+int EBLHOOK(auxv_info) (GElf_Xword, const char **, const char **);
+
+/* Check section name for being that of a debug informatino section.  */
+bool EBLHOOK(debugscn_p) (const char *);
+
+/* Check whether given relocation is a copy relocation.  */
+bool EBLHOOK(copy_reloc_p) (int);
+
+/* Check whether given relocation is a no-op relocation.  */
+bool EBLHOOK(none_reloc_p) (int);
+
+/* Check whether given relocation is a relative relocation.  */
+bool EBLHOOK(relative_reloc_p) (int);
+
+/* Check whether given symbol's value is ok despite normal checks.  */
+bool EBLHOOK(check_special_symbol) (Elf *, GElf_Ehdr *, const GElf_Sym *,
+			      const char *, const GElf_Shdr *);
+
+/* Check if this is a data marker symbol.  e.g. '$d' symbols for ARM.  */
+bool EBLHOOK(data_marker_symbol) (const GElf_Sym *sym, const char *sname);
+
+/* Check whether only valid bits are set on the st_other symbol flag.
+   Standard ST_VISIBILITY have already been masked off.  */
+bool EBLHOOK(check_st_other_bits) (unsigned char st_other);
+
+/* Check if backend uses a bss PLT in this file.  */
+bool EBLHOOK(bss_plt_p) (Elf *);
+
+/* Return location expression to find return value given the
+   DW_AT_type DIE of a DW_TAG_subprogram DIE.  */
+int EBLHOOK(return_value_location) (Dwarf_Die *functypedie,
+				    const Dwarf_Op **locp);
+
+/* Return register name information.  */
+ssize_t EBLHOOK(register_info) (Ebl *ebl,
+				int regno, char *name, size_t namelen,
+				const char **prefix, const char **setname,
+				int *bits, int *type);
+
+/* Return system call ABI registers.  */
+int EBLHOOK(syscall_abi) (Ebl *ebl, int *sp, int *pc,
+			  int *callno, int args[6]);
+
+/* Disassembler function.  */
+int EBLHOOK(disasm) (Ebl *ebl, const uint8_t **startp, const uint8_t *end,
+		     GElf_Addr addr, const char *fmt, DisasmOutputCB_t outcb,
+		     DisasmGetSymCB_t symcb, void *outcbarg, void *symcbarg);
+
+/* Supply the machine-specific state of CFI before CIE initial programs.
+   Function returns 0 on success and -1 on error.  */
+int EBLHOOK(abi_cfi) (Ebl *ebl, Dwarf_CIE *abi_info);
+
+/* Fetch process data from live TID and call SETFUNC one or more times.
+   Method should be present only when EBL_FRAME_NREGS > 0, otherwise the
+   backend doesn't support unwinding.  */
+bool EBLHOOK(set_initial_registers_tid) (pid_t tid,
+					 ebl_tid_registers_t *setfunc,
+					 void *arg);
+
+/* Convert *REGNO as is in DWARF to a lower range suitable for
+   Dwarf_Frame->REGS indexing.  */
+bool EBLHOOK(dwarf_to_regno) (Ebl *ebl, unsigned *regno);
+
+/* Optionally modify *PC as fetched from inferior data into valid PC
+   instruction pointer.  */
+void EBLHOOK(normalize_pc) (Ebl *ebl, Dwarf_Addr *pc);
+
+/* Get previous frame state for an existing frame state.  Method is called only
+   if unwinder could not find CFI for current PC.  PC is for the
+   existing frame.  SETFUNC sets register in the previous frame.  GETFUNC gets
+   register from the existing frame.  Note that GETFUNC vs. SETFUNC act on
+   a disjunct set of registers.  READFUNC reads memory.  ARG has to be passed
+   for SETFUNC, GETFUNC and READFUNC.  *SIGNAL_FRAMEP is initialized to false,
+   it can be set to true if existing frame is a signal frame.  SIGNAL_FRAMEP is
+   never NULL.  */
+bool EBLHOOK(unwind) (Ebl *ebl, Dwarf_Addr pc, ebl_tid_registers_t *setfunc,
+		      ebl_tid_registers_get_t *getfunc,
+		      ebl_pid_memory_read_t *readfunc, void *arg,
+		      bool *signal_framep);
+
+/* Returns true if the value can be resolved to an address in an
+   allocated section, which will be returned in *ADDR.
+   (e.g. function descriptor resolving)  */
+bool EBLHOOK(resolve_sym_value) (Ebl *ebl, GElf_Addr *addr);
+
+/* Destructor for ELF backend handle.  */
+void EBLHOOK(destr) (struct ebl *);
diff --git a/libebl/ebl_check_special_section.c b/libebl/ebl_check_special_section.c
new file mode 100644
index 0000000..903b69d
--- /dev/null
+++ b/libebl/ebl_check_special_section.c
@@ -0,0 +1,41 @@
+/* Check for a special section allowed to violate generic constraints.
+   Copyright (C) 2008 Red Hat, Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libeblP.h>
+
+
+bool
+ebl_check_special_section (Ebl *ebl, int ndx, const GElf_Shdr *shdr,
+			   const char *sname)
+{
+  return ebl != NULL && ebl->check_special_section (ebl, ndx, shdr, sname);
+}
diff --git a/libebl/ebl_check_special_symbol.c b/libebl/ebl_check_special_symbol.c
new file mode 100644
index 0000000..bdcb026
--- /dev/null
+++ b/libebl/ebl_check_special_symbol.c
@@ -0,0 +1,45 @@
+/* Check special symbol's st_value.
+   Copyright (C) 2005 Red Hat, Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <inttypes.h>
+#include <libeblP.h>
+
+
+bool
+ebl_check_special_symbol (Ebl *ebl, GElf_Ehdr *ehdr, const GElf_Sym *sym,
+			  const char *name, const GElf_Shdr *destshdr)
+{
+  if (ebl == NULL)
+    return false;
+
+  return ebl->check_special_symbol (ebl->elf, ehdr, sym, name, destshdr);
+}
diff --git a/libebl/ebl_data_marker_symbol.c b/libebl/ebl_data_marker_symbol.c
new file mode 100644
index 0000000..922d720
--- /dev/null
+++ b/libebl/ebl_data_marker_symbol.c
@@ -0,0 +1,44 @@
+/* Check whether a symbol is a special data marker.
+   Copyright (C) 2017 Red Hat, Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <inttypes.h>
+#include <libeblP.h>
+
+
+bool
+ebl_data_marker_symbol (Ebl *ebl, const GElf_Sym *sym, const char *sname)
+{
+  if (ebl == NULL)
+    return false;
+
+  return ebl->data_marker_symbol (sym, sname);
+}
diff --git a/libebl/ebl_syscall_abi.c b/libebl/ebl_syscall_abi.c
new file mode 100644
index 0000000..a25369d
--- /dev/null
+++ b/libebl/ebl_syscall_abi.c
@@ -0,0 +1,40 @@
+/* Return system call ABI mapped to DWARF register numbers.
+   Copyright (C) 2008 Red Hat, Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libeblP.h>
+
+
+int
+ebl_syscall_abi (Ebl *ebl, int *sp, int *pc, int *callno, int *args)
+{
+  return ebl != NULL ? ebl->syscall_abi (ebl, sp, pc, callno, args) : -1;
+}
diff --git a/libebl/eblabicfi.c b/libebl/eblabicfi.c
new file mode 100644
index 0000000..8bf189f
--- /dev/null
+++ b/libebl/eblabicfi.c
@@ -0,0 +1,46 @@
+/* Return ABI-specific DWARF CFI details.
+   Copyright (C) 2009 Red Hat, Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libeblP.h>
+
+
+int
+ebl_abi_cfi (Ebl *ebl, Dwarf_CIE *abi_info)
+{
+  return ebl == NULL ? -1 : ebl->abi_cfi (ebl, abi_info);
+}
+
+int
+ebl_ra_offset (Ebl *ebl)
+{
+  return ebl->ra_offset;
+}
diff --git a/libebl/eblauxvinfo.c b/libebl/eblauxvinfo.c
new file mode 100644
index 0000000..ce1141b
--- /dev/null
+++ b/libebl/eblauxvinfo.c
@@ -0,0 +1,100 @@
+/* Describe known auxv types.
+   Copyright (C) 2007, 2008, 2009 Red Hat, Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <assert.h>
+#include <byteswap.h>
+#include <endian.h>
+#include <inttypes.h>
+#include <stdio.h>
+#include <stddef.h>
+#include <libeblP.h>
+
+#define AUXV_TYPES							      \
+  TYPE (NULL, "")							      \
+  TYPE (IGNORE, "")							      \
+  TYPE (EXECFD, "d")							      \
+  TYPE (EXECFN, "s")							      \
+  TYPE (PHDR, "p")							      \
+  TYPE (PHENT, "u")							      \
+  TYPE (PHNUM, "u")							      \
+  TYPE (PAGESZ, "u")							      \
+  TYPE (BASE, "p")							      \
+  TYPE (FLAGS, "x")							      \
+  TYPE (ENTRY, "p")							      \
+  TYPE (NOTELF, "")							      \
+  TYPE (UID, "u")							      \
+  TYPE (EUID, "u")							      \
+  TYPE (GID, "u")							      \
+  TYPE (EGID, "u")							      \
+  TYPE (CLKTCK, "u")							      \
+  TYPE (PLATFORM, "s")							      \
+  TYPE (BASE_PLATFORM, "s")						      \
+  TYPE (HWCAP, "x")							      \
+  TYPE (FPUCW, "x")							      \
+  TYPE (DCACHEBSIZE, "d")						      \
+  TYPE (ICACHEBSIZE, "d")						      \
+  TYPE (UCACHEBSIZE, "d")						      \
+  TYPE (IGNOREPPC, "")							      \
+  TYPE (SECURE, "u")							      \
+  TYPE (SYSINFO, "p")							      \
+  TYPE (SYSINFO_EHDR, "p")						      \
+  TYPE (L1I_CACHESHAPE, "d")						      \
+  TYPE (L1D_CACHESHAPE, "d")						      \
+  TYPE (L2_CACHESHAPE, "d")						      \
+  TYPE (L3_CACHESHAPE, "d")						      \
+  TYPE (RANDOM, "p")
+
+static const struct
+{
+  const char *name, *format;
+} auxv_types[] =
+  {
+#define TYPE(name, fmt) [AT_##name] = { #name, fmt },
+    AUXV_TYPES
+#undef	TYPE
+  };
+#define nauxv_types (sizeof auxv_types / sizeof auxv_types[0])
+
+int
+ebl_auxv_info (Ebl *ebl, GElf_Xword a_type, const char **name,
+	       const char **format)
+{
+  int result = ebl->auxv_info (a_type, name, format);
+  if (result == 0 && a_type < nauxv_types && auxv_types[a_type].name != NULL)
+    {
+      /* The machine specific function did not know this type.  */
+      *name = auxv_types[a_type].name;
+      *format = auxv_types[a_type].format;
+      result = 1;
+    }
+  return result;
+}
diff --git a/libebl/eblbackendname.c b/libebl/eblbackendname.c
new file mode 100644
index 0000000..a2b2df6
--- /dev/null
+++ b/libebl/eblbackendname.c
@@ -0,0 +1,42 @@
+/* Return backend name.
+   Copyright (C) 2001, 2002 Red Hat, Inc.
+   This file is part of elfutils.
+   Written by Ulrich Drepper <drepper@redhat.com>, 2001.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <libeblP.h>
+
+
+const char *
+ebl_backend_name (Ebl *ebl)
+{
+  return ebl != NULL ? ebl->emulation : gettext ("No backend");
+}
diff --git a/libebl/eblbsspltp.c b/libebl/eblbsspltp.c
new file mode 100644
index 0000000..24c4a08
--- /dev/null
+++ b/libebl/eblbsspltp.c
@@ -0,0 +1,41 @@
+/* Check if backend uses a bss PLT.
+   Copyright (C) 2005, 2014 Red Hat, Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <inttypes.h>
+#include <libeblP.h>
+
+
+bool
+ebl_bss_plt_p (Ebl *ebl)
+{
+  return ebl == NULL ? false : ebl->bss_plt_p (ebl->elf);
+}
diff --git a/libebl/eblcheckobjattr.c b/libebl/eblcheckobjattr.c
new file mode 100644
index 0000000..b590a03
--- /dev/null
+++ b/libebl/eblcheckobjattr.c
@@ -0,0 +1,56 @@
+/* Check object attributes.
+   Copyright (C) 2008 Red Hat, Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
+#include <libeblP.h>
+
+
+bool
+ebl_check_object_attribute (Ebl *ebl, const char *vendor, int tag,
+			    uint64_t value, const char **tag_name,
+			    const char **value_name)
+{
+  if (ebl->check_object_attribute (ebl, vendor, tag, value,
+				   tag_name, value_name))
+    return true;
+
+  if (strcmp (vendor, "gnu"))
+    return false;
+
+  if (tag == 32)
+    {
+      *tag_name = "compatibility";
+      return true;
+    }
+
+  return false;
+}
diff --git a/libebl/eblcheckreloctargettype.c b/libebl/eblcheckreloctargettype.c
new file mode 100644
index 0000000..e0d57c1
--- /dev/null
+++ b/libebl/eblcheckreloctargettype.c
@@ -0,0 +1,54 @@
+/* Check whether a section type is a valid target for relocation.
+   Copyright (C) 2014, 2015 Red Hat, Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libeblP.h>
+
+
+bool
+ebl_check_reloc_target_type (Ebl *ebl, Elf64_Word sh_type)
+{
+  if (ebl->check_reloc_target_type (ebl, sh_type))
+    return true;
+
+  switch (sh_type)
+    {
+      case SHT_PROGBITS:
+      case SHT_NOBITS:
+      case SHT_INIT_ARRAY:
+      case SHT_FINI_ARRAY:
+      case SHT_PREINIT_ARRAY:
+	return true;
+
+      default:
+	return false;
+    }
+}
diff --git a/libebl/eblclosebackend.c b/libebl/eblclosebackend.c
new file mode 100644
index 0000000..67fbdfe
--- /dev/null
+++ b/libebl/eblclosebackend.c
@@ -0,0 +1,54 @@
+/* Free ELF backend handle.
+   Copyright (C) 2000, 2001, 2002 Red Hat, Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <dlfcn.h>
+#include <stdlib.h>
+
+#include <libeblP.h>
+
+
+void
+ebl_closebackend (Ebl *ebl)
+{
+  if (ebl != NULL)
+    {
+      /* Run the destructor.  */
+      ebl->destr (ebl);
+
+      /* Close the dynamically loaded object.  */
+      if (ebl->dlhandle != NULL)
+	(void) dlclose (ebl->dlhandle);
+
+      /* Free the resources.  */
+      free (ebl);
+    }
+}
diff --git a/libebl/eblcopyrelocp.c b/libebl/eblcopyrelocp.c
new file mode 100644
index 0000000..0458c4f
--- /dev/null
+++ b/libebl/eblcopyrelocp.c
@@ -0,0 +1,41 @@
+/* Check whether given relocation is a copy relocation.
+   Copyright (C) 2005 Red Hat, Inc.
+   This file is part of elfutils.
+   Written by Ulrich Drepper <drepper@redhat.com>, 2005.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libeblP.h>
+
+
+bool
+ebl_copy_reloc_p (Ebl *ebl, int reloc)
+{
+  return ebl->copy_reloc_p (reloc);
+}
diff --git a/libebl/eblcorenote.c b/libebl/eblcorenote.c
new file mode 100644
index 0000000..783f981
--- /dev/null
+++ b/libebl/eblcorenote.c
@@ -0,0 +1,80 @@
+/* Describe known core note formats.
+   Copyright (C) 2007, 2010 Red Hat, Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <assert.h>
+#include <byteswap.h>
+#include <endian.h>
+#include <inttypes.h>
+#include <stdio.h>
+#include <stddef.h>
+#include <libeblP.h>
+
+
+int
+ebl_core_note (Ebl *ebl, const GElf_Nhdr *nhdr, const char *name,
+	       GElf_Word *regs_offset, size_t *nregloc,
+	       const Ebl_Register_Location **reglocs, size_t *nitems,
+	       const Ebl_Core_Item **items)
+{
+  int result = ebl->core_note (nhdr, name,
+			       regs_offset, nregloc, reglocs, nitems, items);
+  if (result == 0)
+    {
+      /* The machine specific function did not know this type.  */
+
+      *regs_offset = 0;
+      *nregloc = 0;
+      *reglocs = NULL;
+      switch (nhdr->n_type)
+	{
+#define ITEMS(type, table)				\
+	  case type:					\
+	    *items = table;				\
+	    *nitems = sizeof table / sizeof table[0];	\
+	    result = 1;					\
+	    break
+
+	  static const Ebl_Core_Item platform[] =
+	    {
+	      {
+		.name = "Platform",
+		.type = ELF_T_BYTE, .count = 0, .format = 's'
+	      }
+	    };
+	  ITEMS (NT_PLATFORM, platform);
+
+#undef	ITEMS
+	}
+    }
+
+  return result;
+}
diff --git a/libebl/eblcorenotetypename.c b/libebl/eblcorenotetypename.c
new file mode 100644
index 0000000..d3a56fa
--- /dev/null
+++ b/libebl/eblcorenotetypename.c
@@ -0,0 +1,107 @@
+/* Return note type name.
+   Copyright (C) 2002, 2007, 2008, 2012, 2013 Red Hat, Inc.
+   This file is part of elfutils.
+   Written by Ulrich Drepper <drepper@redhat.com>, 2002.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <inttypes.h>
+#include <stdio.h>
+#include <libeblP.h>
+
+const char *
+ebl_core_note_type_name (Ebl *ebl, uint32_t type, char *buf, size_t len)
+{
+  const char *res = ebl->core_note_type_name (type, buf, len);
+
+  if (res == NULL)
+    {
+      static const char *knowntypes[] =
+	{
+#define KNOWNSTYPE(name) [NT_##name] = #name
+	  KNOWNSTYPE (PRSTATUS),
+	  KNOWNSTYPE (FPREGSET),
+	  KNOWNSTYPE (PRPSINFO),
+	  KNOWNSTYPE (TASKSTRUCT),
+	  KNOWNSTYPE (PLATFORM),
+	  KNOWNSTYPE (AUXV),
+	  KNOWNSTYPE (GWINDOWS),
+	  KNOWNSTYPE (ASRS),
+	  KNOWNSTYPE (PSTATUS),
+	  KNOWNSTYPE (PSINFO),
+	  KNOWNSTYPE (PRCRED),
+	  KNOWNSTYPE (UTSNAME),
+	  KNOWNSTYPE (LWPSTATUS),
+	  KNOWNSTYPE (LWPSINFO),
+	  KNOWNSTYPE (PRFPXREG)
+#undef KNOWNSTYPE
+	};
+
+      /* Handle standard names.  */
+      if (type < sizeof (knowntypes) / sizeof (knowntypes[0])
+	  && knowntypes[type] != NULL)
+	res = knowntypes[type];
+      else
+	switch (type)
+	  {
+#define KNOWNSTYPE(name) case NT_##name: res = #name; break
+	    KNOWNSTYPE (PRXFPREG);
+	    KNOWNSTYPE (PPC_VMX);
+	    KNOWNSTYPE (PPC_SPE);
+	    KNOWNSTYPE (PPC_VSX);
+	    KNOWNSTYPE (PPC_TM_SPR);
+	    KNOWNSTYPE (386_TLS);
+	    KNOWNSTYPE (386_IOPERM);
+	    KNOWNSTYPE (X86_XSTATE);
+	    KNOWNSTYPE (S390_HIGH_GPRS);
+	    KNOWNSTYPE (S390_TIMER);
+	    KNOWNSTYPE (S390_TODCMP);
+	    KNOWNSTYPE (S390_TODPREG);
+	    KNOWNSTYPE (S390_CTRS);
+	    KNOWNSTYPE (S390_PREFIX);
+	    KNOWNSTYPE (S390_LAST_BREAK);
+	    KNOWNSTYPE (S390_SYSTEM_CALL);
+	    KNOWNSTYPE (ARM_VFP);
+	    KNOWNSTYPE (ARM_TLS);
+	    KNOWNSTYPE (ARM_HW_BREAK);
+	    KNOWNSTYPE (ARM_HW_WATCH);
+	    KNOWNSTYPE (ARM_SYSTEM_CALL);
+	    KNOWNSTYPE (SIGINFO);
+	    KNOWNSTYPE (FILE);
+#undef KNOWNSTYPE
+
+	  default:
+	    snprintf (buf, len, "%s: %" PRIu32, gettext ("<unknown>"), type);
+
+	    res = buf;
+	  }
+    }
+
+  return res;
+}
diff --git a/libebl/ebldebugscnp.c b/libebl/ebldebugscnp.c
new file mode 100644
index 0000000..2964fdb
--- /dev/null
+++ b/libebl/ebldebugscnp.c
@@ -0,0 +1,42 @@
+/* Check section name for being that of a debug informatino section.
+   Copyright (C) 2002, 2014 Red Hat, Inc.
+   This file is part of elfutils.
+   Written by Ulrich Drepper <drepper@redhat.com>, 2002.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdint.h>
+#include <libeblP.h>
+
+
+bool
+ebl_debugscn_p (Ebl *ebl, const char *name)
+{
+  return name != NULL && ebl->debugscn_p (name);
+}
diff --git a/libebl/ebldwarftoregno.c b/libebl/ebldwarftoregno.c
new file mode 100644
index 0000000..c664496
--- /dev/null
+++ b/libebl/ebldwarftoregno.c
@@ -0,0 +1,40 @@
+/* Convert *REGNO as is in DWARF to a lower range.
+   Copyright (C) 2013 Red Hat, Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libeblP.h>
+
+bool
+ebl_dwarf_to_regno (Ebl *ebl, unsigned *regno)
+{
+  /* ebl is declared NN */
+  return ebl->dwarf_to_regno == NULL ? true : ebl->dwarf_to_regno (ebl, regno);
+}
diff --git a/libebl/ebldynamictagcheck.c b/libebl/ebldynamictagcheck.c
new file mode 100644
index 0000000..c2311cc
--- /dev/null
+++ b/libebl/ebldynamictagcheck.c
@@ -0,0 +1,54 @@
+/* Check dynamic tag.
+   Copyright (C) 2001, 2002, 2006 Red Hat, Inc.
+   This file is part of elfutils.
+   Written by Ulrich Drepper <drepper@redhat.com>, 2001.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <inttypes.h>
+#include <libeblP.h>
+
+
+bool
+ebl_dynamic_tag_check (Ebl *ebl, int64_t tag)
+{
+  bool res = ebl != NULL ? ebl->dynamic_tag_check (tag) : false;
+
+  if (!res
+      && ((tag >= 0 && tag < DT_NUM)
+	  || (tag >= DT_GNU_PRELINKED && tag <= DT_SYMINENT)
+	  || (tag >= DT_GNU_HASH && tag <= DT_SYMINFO)
+	  || tag == DT_VERSYM
+	  || (tag >= DT_RELACOUNT && tag <= DT_VERNEEDNUM)
+	  || tag == DT_AUXILIARY
+	  || tag == DT_FILTER))
+    res = true;
+
+  return res;
+}
diff --git a/libebl/ebldynamictagname.c b/libebl/ebldynamictagname.c
new file mode 100644
index 0000000..3aaccd0
--- /dev/null
+++ b/libebl/ebldynamictagname.c
@@ -0,0 +1,109 @@
+/* Return dynamic tag name.
+   Copyright (C) 2001, 2002, 2006, 2008 Red Hat, Inc.
+   This file is part of elfutils.
+   Written by Ulrich Drepper <drepper@redhat.com>, 2001.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <inttypes.h>
+#include <stdio.h>
+#include <libeblP.h>
+
+
+const char *
+ebl_dynamic_tag_name (Ebl *ebl, int64_t tag, char *buf, size_t len)
+{
+  const char *res = ebl != NULL ? ebl->dynamic_tag_name (tag, buf, len) : NULL;
+
+  if (res == NULL)
+    {
+      if (tag >= 0 && tag < DT_NUM)
+	{
+	  static const char *stdtags[] =
+	    {
+	      "NULL", "NEEDED", "PLTRELSZ", "PLTGOT", "HASH", "STRTAB",
+	      "SYMTAB", "RELA", "RELASZ", "RELAENT", "STRSZ", "SYMENT",
+	      "INIT", "FINI", "SONAME", "RPATH", "SYMBOLIC", "REL", "RELSZ",
+	      "RELENT", "PLTREL", "DEBUG", "TEXTREL", "JMPREL", "BIND_NOW",
+	      "INIT_ARRAY", "FINI_ARRAY", "INIT_ARRAYSZ", "FINI_ARRAYSZ",
+	      "RUNPATH", "FLAGS", "ENCODING", "PREINIT_ARRAY",
+	      "PREINIT_ARRAYSZ"
+	    };
+
+	  res = stdtags[tag];
+	}
+      else if (tag == DT_VERSYM)
+	res = "VERSYM";
+      else if (tag >= DT_GNU_PRELINKED && tag <= DT_SYMINENT)
+	{
+	  static const char *valrntags[] =
+	    {
+	      "GNU_PRELINKED", "GNU_CONFLICTSZ", "GNU_LIBLISTSZ",
+	      "CHECKSUM", "PLTPADSZ", "MOVEENT", "MOVESZ", "FEATURE_1",
+	      "POSFLAG_1", "SYMINSZ", "SYMINENT"
+	    };
+
+	  res = valrntags[tag - DT_GNU_PRELINKED];
+	}
+      else if (tag >= DT_GNU_HASH && tag <= DT_SYMINFO)
+	{
+	  static const char *addrrntags[] =
+	    {
+	      "GNU_HASH", "TLSDESC_PLT", "TLSDESC_GOT",
+	      "GNU_CONFLICT", "GNU_LIBLIST", "CONFIG", "DEPAUDIT", "AUDIT",
+	      "PLTPAD", "MOVETAB", "SYMINFO"
+	    };
+
+	  res = addrrntags[tag - DT_GNU_HASH];
+	}
+      else if (tag >= DT_RELACOUNT && tag <= DT_VERNEEDNUM)
+	{
+	  static const char *suntags[] =
+	    {
+	      "RELACOUNT", "RELCOUNT", "FLAGS_1", "VERDEF", "VERDEFNUM",
+	      "VERNEED", "VERNEEDNUM"
+	    };
+
+	  res = suntags[tag - DT_RELACOUNT];
+	}
+      else if (tag == DT_AUXILIARY)
+	res = "AUXILIARY";
+      else if (tag == DT_FILTER)
+	res = "FILTER";
+      else
+	{
+	  snprintf (buf, len, gettext ("<unknown>: %#" PRIx64), tag);
+
+	  res = buf;
+
+	}
+    }
+
+  return res;
+}
diff --git a/libebl/eblelfclass.c b/libebl/eblelfclass.c
new file mode 100644
index 0000000..2ffef30
--- /dev/null
+++ b/libebl/eblelfclass.c
@@ -0,0 +1,41 @@
+/* Return ELF class.
+   Copyright (C) 2005 Red Hat, Inc.
+   This file is part of elfutils.
+   Written by Ulrich Drepper <drepper@redhat.com>, 2005.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libeblP.h>
+
+
+int
+ebl_get_elfclass (Ebl *ebl)
+{
+  return ebl->class;
+}
diff --git a/libebl/eblelfdata.c b/libebl/eblelfdata.c
new file mode 100644
index 0000000..072924b
--- /dev/null
+++ b/libebl/eblelfdata.c
@@ -0,0 +1,41 @@
+/* Return ELF data encoding.
+   Copyright (C) 2005 Red Hat, Inc.
+   This file is part of elfutils.
+   Written by Ulrich Drepper <drepper@redhat.com>, 2005.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libeblP.h>
+
+
+int
+ebl_get_elfdata (Ebl *ebl)
+{
+  return ebl->data;
+}
diff --git a/libebl/eblelfmachine.c b/libebl/eblelfmachine.c
new file mode 100644
index 0000000..c2c8627
--- /dev/null
+++ b/libebl/eblelfmachine.c
@@ -0,0 +1,41 @@
+/* Return ELF machine.
+   Copyright (C) 2005 Red Hat, Inc.
+   This file is part of elfutils.
+   Written by Ulrich Drepper <drepper@redhat.com>, 2005.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libeblP.h>
+
+
+int
+ebl_get_elfmachine (Ebl *ebl)
+{
+  return ebl->machine;
+}
diff --git a/libebl/eblgotpcreloccheck.c b/libebl/eblgotpcreloccheck.c
new file mode 100644
index 0000000..7c9c079
--- /dev/null
+++ b/libebl/eblgotpcreloccheck.c
@@ -0,0 +1,42 @@
+/* Return true if the symbol type is that referencing the GOT.  E.g.,
+   R_386_GOTPC.
+   Copyright (C) 2003 Red Hat, Inc.
+   This file is part of elfutils.
+   Written by Ulrich Drepper <drepper@redhat.com>, 2003.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libeblP.h>
+
+
+bool
+ebl_gotpc_reloc_check (Ebl *ebl, int reloc)
+{
+  return ebl != NULL ? ebl->gotpc_reloc_check (ebl->elf, reloc) : false;
+}
diff --git a/libebl/eblinitreg.c b/libebl/eblinitreg.c
new file mode 100644
index 0000000..8a3fb18
--- /dev/null
+++ b/libebl/eblinitreg.c
@@ -0,0 +1,59 @@
+/* Fetch live process Dwfl_Frame from PID.
+   Copyright (C) 2013, 2014 Red Hat, Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libeblP.h>
+#include <assert.h>
+
+bool
+ebl_set_initial_registers_tid (Ebl *ebl, pid_t tid,
+			       ebl_tid_registers_t *setfunc,
+			       void *arg)
+{
+  /* Otherwise caller could not allocate THREAD frame of proper size.
+     If set_initial_registers_tid is unsupported then FRAME_NREGS is zero.  */
+  assert (ebl->set_initial_registers_tid != NULL);
+  return ebl->set_initial_registers_tid (tid, setfunc, arg);
+}
+
+size_t
+ebl_frame_nregs (Ebl *ebl)
+{
+  /* ebl is declared NN */
+  return ebl->frame_nregs;
+}
+
+GElf_Addr
+ebl_func_addr_mask (Ebl *ebl)
+{
+  return ((ebl == NULL || ebl->func_addr_mask == 0)
+	  ? ~(GElf_Addr)0 : ebl->func_addr_mask);
+}
diff --git a/libebl/eblmachineflagcheck.c b/libebl/eblmachineflagcheck.c
new file mode 100644
index 0000000..e98b600
--- /dev/null
+++ b/libebl/eblmachineflagcheck.c
@@ -0,0 +1,41 @@
+/* Check machine flag.
+   Copyright (C) 2001, 2002 Red Hat, Inc.
+   This file is part of elfutils.
+   Written by Ulrich Drepper <drepper@redhat.com>, 2001.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libeblP.h>
+
+
+bool
+ebl_machine_flag_check (Ebl *ebl, Elf64_Word flags)
+{
+  return ebl != NULL ? ebl->machine_flag_check (flags) : (flags == 0);
+}
diff --git a/libebl/eblmachineflagname.c b/libebl/eblmachineflagname.c
new file mode 100644
index 0000000..5f44077
--- /dev/null
+++ b/libebl/eblmachineflagname.c
@@ -0,0 +1,88 @@
+/* Return machine flag names.
+   Copyright (C) 2001, 2002 Red Hat, Inc.
+   This file is part of elfutils.
+   Written by Ulrich Drepper <drepper@redhat.com>, 2001.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <system.h>
+#include <libeblP.h>
+
+
+const char *
+ebl_machine_flag_name (Ebl *ebl, Elf64_Word flags, char *buf, size_t len)
+{
+  const char *res;
+
+  if (flags == 0)
+    res = "";
+  else
+    {
+      char *cp = buf;
+      int first = 1;
+      const char *machstr;
+      size_t machstrlen;
+
+      do
+	{
+	  if (! first)
+	    {
+	      if (cp + 1 >= buf + len)
+		break;
+	      *cp++ = ',';
+	    }
+
+	  machstr = ebl != NULL ? ebl->machine_flag_name (&flags) : NULL;
+	  if (machstr == NULL)
+	    {
+	      /* No more known flag.  */
+	      snprintf (cp, buf + len - cp, "%#x", flags);
+	      break;
+	    }
+
+	  machstrlen = strlen (machstr) + 1;
+	  if ((size_t) (buf + len - cp) < machstrlen)
+	    {
+	      *((char *) mempcpy (cp, machstr, buf + len - cp - 1)) = '\0';
+	      break;
+	    }
+
+	  cp = mempcpy (cp, machstr, machstrlen);
+
+	  first = 0;
+	}
+      while (flags != 0);
+
+      res = buf;
+    }
+
+  return res;
+}
diff --git a/libebl/eblmachinesectionflagcheck.c b/libebl/eblmachinesectionflagcheck.c
new file mode 100644
index 0000000..a73b230
--- /dev/null
+++ b/libebl/eblmachinesectionflagcheck.c
@@ -0,0 +1,40 @@
+/* Check SHF_MASKPROC flags.
+   Copyright (C) 2007 Red Hat, Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libeblP.h>
+
+
+bool
+ebl_machine_section_flag_check (Ebl *ebl, GElf_Xword flags)
+{
+  return ebl != NULL ? ebl->machine_section_flag_check (flags) : (flags == 0);
+}
diff --git a/libebl/eblnonerelocp.c b/libebl/eblnonerelocp.c
new file mode 100644
index 0000000..e51a3b0
--- /dev/null
+++ b/libebl/eblnonerelocp.c
@@ -0,0 +1,41 @@
+/* Check whether given relocation is a no-op relocation.
+   Copyright (C) 2006 Red Hat, Inc.
+   This file is part of elfutils.
+   Written by Ulrich Drepper <drepper@redhat.com>, 2006.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libeblP.h>
+
+
+bool
+ebl_none_reloc_p (Ebl *ebl, int reloc)
+{
+  return ebl->none_reloc_p (reloc);
+}
diff --git a/libebl/eblnormalizepc.c b/libebl/eblnormalizepc.c
new file mode 100644
index 0000000..1629353
--- /dev/null
+++ b/libebl/eblnormalizepc.c
@@ -0,0 +1,41 @@
+/* Modify PC as fetched from inferior data into valid PC.
+   Copyright (C) 2013 Red Hat, Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libeblP.h>
+
+void
+ebl_normalize_pc (Ebl *ebl, Dwarf_Addr *pc)
+{
+  /* ebl is declared NN */
+  if (ebl->normalize_pc != NULL)
+    ebl->normalize_pc (ebl, pc);
+}
diff --git a/libebl/eblobjnote.c b/libebl/eblobjnote.c
new file mode 100644
index 0000000..ca4f155
--- /dev/null
+++ b/libebl/eblobjnote.c
@@ -0,0 +1,233 @@
+/* Print contents of object file note.
+   Copyright (C) 2002, 2007, 2009, 2011, 2015, 2016 Red Hat, Inc.
+   This file is part of elfutils.
+   Written by Ulrich Drepper <drepper@redhat.com>, 2002.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <inttypes.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <libeblP.h>
+
+
+void
+ebl_object_note (Ebl *ebl, const char *name, uint32_t type,
+		 uint32_t descsz, const char *desc)
+{
+  if (! ebl->object_note (name, type, descsz, desc))
+    {
+      /* The machine specific function did not know this type.  */
+
+      if (strcmp ("stapsdt", name) == 0)
+	{
+	  if (type != 3)
+	    {
+	      printf (gettext ("unknown SDT version %u\n"), type);
+	      return;
+	    }
+
+	  /* Descriptor starts with three addresses, pc, base ref and
+	     semaphore.  Then three zero terminated strings provider,
+	     name and arguments.  */
+
+	  union
+	  {
+	    Elf64_Addr a64[3];
+	    Elf32_Addr a32[3];
+	  } addrs;
+
+	  size_t addrs_size = gelf_fsize (ebl->elf, ELF_T_ADDR, 3, EV_CURRENT);
+	  if (descsz < addrs_size + 3)
+	    {
+	    invalid_sdt:
+	      printf (gettext ("invalid SDT probe descriptor\n"));
+	      return;
+	    }
+
+	  Elf_Data src =
+	    {
+	      .d_type = ELF_T_ADDR, .d_version = EV_CURRENT,
+	      .d_buf = (void *) desc, .d_size = addrs_size
+	    };
+
+	  Elf_Data dst =
+	    {
+	      .d_type = ELF_T_ADDR, .d_version = EV_CURRENT,
+	      .d_buf = &addrs, .d_size = addrs_size
+	    };
+
+	  if (gelf_xlatetom (ebl->elf, &dst, &src,
+			     elf_getident (ebl->elf, NULL)[EI_DATA]) == NULL)
+	    {
+	      printf ("%s\n", elf_errmsg (-1));
+	      return;
+	    }
+
+	  const char *provider = desc + addrs_size;
+	  const char *pname = memchr (provider, '\0', desc + descsz - provider);
+	  if (pname == NULL)
+	    goto invalid_sdt;
+
+	  ++pname;
+	  const char *args = memchr (pname, '\0', desc + descsz - pname);
+	  if (args == NULL ||
+	      memchr (++args, '\0', desc + descsz - pname) != desc + descsz - 1)
+	    goto invalid_sdt;
+
+	  GElf_Addr pc;
+	  GElf_Addr base;
+	  GElf_Addr sem;
+	  if (gelf_getclass (ebl->elf) == ELFCLASS32)
+	    {
+	      pc = addrs.a32[0];
+	      base = addrs.a32[1];
+	      sem = addrs.a32[2];
+	    }
+	  else
+	    {
+	      pc = addrs.a64[0];
+	      base = addrs.a64[1];
+	      sem = addrs.a64[2];
+	    }
+
+	  printf (gettext ("    PC: "));
+	  printf ("%#" PRIx64 ",", pc);
+	  printf (gettext (" Base: "));
+	  printf ("%#" PRIx64 ",", base);
+	  printf (gettext (" Semaphore: "));
+	  printf ("%#" PRIx64 "\n", sem);
+	  printf (gettext ("    Provider: "));
+	  printf ("%s,", provider);
+	  printf (gettext (" Name: "));
+	  printf ("%s,", pname);
+	  printf (gettext (" Args: "));
+	  printf ("'%s'\n", args);
+	  return;
+	}
+
+      switch (type)
+	{
+	case NT_GNU_BUILD_ID:
+	  if (strcmp (name, "GNU") == 0 && descsz > 0)
+	    {
+	      printf (gettext ("    Build ID: "));
+	      uint_fast32_t i;
+	      for (i = 0; i < descsz - 1; ++i)
+		printf ("%02" PRIx8, (uint8_t) desc[i]);
+	      printf ("%02" PRIx8 "\n", (uint8_t) desc[i]);
+	    }
+	  break;
+
+	case NT_GNU_GOLD_VERSION:
+	  if (strcmp (name, "GNU") == 0 && descsz > 0)
+	    /* A non-null terminated version string.  */
+	    printf (gettext ("    Linker version: %.*s\n"),
+		    (int) descsz, desc);
+	  break;
+
+	case NT_GNU_ABI_TAG:
+	  if (strcmp (name, "GNU") == 0 && descsz >= 8 && descsz % 4 == 0)
+	    {
+	      Elf_Data in =
+		{
+		  .d_version = EV_CURRENT,
+		  .d_type = ELF_T_WORD,
+		  .d_size = descsz,
+		  .d_buf = (void *) desc
+		};
+	      /* Normally NT_GNU_ABI_TAG is just 4 words (16 bytes).  If it
+		 is much (4*) larger dynamically allocate memory to convert.  */
+#define FIXED_TAG_BYTES 16
+	      uint32_t sbuf[FIXED_TAG_BYTES];
+	      uint32_t *buf;
+	      if (unlikely (descsz / 4 > FIXED_TAG_BYTES))
+		{
+		  buf = malloc (descsz);
+		  if (unlikely (buf == NULL))
+		    return;
+		}
+	      else
+		buf = sbuf;
+	      Elf_Data out =
+		{
+		  .d_version = EV_CURRENT,
+		  .d_type = ELF_T_WORD,
+		  .d_size = descsz,
+		  .d_buf = buf
+		};
+
+	      if (elf32_xlatetom (&out, &in, ebl->data) != NULL)
+		{
+		  const char *os;
+		  switch (buf[0])
+		    {
+		    case ELF_NOTE_OS_LINUX:
+		      os = "Linux";
+		      break;
+
+		    case ELF_NOTE_OS_GNU:
+		      os = "GNU";
+		      break;
+
+		    case ELF_NOTE_OS_SOLARIS2:
+		      os = "Solaris";
+		      break;
+
+		    case ELF_NOTE_OS_FREEBSD:
+		      os = "FreeBSD";
+		      break;
+
+		    default:
+		      os = "???";
+		      break;
+		    }
+
+		  printf (gettext ("    OS: %s, ABI: "), os);
+		  for (size_t cnt = 1; cnt < descsz / 4; ++cnt)
+		    {
+		      if (cnt > 1)
+			putchar_unlocked ('.');
+		      printf ("%" PRIu32, buf[cnt]);
+		    }
+		  putchar_unlocked ('\n');
+		}
+	      if (descsz / 4 > FIXED_TAG_BYTES)
+		free (buf);
+	      break;
+	    }
+	  FALLTHROUGH;
+
+	default:
+	  /* Unknown type.  */
+	  break;
+	}
+    }
+}
diff --git a/libebl/eblobjnotetypename.c b/libebl/eblobjnotetypename.c
new file mode 100644
index 0000000..db040d2
--- /dev/null
+++ b/libebl/eblobjnotetypename.c
@@ -0,0 +1,109 @@
+/* Return note type name.
+   Copyright (C) 2002, 2007, 2009, 2011, 2016 Red Hat, Inc.
+   This file is part of elfutils.
+   Written by Ulrich Drepper <drepper@redhat.com>, 2002.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <inttypes.h>
+#include <stdio.h>
+#include <string.h>
+#include <libeblP.h>
+
+
+const char *
+ebl_object_note_type_name (Ebl *ebl, const char *name, uint32_t type,
+			   char *buf, size_t len)
+{
+  const char *res = ebl->object_note_type_name (name, type, buf, len);
+
+  if (res == NULL)
+    {
+      if (strcmp (name, "stapsdt") == 0)
+	{
+	  snprintf (buf, len, "Version: %" PRIu32, type);
+	  return buf;
+	}
+
+#define ELF_NOTE_GOPKGLIST 1
+#define ELF_NOTE_GOABIHASH 2
+#define ELF_NOTE_GODEPS    3
+#define ELF_NOTE_GOBUILDID 4
+
+      static const char *goknowntypes[] =
+	{
+#define KNOWNSTYPE(name) [ELF_NOTE_GO##name] = #name
+	  KNOWNSTYPE (PKGLIST),
+	  KNOWNSTYPE (ABIHASH),
+	  KNOWNSTYPE (DEPS),
+	  KNOWNSTYPE (BUILDID),
+#undef KNOWNSTYPE
+	};
+
+      if (strcmp (name, "Go") == 0)
+	{
+	  if (type < sizeof (goknowntypes) / sizeof (goknowntypes[0])
+	      && goknowntypes[type] != NULL)
+	    return goknowntypes[type];
+	  else
+	    {
+	      snprintf (buf, len, "%s: %" PRIu32, gettext ("<unknown>"), type);
+	      return buf;
+	    }
+	}
+
+      if (strcmp (name, "GNU") != 0)
+	{
+	  snprintf (buf, len, "%s: %" PRIu32, gettext ("<unknown>"), type);
+	  return buf;
+	}
+
+      static const char *knowntypes[] =
+	{
+#define KNOWNSTYPE(name) [NT_##name] = #name
+	  KNOWNSTYPE (VERSION),
+	  KNOWNSTYPE (GNU_HWCAP),
+	  KNOWNSTYPE (GNU_BUILD_ID),
+	  KNOWNSTYPE (GNU_GOLD_VERSION),
+	};
+
+      /* Handle standard names.  */
+      if (type < sizeof (knowntypes) / sizeof (knowntypes[0])
+	  && knowntypes[type] != NULL)
+	res = knowntypes[type];
+      else
+	{
+	  snprintf (buf, len, "%s: %" PRIu32, gettext ("<unknown>"), type);
+
+	  res = buf;
+	}
+    }
+
+  return res;
+}
diff --git a/libebl/eblopenbackend.c b/libebl/eblopenbackend.c
new file mode 100644
index 0000000..1f81477
--- /dev/null
+++ b/libebl/eblopenbackend.c
@@ -0,0 +1,758 @@
+/* Generate ELF backend handle.
+   Copyright (C) 2000-2017 Red Hat, Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <assert.h>
+#include <dlfcn.h>
+#include <error.h>
+#include <libelfP.h>
+#include <dwarf.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <system.h>
+#include <libeblP.h>
+
+
+/* This table should contain the complete list of architectures as far
+   as the ELF specification is concerned.  */
+/* XXX When things are stable replace the string pointers with char
+   arrays to avoid relocations.  */
+static const struct
+{
+  const char *dsoname;
+  const char *emulation;
+  const char *prefix;
+  int prefix_len;
+  int em;
+  int class;
+  int data;
+} machines[] =
+{
+  { "i386", "elf_i386", "i386", 4, EM_386, ELFCLASS32, ELFDATA2LSB },
+  { "ia64", "elf_ia64", "ia64", 4, EM_IA_64, ELFCLASS64, ELFDATA2LSB },
+  { "alpha", "elf_alpha", "alpha", 5, EM_ALPHA, ELFCLASS64, ELFDATA2LSB },
+  { "x86_64", "elf_x86_64", "x86_64", 6, EM_X86_64, ELFCLASS64, ELFDATA2LSB },
+  { "ppc", "elf_ppc", "ppc", 3, EM_PPC, ELFCLASS32, ELFDATA2MSB },
+  { "ppc64", "elf_ppc64", "ppc64", 5, EM_PPC64, ELFCLASS64, ELFDATA2MSB },
+  { "tilegx", "elf_tilegx", "tilegx", 6, EM_TILEGX, ELFCLASS64, ELFDATA2LSB },
+  // XXX class and machine fields need to be filled in for all archs.
+  { "sh", "elf_sh", "sh", 2, EM_SH, 0, 0 },
+  { "arm", "ebl_arm", "arm", 3, EM_ARM, 0, 0 },
+  { "sparc", "elf_sparcv9", "sparc", 5, EM_SPARCV9, 0, 0 },
+  { "sparc", "elf_sparc", "sparc", 5, EM_SPARC, 0, 0 },
+  { "sparc", "elf_sparcv8plus", "sparc", 5, EM_SPARC32PLUS, 0, 0 },
+  { "s390", "ebl_s390", "s390", 4, EM_S390, 0, 0 },
+
+  { "m32", "elf_m32", "m32", 3, EM_M32, 0, 0 },
+  { "m68k", "elf_m68k", "m68k", 4, EM_68K, ELFCLASS32, ELFDATA2MSB },
+  { "m88k", "elf_m88k", "m88k", 4, EM_88K, 0, 0 },
+  { "i860", "elf_i860", "i860", 4, EM_860, 0, 0 },
+  { "s370", "ebl_s370", "s370", 4, EM_S370, 0, 0 },
+  { "parisc", "elf_parisc", "parisc", 6, EM_PARISC, 0, 0 },
+  { "vpp500", "elf_vpp500", "vpp500", 5, EM_VPP500, 0, 0 },
+  { "sparc", "elf_v8plus", "v8plus", 6, EM_SPARC32PLUS, 0, 0 },
+  { "i960", "elf_i960", "i960", 4, EM_960, 0, 0 },
+  { "v800", "ebl_v800", "v800", 4, EM_V800, 0, 0 },
+  { "fr20", "ebl_fr20", "fr20", 4, EM_FR20, 0, 0 },
+  { "rh32", "ebl_rh32", "rh32", 4, EM_RH32, 0, 0 },
+  { "rce", "ebl_rce", "rce", 3, EM_RCE, 0, 0 },
+  { "tricore", "elf_tricore", "tricore", 7, EM_TRICORE, 0, 0 },
+  { "arc", "elf_arc", "arc", 3, EM_ARC, 0, 0 },
+  { "h8", "elf_h8_300", "h8_300", 6, EM_H8_300, 0, 0 },
+  { "h8", "elf_h8_300h", "h8_300h", 6, EM_H8_300H, 0, 0 },
+  { "h8", "elf_h8s", "h8s", 6, EM_H8S, 0, 0 },
+  { "h8", "elf_h8_500", "h8_500", 6, EM_H8_500, 0, 0 },
+  { "coldfire", "elf_coldfire", "coldfire", 8, EM_COLDFIRE, 0, 0 },
+  { "m68k", "elf_68hc12", "68hc12", 6, EM_68HC12, 0, 0 },
+  { "mma", "elf_mma", "mma", 3, EM_MMA, 0, 0 },
+  { "pcp", "elf_pcp", "pcp", 3, EM_PCP, 0, 0 },
+  { "ncpu", "elf_ncpu", "ncpu", 4, EM_NCPU, 0, 0 },
+  { "ndr1", "elf_ndr1", "ndr1", 4, EM_NDR1, 0, 0 },
+  { "starcore", "elf_starcore", "starcore", 8, EM_STARCORE, 0, 0 },
+  { "me16", "elf_me16", "em16", 4, EM_ME16, 0, 0 },
+  { "st100", "elf_st100", "st100", 5, EM_ST100, 0, 0 },
+  { "tinyj", "elf_tinyj", "tinyj", 5, EM_TINYJ, 0, 0 },
+  { "pdsp", "elf_pdsp", "pdsp", 4, EM_PDSP, 0, 0 },
+  { "fx66", "elf_fx66", "fx66", 4, EM_FX66, 0, 0 },
+  { "st9plus", "elf_st9plus", "st9plus", 7, EM_ST9PLUS, 0, 0 },
+  { "st7", "elf_st7", "st7", 3, EM_ST7, 0, 0 },
+  { "m68k", "elf_68hc16", "68hc16", 6, EM_68HC16, 0, 0 },
+  { "m68k", "elf_68hc11", "68hc11", 6, EM_68HC11, 0, 0 },
+  { "m68k", "elf_68hc08", "68hc08", 6, EM_68HC08, 0, 0 },
+  { "m68k", "elf_68hc05", "68hc05", 6, EM_68HC05, 0, 0 },
+  { "svx", "elf_svx", "svx", 3, EM_SVX, 0, 0 },
+  { "st19", "elf_st19", "st19", 4, EM_ST19, 0, 0 },
+  { "vax", "elf_vax", "vax", 3, EM_VAX, 0, 0 },
+  { "cris", "elf_cris", "cris", 4, EM_CRIS, 0, 0 },
+  { "javelin", "elf_javelin", "javelin", 7, EM_JAVELIN, 0, 0 },
+  { "firepath", "elf_firepath", "firepath", 8, EM_FIREPATH, 0, 0 },
+  { "zsp", "elf_zsp", "zsp", 3, EM_ZSP, 0, 0 },
+  { "mmix", "elf_mmix", "mmix", 4, EM_MMIX, 0, 0 },
+  { "hunay", "elf_huany", "huany", 5, EM_HUANY, 0, 0 },
+  { "prism", "elf_prism", "prism", 5, EM_PRISM, 0, 0 },
+  { "avr", "elf_avr", "avr", 3, EM_AVR, 0, 0 },
+  { "fr30", "elf_fr30", "fr30", 4, EM_FR30, 0, 0 },
+  { "dv10", "elf_dv10", "dv10", 4, EM_D10V, 0, 0 },
+  { "dv30", "elf_dv30", "dv30", 4, EM_D30V, 0, 0 },
+  { "v850", "elf_v850", "v850", 4, EM_V850, 0, 0 },
+  { "m32r", "elf_m32r", "m32r", 4, EM_M32R, 0, 0 },
+  { "mn10300", "elf_mn10300", "mn10300", 7, EM_MN10300, 0, 0 },
+  { "mn10200", "elf_mn10200", "mn10200", 7, EM_MN10200, 0, 0 },
+  { "pj", "elf_pj", "pj", 2, EM_PJ, 0, 0 },
+  { "openrisc", "elf_openrisc", "openrisc", 8, EM_OPENRISC, 0, 0 },
+  { "arc", "elf_arc_a5", "arc_a5", 6, EM_ARC_A5, 0, 0 },
+  { "xtensa", "elf_xtensa", "xtensa", 6, EM_XTENSA, 0, 0 },
+  { "aarch64", "elf_aarch64", "aarch64", 7, EM_AARCH64, ELFCLASS64, 0 },
+  { "bpf", "elf_bpf", "bpf", 3, EM_BPF, 0, 0 },
+};
+#define nmachines (sizeof (machines) / sizeof (machines[0]))
+
+/* No machine prefix should be larger than this.  */
+#define MAX_PREFIX_LEN 16
+
+/* Default callbacks.  Mostly they just return the error value.  */
+static const char *default_reloc_type_name (int ignore, char *buf, size_t len);
+static bool default_reloc_type_check (int ignore);
+static bool default_reloc_valid_use (Elf *elf, int ignore);
+static Elf_Type default_reloc_simple_type (Ebl *ebl, int ignore);
+static bool default_gotpc_reloc_check (Elf *elf, int ignore);
+static const char *default_segment_type_name (int ignore, char *buf,
+					      size_t len);
+static const char *default_section_type_name (int ignore, char *buf,
+					      size_t len);
+static const char *default_section_name (int ignore, int ignore2, char *buf,
+					 size_t len);
+static const char *default_machine_flag_name (Elf64_Word *ignore);
+static bool default_machine_flag_check (Elf64_Word flags);
+static bool default_machine_section_flag_check (GElf_Xword flags);
+static const char *default_symbol_type_name (int ignore, char *buf,
+					     size_t len);
+static const char *default_symbol_binding_name (int ignore, char *buf,
+						size_t len);
+static const char *default_dynamic_tag_name (int64_t ignore, char *buf,
+					     size_t len);
+static bool default_dynamic_tag_check (int64_t ignore);
+static const char *default_osabi_name (int ignore, char *buf, size_t len);
+static void default_destr (struct ebl *ignore);
+static const char *default_core_note_type_name (uint32_t, char *buf,
+						size_t len);
+static const char *default_object_note_type_name (const char *name, uint32_t,
+						  char *buf, size_t len);
+static int default_core_note (const GElf_Nhdr *nhdr, const char *name,
+			      GElf_Word *regs_offset, size_t *nregloc,
+			      const Ebl_Register_Location **reglocs,
+			      size_t *nitems, const Ebl_Core_Item **);
+static int default_auxv_info (GElf_Xword a_type,
+			      const char **name, const char **format);
+static bool default_object_note (const char *name, uint32_t type,
+				 uint32_t descsz, const char *desc);
+static bool default_debugscn_p (const char *name);
+static bool default_copy_reloc_p (int reloc);
+static bool default_none_reloc_p (int reloc);
+static bool default_relative_reloc_p (int reloc);
+static bool default_check_special_symbol (Elf *elf, GElf_Ehdr *ehdr,
+					  const GElf_Sym *sym,
+					  const char *name,
+					  const GElf_Shdr *destshdr);
+static bool default_data_marker_symbol (const GElf_Sym *sym, const char *sname);
+static bool default_check_st_other_bits (unsigned char st_other);
+static bool default_check_special_section (Ebl *, int,
+					   const GElf_Shdr *, const char *);
+static bool default_bss_plt_p (Elf *elf);
+static int default_return_value_location (Dwarf_Die *functypedie,
+					  const Dwarf_Op **locops);
+static ssize_t default_register_info (Ebl *ebl,
+				      int regno, char *name, size_t namelen,
+				      const char **prefix,
+				      const char **setname,
+				      int *bits, int *type);
+static int default_syscall_abi (Ebl *ebl, int *sp, int *pc,
+				int *callno, int args[6]);
+static bool default_check_object_attribute (Ebl *ebl, const char *vendor,
+					    int tag, uint64_t value,
+					    const char **tag_name,
+					    const char **value_name);
+static bool default_check_reloc_target_type (Ebl *ebl, Elf64_Word sh_type);
+static int default_abi_cfi (Ebl *ebl, Dwarf_CIE *abi_info);
+
+
+static void
+fill_defaults (Ebl *result)
+{
+  result->reloc_type_name = default_reloc_type_name;
+  result->reloc_type_check = default_reloc_type_check;
+  result->reloc_valid_use = default_reloc_valid_use;
+  result->reloc_simple_type = default_reloc_simple_type;
+  result->gotpc_reloc_check = default_gotpc_reloc_check;
+  result->segment_type_name = default_segment_type_name;
+  result->section_type_name = default_section_type_name;
+  result->section_name = default_section_name;
+  result->machine_flag_name = default_machine_flag_name;
+  result->machine_flag_check = default_machine_flag_check;
+  result->machine_section_flag_check = default_machine_section_flag_check;
+  result->check_special_section = default_check_special_section;
+  result->symbol_type_name = default_symbol_type_name;
+  result->symbol_binding_name = default_symbol_binding_name;
+  result->dynamic_tag_name = default_dynamic_tag_name;
+  result->dynamic_tag_check = default_dynamic_tag_check;
+  result->osabi_name = default_osabi_name;
+  result->core_note_type_name = default_core_note_type_name;
+  result->object_note_type_name = default_object_note_type_name;
+  result->core_note = default_core_note;
+  result->auxv_info = default_auxv_info;
+  result->object_note = default_object_note;
+  result->debugscn_p = default_debugscn_p;
+  result->copy_reloc_p = default_copy_reloc_p;
+  result->none_reloc_p = default_none_reloc_p;
+  result->relative_reloc_p = default_relative_reloc_p;
+  result->check_special_symbol = default_check_special_symbol;
+  result->data_marker_symbol = default_data_marker_symbol;
+  result->check_st_other_bits = default_check_st_other_bits;
+  result->bss_plt_p = default_bss_plt_p;
+  result->return_value_location = default_return_value_location;
+  result->register_info = default_register_info;
+  result->syscall_abi = default_syscall_abi;
+  result->check_object_attribute = default_check_object_attribute;
+  result->check_reloc_target_type = default_check_reloc_target_type;
+  result->disasm = NULL;
+  result->abi_cfi = default_abi_cfi;
+  result->destr = default_destr;
+  result->sysvhash_entrysize = sizeof (Elf32_Word);
+}
+
+
+/* Find an appropriate backend for the file associated with ELF.  */
+static Ebl *
+openbackend (Elf *elf, const char *emulation, GElf_Half machine)
+{
+  Ebl *result;
+  size_t cnt;
+
+  /* First allocate the data structure for the result.  We do this
+     here since this assures that the structure is always large
+     enough.  */
+  result = (Ebl *) calloc (1, sizeof (Ebl));
+  if (result == NULL)
+    {
+      // XXX uncomment
+      // __libebl_seterror (ELF_E_NOMEM);
+      return NULL;
+    }
+
+  /* Fill in the default callbacks.  The initializer for the machine
+     specific module can overwrite the values.  */
+  fill_defaults (result);
+
+  /* XXX Currently all we do is to look at 'e_machine' value in the
+     ELF header.  With an internal mapping table from EM_* value to
+     DSO name we try to load the appropriate module to handle this
+     binary type.
+
+     Multiple modules for the same machine type are possible and they
+     will be tried in sequence.  The lookup process will only stop
+     when a module which can handle the machine type is found or all
+     available matching modules are tried.  */
+  for (cnt = 0; cnt < nmachines; ++cnt)
+    if ((emulation != NULL && strcmp (emulation, machines[cnt].emulation) == 0)
+	|| (emulation == NULL && machines[cnt].em == machine))
+      {
+	/* Well, we know the emulation name now.  */
+	result->emulation = machines[cnt].emulation;
+
+	/* We access some data structures directly.  Make sure the 32 and
+	   64 bit variants are laid out the same.  */
+	assert (offsetof (Elf32_Ehdr, e_machine)
+		== offsetof (Elf64_Ehdr, e_machine));
+	assert (sizeof (((Elf32_Ehdr *) 0)->e_machine)
+		== sizeof (((Elf64_Ehdr *) 0)->e_machine));
+	assert (offsetof (Elf, state.elf32.ehdr)
+		== offsetof (Elf, state.elf64.ehdr));
+
+	/* Prefer taking the information from the ELF file.  */
+	if (elf == NULL)
+	  {
+	    result->machine = machines[cnt].em;
+	    result->class = machines[cnt].class;
+	    result->data = machines[cnt].data;
+	  }
+	else
+	  {
+	    result->machine = elf->state.elf32.ehdr->e_machine;
+	    result->class = elf->state.elf32.ehdr->e_ident[EI_CLASS];
+	    result->data = elf->state.elf32.ehdr->e_ident[EI_DATA];
+	  }
+
+#ifndef LIBEBL_SUBDIR
+# define LIBEBL_SUBDIR PACKAGE
+#endif
+#define ORIGINDIR "$ORIGIN/../$LIB/" LIBEBL_SUBDIR "/"
+
+	/* Give it a try.  At least the machine type matches.  First
+           try to load the module.  */
+	char dsoname[100];
+	strcpy (stpcpy (stpcpy (dsoname, ORIGINDIR "libebl_"),
+			machines[cnt].dsoname),
+		".so");
+
+	void *h = dlopen (dsoname, RTLD_LAZY);
+	if (h == NULL)
+	  {
+	    strcpy (stpcpy (stpcpy (dsoname, "libebl_"),
+			    machines[cnt].dsoname),
+		    ".so");
+	    h = dlopen (dsoname, RTLD_LAZY);
+	  }
+
+	  /* Try without an explicit path.  */
+	if (h != NULL)
+	  {
+	    /* We managed to load the object.  Now see whether the
+	       initialization function likes our file.  */
+	    static const char version[] = MODVERSION;
+	    const char *modversion;
+	    ebl_bhinit_t initp;
+
+	    // We use a static number to help the compiler see we don't
+	    // overflow the stack with an arbitrary number.
+	    assert (machines[cnt].prefix_len <= MAX_PREFIX_LEN);
+	    char symname[MAX_PREFIX_LEN + sizeof "_init"];
+
+	    strcpy (mempcpy (symname, machines[cnt].prefix,
+			     machines[cnt].prefix_len), "_init");
+
+	    initp = (ebl_bhinit_t) dlsym (h, symname);
+	    if (initp != NULL
+		&& (modversion = initp (elf, machine, result, sizeof (Ebl)))
+		&& strcmp (version, modversion) == 0)
+	      {
+		/* We found a module to handle our file.  */
+		result->dlhandle = h;
+		result->elf = elf;
+
+		/* A few entries are mandatory.  */
+		assert (result->name != NULL);
+		assert (result->destr != NULL);
+
+		return result;
+	      }
+
+	    /* Not the module we need.  */
+	    (void) dlclose (h);
+	  }
+
+	/* We cannot find a DSO but the emulation/machine ID matches.
+	   Return that information.  */
+	result->dlhandle = NULL;
+	result->elf = elf;
+	result->name = machines[cnt].prefix;
+	fill_defaults (result);
+
+	return result;
+      }
+
+  /* Nothing matched.  We use only the default callbacks.   */
+  result->dlhandle = NULL;
+  result->elf = elf;
+  result->emulation = "<unknown>";
+  result->name = "<unknown>";
+  fill_defaults (result);
+
+  return result;
+}
+
+
+/* Find an appropriate backend for the file associated with ELF.  */
+Ebl *
+ebl_openbackend (Elf *elf)
+{
+  GElf_Ehdr ehdr_mem;
+  GElf_Ehdr *ehdr;
+
+  /* Get the ELF header of the object.  */
+  ehdr = gelf_getehdr (elf, &ehdr_mem);
+  if (ehdr == NULL)
+    {
+      // XXX uncomment
+      // __libebl_seterror (elf_errno ());
+      return NULL;
+    }
+
+  return openbackend (elf, NULL, ehdr->e_machine);
+}
+
+
+/* Find backend without underlying ELF file.  */
+Ebl *
+ebl_openbackend_machine (GElf_Half machine)
+{
+  return openbackend (NULL, NULL, machine);
+}
+
+
+/* Find backend with given emulation name.  */
+Ebl *
+ebl_openbackend_emulation (const char *emulation)
+{
+  return openbackend (NULL, emulation, EM_NONE);
+}
+
+
+/* Default callbacks.  Mostly they just return the error value.  */
+static const char *
+default_reloc_type_name (int ignore __attribute__ ((unused)),
+			 char *buf __attribute__ ((unused)),
+			 size_t len __attribute__ ((unused)))
+{
+  return NULL;
+}
+
+static bool
+default_reloc_type_check (int ignore __attribute__ ((unused)))
+{
+  return false;
+}
+
+static bool
+default_reloc_valid_use (Elf *elf __attribute__ ((unused)),
+			 int ignore __attribute__ ((unused)))
+{
+  return false;
+}
+
+static Elf_Type
+default_reloc_simple_type (Ebl *eh __attribute__ ((unused)),
+			   int ignore __attribute__ ((unused)))
+{
+  return ELF_T_NUM;
+}
+
+static bool
+default_gotpc_reloc_check (Elf *elf __attribute__ ((unused)),
+			   int ignore __attribute__ ((unused)))
+{
+  return false;
+}
+
+static const char *
+default_segment_type_name (int ignore __attribute__ ((unused)),
+			   char *buf __attribute__ ((unused)),
+			   size_t len __attribute__ ((unused)))
+{
+  return NULL;
+}
+
+static const char *
+default_section_type_name (int ignore __attribute__ ((unused)),
+			   char *buf __attribute__ ((unused)),
+			   size_t len __attribute__ ((unused)))
+{
+  return NULL;
+}
+
+static const char *
+default_section_name (int ignore __attribute__ ((unused)),
+		      int ignore2 __attribute__ ((unused)),
+		      char *buf __attribute__ ((unused)),
+		      size_t len __attribute__ ((unused)))
+{
+  return NULL;
+}
+
+static const char *
+default_machine_flag_name (Elf64_Word *ignore __attribute__ ((unused)))
+{
+  return NULL;
+}
+
+static bool
+default_machine_flag_check (Elf64_Word flags __attribute__ ((unused)))
+{
+  return flags == 0;
+}
+
+static bool
+default_machine_section_flag_check (GElf_Xword flags)
+{
+  return flags == 0;
+}
+
+static bool
+default_check_special_section (Ebl *ebl __attribute__ ((unused)),
+			       int ndx __attribute__ ((unused)),
+			       const GElf_Shdr *shdr __attribute__ ((unused)),
+			       const char *sname __attribute__ ((unused)))
+{
+  return false;
+}
+
+static const char *
+default_symbol_type_name (int ignore __attribute__ ((unused)),
+			  char *buf __attribute__ ((unused)),
+			  size_t len __attribute__ ((unused)))
+{
+  return NULL;
+}
+
+static const char *
+default_symbol_binding_name (int ignore __attribute__ ((unused)),
+			     char *buf __attribute__ ((unused)),
+			     size_t len __attribute__ ((unused)))
+{
+  return NULL;
+}
+
+static const char *
+default_dynamic_tag_name (int64_t ignore __attribute__ ((unused)),
+			  char *buf __attribute__ ((unused)),
+			  size_t len __attribute__ ((unused)))
+{
+  return NULL;
+}
+
+static bool
+default_dynamic_tag_check (int64_t ignore __attribute__ ((unused)))
+{
+  return false;
+}
+
+static void
+default_destr (struct ebl *ignore __attribute__ ((unused)))
+{
+}
+
+static const char *
+default_osabi_name (int ignore __attribute__ ((unused)),
+		    char *buf __attribute__ ((unused)),
+		    size_t len __attribute__ ((unused)))
+{
+  return NULL;
+}
+
+static const char *
+default_core_note_type_name (uint32_t ignore __attribute__ ((unused)),
+			     char *buf __attribute__ ((unused)),
+			     size_t len __attribute__ ((unused)))
+{
+  return NULL;
+}
+
+static int
+default_auxv_info (GElf_Xword a_type __attribute__ ((unused)),
+		   const char **name __attribute__ ((unused)),
+		   const char **format __attribute__ ((unused)))
+{
+  return 0;
+}
+
+static int
+default_core_note (const GElf_Nhdr *nhdr __attribute__ ((unused)),
+		   const char *name __attribute__ ((unused)),
+		   GElf_Word *ro __attribute__ ((unused)),
+		   size_t *nregloc  __attribute__ ((unused)),
+		   const Ebl_Register_Location **reglocs
+		   __attribute__ ((unused)),
+		   size_t *nitems __attribute__ ((unused)),
+		   const Ebl_Core_Item **items __attribute__ ((unused)))
+{
+  return 0;
+}
+
+static const char *
+default_object_note_type_name (const char *name __attribute__ ((unused)),
+			       uint32_t ignore __attribute__ ((unused)),
+			       char *buf __attribute__ ((unused)),
+			       size_t len __attribute__ ((unused)))
+{
+  return NULL;
+}
+
+static bool
+default_object_note (const char *name __attribute__ ((unused)),
+		     uint32_t type __attribute__ ((unused)),
+		     uint32_t descsz __attribute__ ((unused)),
+		     const char *desc __attribute__ ((unused)))
+{
+  return NULL;
+}
+
+static bool
+default_debugscn_p (const char *name)
+{
+  /* We know by default only about the DWARF debug sections which have
+     fixed names.  */
+  static const char *dwarf_scn_names[] =
+    {
+      /* DWARF 1 */
+      ".debug",
+      ".line",
+      /* GNU DWARF 1 extensions */
+      ".debug_srcinfo",
+      ".debug_sfnames",
+      /* DWARF 1.1 and DWARF 2 */
+      ".debug_aranges",
+      ".debug_pubnames",
+      /* DWARF 2 */
+      ".debug_info",
+      ".debug_abbrev",
+      ".debug_line",
+      ".debug_frame",
+      ".debug_str",
+      ".debug_loc",
+      ".debug_macinfo",
+      /* DWARF 3 */
+      ".debug_ranges",
+      ".debug_pubtypes",
+      /* DWARF 4 */
+      ".debug_types",
+      /* GDB DWARF 4 extension */
+      ".gdb_index",
+      /* GNU/DWARF 5 extension/proposal */
+      ".debug_macro",
+      /* SGI/MIPS DWARF 2 extensions */
+      ".debug_weaknames",
+      ".debug_funcnames",
+      ".debug_typenames",
+      ".debug_varnames"
+    };
+  const size_t ndwarf_scn_names = (sizeof (dwarf_scn_names)
+				   / sizeof (dwarf_scn_names[0]));
+  for (size_t cnt = 0; cnt < ndwarf_scn_names; ++cnt)
+    if (strcmp (name, dwarf_scn_names[cnt]) == 0
+	|| (strncmp (name, ".zdebug", strlen (".zdebug")) == 0
+	    && strcmp (&name[2], &dwarf_scn_names[cnt][1]) == 0))
+      return true;
+
+  return false;
+}
+
+static bool
+default_copy_reloc_p (int reloc __attribute__ ((unused)))
+{
+  return false;
+}
+strong_alias (default_copy_reloc_p, default_none_reloc_p)
+strong_alias (default_copy_reloc_p, default_relative_reloc_p)
+
+static bool
+default_check_special_symbol (Elf *elf __attribute__ ((unused)),
+			      GElf_Ehdr *ehdr __attribute__ ((unused)),
+			      const GElf_Sym *sym __attribute__ ((unused)),
+			      const char *name __attribute__ ((unused)),
+			      const GElf_Shdr *destshdr __attribute__ ((unused)))
+{
+  return false;
+}
+
+static bool
+default_data_marker_symbol (const GElf_Sym *sym __attribute__ ((unused)),
+			    const char *sname __attribute__ ((unused)))
+{
+  return false;
+}
+
+static bool
+default_check_st_other_bits (unsigned char st_other __attribute__ ((unused)))
+{
+  return false;
+}
+
+
+static bool
+default_bss_plt_p (Elf *elf __attribute__ ((unused)))
+{
+  return false;
+}
+
+static int
+default_return_value_location (Dwarf_Die *functypedie __attribute__ ((unused)),
+			       const Dwarf_Op **locops __attribute__ ((unused)))
+{
+  return -2;
+}
+
+static ssize_t
+default_register_info (Ebl *ebl __attribute__ ((unused)),
+		       int regno, char *name, size_t namelen,
+		       const char **prefix,
+		       const char **setname,
+		       int *bits, int *type)
+{
+  if (name == NULL)
+    return 0;
+
+  *setname = "???";
+  *prefix = "";
+  *bits = -1;
+  *type = DW_ATE_void;
+  return snprintf (name, namelen, "reg%d", regno);
+}
+
+static int
+default_syscall_abi (Ebl *ebl __attribute__ ((unused)),
+		     int *sp, int *pc, int *callno, int args[6])
+{
+  *sp = *pc = *callno = -1;
+  args[0] = -1;
+  args[1] = -1;
+  args[2] = -1;
+  args[3] = -1;
+  args[4] = -1;
+  args[5] = -1;
+  return -1;
+}
+
+static bool
+default_check_object_attribute (Ebl *ebl __attribute__ ((unused)),
+				const char *vendor  __attribute__ ((unused)),
+				int tag __attribute__ ((unused)),
+				uint64_t value __attribute__ ((unused)),
+				const char **tag_name, const char **value_name)
+{
+  *tag_name = NULL;
+  *value_name = NULL;
+  return false;
+}
+
+static bool
+default_check_reloc_target_type (Ebl *ebl __attribute__ ((unused)),
+				 Elf64_Word sh_type __attribute__ ((unused)))
+{
+  return false;
+}
+
+static int
+default_abi_cfi (Ebl *ebl __attribute__ ((unused)),
+		 Dwarf_CIE *abi_info __attribute__ ((unused)))
+{
+  return -1;
+}
diff --git a/libebl/eblosabiname.c b/libebl/eblosabiname.c
new file mode 100644
index 0000000..b60f2af
--- /dev/null
+++ b/libebl/eblosabiname.c
@@ -0,0 +1,80 @@
+/* Return OS ABI name
+   Copyright (C) 2001, 2002 Red Hat, Inc.
+   This file is part of elfutils.
+   Written by Ulrich Drepper <drepper@redhat.com>, 2001.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <libeblP.h>
+
+
+const char *
+ebl_osabi_name (Ebl *ebl, int osabi, char *buf, size_t len)
+{
+  const char *res = ebl != NULL ? ebl->osabi_name (osabi, buf, len) : NULL;
+
+  if (res == NULL)
+    {
+      if (osabi == ELFOSABI_NONE)
+	res = "UNIX - System V";
+      else if (osabi == ELFOSABI_HPUX)
+	res = "HP/UX";
+      else if (osabi == ELFOSABI_NETBSD)
+	res = "NetBSD";
+      else if (osabi == ELFOSABI_LINUX)
+	res = "Linux";
+      else if (osabi == ELFOSABI_SOLARIS)
+	res = "Solaris";
+      else if (osabi == ELFOSABI_AIX)
+	res = "AIX";
+      else if (osabi == ELFOSABI_IRIX)
+	res = "Irix";
+      else if (osabi == ELFOSABI_FREEBSD)
+	res = "FreeBSD";
+      else if (osabi == ELFOSABI_TRU64)
+	res = "TRU64";
+      else if (osabi == ELFOSABI_MODESTO)
+	res = "Modesto";
+      else if (osabi == ELFOSABI_OPENBSD)
+	res = "OpenBSD";
+      else if (osabi == ELFOSABI_ARM)
+	res = "Arm";
+      else if (osabi == ELFOSABI_STANDALONE)
+	res = gettext ("Stand alone");
+      else
+	{
+	  snprintf (buf, len, "%s: %d", gettext ("<unknown>"), osabi);
+
+	  res = buf;
+	}
+    }
+
+  return res;
+}
diff --git a/libebl/eblreginfo.c b/libebl/eblreginfo.c
new file mode 100644
index 0000000..acc4849
--- /dev/null
+++ b/libebl/eblreginfo.c
@@ -0,0 +1,44 @@
+/* Return register name information.
+   Copyright (C) 2005, 2006 Red Hat, Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <inttypes.h>
+#include <libeblP.h>
+
+
+ssize_t
+ebl_register_info (Ebl *ebl, int regno, char *name, size_t namelen,
+		   const char **prefix, const char **setname,
+		   int *bits, int *type)
+{
+  return ebl == NULL ? -1 : ebl->register_info (ebl, regno, name, namelen,
+						prefix, setname, bits, type);
+}
diff --git a/libebl/eblrelativerelocp.c b/libebl/eblrelativerelocp.c
new file mode 100644
index 0000000..51f5dce
--- /dev/null
+++ b/libebl/eblrelativerelocp.c
@@ -0,0 +1,41 @@
+/* Check whether given relocation is a relative relocation.
+   Copyright (C) 2006 Red Hat, Inc.
+   This file is part of elfutils.
+   Written by Ulrich Drepper <drepper@redhat.com>, 2006.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libeblP.h>
+
+
+bool
+ebl_relative_reloc_p (Ebl *ebl, int reloc)
+{
+  return ebl->relative_reloc_p (reloc);
+}
diff --git a/libebl/eblrelocsimpletype.c b/libebl/eblrelocsimpletype.c
new file mode 100644
index 0000000..9bd2928
--- /dev/null
+++ b/libebl/eblrelocsimpletype.c
@@ -0,0 +1,40 @@
+/* Check relocation type for simple types.
+   Copyright (C) 2005 Red Hat, Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libeblP.h>
+
+
+Elf_Type
+ebl_reloc_simple_type (Ebl *ebl, int reloc)
+{
+  return ebl != NULL ? ebl->reloc_simple_type (ebl, reloc) : ELF_T_NUM;
+}
diff --git a/libebl/eblreloctypecheck.c b/libebl/eblreloctypecheck.c
new file mode 100644
index 0000000..80e67ef
--- /dev/null
+++ b/libebl/eblreloctypecheck.c
@@ -0,0 +1,41 @@
+/* Check relocation type.
+   Copyright (C) 2001, 2002 Red Hat, Inc.
+   This file is part of elfutils.
+   Written by Ulrich Drepper <drepper@redhat.com>, 2001.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libeblP.h>
+
+
+bool
+ebl_reloc_type_check (Ebl *ebl, int reloc)
+{
+  return ebl != NULL ? ebl->reloc_type_check (reloc) : false;
+}
diff --git a/libebl/eblreloctypename.c b/libebl/eblreloctypename.c
new file mode 100644
index 0000000..e53ec0c
--- /dev/null
+++ b/libebl/eblreloctypename.c
@@ -0,0 +1,49 @@
+/* Return relocation type name.
+   Copyright (C) 2001, 2002, 2009 Red Hat, Inc.
+   This file is part of elfutils.
+   Written by Ulrich Drepper <drepper@redhat.com>, 2001.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <libeblP.h>
+
+
+const char *
+ebl_reloc_type_name (Ebl *ebl, int reloc, char *buf, size_t len)
+{
+  const char *res;
+
+  res = ebl != NULL ? ebl->reloc_type_name (reloc, buf, len) : NULL;
+  if (res == NULL)
+    /* There are no generic relocation type names.  */
+    res = "<INVALID RELOC>";
+
+  return res;
+}
diff --git a/libebl/eblrelocvaliduse.c b/libebl/eblrelocvaliduse.c
new file mode 100644
index 0000000..f0bed34
--- /dev/null
+++ b/libebl/eblrelocvaliduse.c
@@ -0,0 +1,41 @@
+/* Check relocation type use.
+   Copyright (C) 2003 Red Hat, Inc.
+   This file is part of elfutils.
+   Written by Ulrich Drepper <drepper@redhat.com>, 2003.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libeblP.h>
+
+
+bool
+ebl_reloc_valid_use (Ebl *ebl, int reloc)
+{
+  return ebl != NULL ? ebl->reloc_valid_use (ebl->elf, reloc) : false;
+}
diff --git a/libebl/eblresolvesym.c b/libebl/eblresolvesym.c
new file mode 100644
index 0000000..470f6f0
--- /dev/null
+++ b/libebl/eblresolvesym.c
@@ -0,0 +1,43 @@
+/* Resolve a symbol value to an allocated section of the Elf file.
+   Copyright (C) 2013 Red Hat, Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libeblP.h>
+#include <assert.h>
+
+bool
+ebl_resolve_sym_value (Ebl *ebl, GElf_Addr *addr)
+{
+  if (ebl == NULL || ebl->resolve_sym_value == NULL)
+    return false;
+
+  return ebl->resolve_sym_value (ebl, addr);
+}
diff --git a/libebl/eblretval.c b/libebl/eblretval.c
new file mode 100644
index 0000000..7c03982
--- /dev/null
+++ b/libebl/eblretval.c
@@ -0,0 +1,42 @@
+/* Return location expression to find return value given a function type DIE.
+   Copyright (C) 2005 Red Hat, Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <inttypes.h>
+#include <libeblP.h>
+
+
+int
+ebl_return_value_location (Ebl *ebl, Dwarf_Die *functypedie,
+			   const Dwarf_Op **locops)
+{
+  return ebl == NULL ? -1 : ebl->return_value_location (functypedie, locops);
+}
diff --git a/libebl/eblsectionname.c b/libebl/eblsectionname.c
new file mode 100644
index 0000000..21c537f
--- /dev/null
+++ b/libebl/eblsectionname.c
@@ -0,0 +1,90 @@
+/* Return section name.
+   Copyright (C) 2001, 2002, 2004 Red Hat, Inc.
+   This file is part of elfutils.
+   Written by Ulrich Drepper <drepper@redhat.com>, 2001.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <libeblP.h>
+
+
+const char *
+ebl_section_name (Ebl *ebl, int section, int xsection, char *buf, size_t len,
+		  const char *scnnames[], size_t shnum)
+{
+  const char *res = ebl != NULL ? ebl->section_name (section, xsection,
+						     buf, len) : NULL;
+
+  if (res == NULL)
+    {
+      if (section == SHN_UNDEF)
+	res = "UNDEF";
+      else if (section == SHN_ABS)
+	res = "ABS";
+      else if (section == SHN_COMMON)
+	res = "COMMON";
+      else if (section == SHN_BEFORE)
+	res = "BEFORE";
+      else if (section == SHN_AFTER)
+	res = "AFTER";
+      else if ((section < SHN_LORESERVE || section == SHN_XINDEX)
+	       && (size_t) section < shnum)
+	{
+	  int idx = section != SHN_XINDEX ? section : xsection;
+
+	  if (scnnames != NULL)
+	    res = scnnames[idx];
+	  else
+	    {
+	      snprintf (buf, len, "%d", idx);
+	      res = buf;
+	    }
+	}
+      else
+	{
+	  /* Handle OS-specific section names.  */
+	  if (section == SHN_XINDEX)
+	    snprintf (buf, len, "%s: %d", "XINDEX", xsection);
+	  else if (section >= SHN_LOOS && section <= SHN_HIOS)
+	    snprintf (buf, len, "LOOS+%x", section - SHN_LOOS);
+	  /* Handle processor-specific section names.  */
+	  else if (section >= SHN_LOPROC && section <= SHN_HIPROC)
+	    snprintf (buf, len, "LOPROC+%x", section - SHN_LOPROC);
+	  else if (section >= SHN_LORESERVE && section <= SHN_HIRESERVE)
+	    snprintf (buf, len, "LORESERVE+%x", section - SHN_LORESERVE);
+	  else
+	    snprintf (buf, len, "%s: %d", gettext ("<unknown>"), section);
+
+	  res = buf;
+	}
+    }
+
+  return res;
+}
diff --git a/libebl/eblsectionstripp.c b/libebl/eblsectionstripp.c
new file mode 100644
index 0000000..c6cda63
--- /dev/null
+++ b/libebl/eblsectionstripp.c
@@ -0,0 +1,67 @@
+/* Check whether section can be stripped.
+   Copyright (C) 2005, 2013 Red Hat, Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
+#include "libeblP.h"
+
+
+bool
+ebl_section_strip_p (Ebl *ebl, const GElf_Ehdr *ehdr, const GElf_Shdr *shdr,
+		     const char *name, bool remove_comment,
+		     bool only_remove_debug)
+{
+  /* If only debug information should be removed check the name.  There
+     is unfortunately no other way.  */
+  if (unlikely (only_remove_debug))
+    {
+      if (ebl_debugscn_p (ebl, name))
+	return true;
+
+      if (shdr->sh_type == SHT_RELA || shdr->sh_type == SHT_REL)
+	{
+	  Elf_Scn *scn_l = elf_getscn (ebl->elf, (shdr)->sh_info);
+	  GElf_Shdr shdr_mem_l;
+	  GElf_Shdr *shdr_l = gelf_getshdr (scn_l, &shdr_mem_l);
+	  if (shdr_l != NULL)
+	    {
+	      const char *s_l = elf_strptr (ebl->elf, ehdr->e_shstrndx,
+					    shdr_l->sh_name);
+	      if (s_l != NULL && ebl_debugscn_p (ebl, s_l))
+		return true;
+	    }
+	}
+
+      return false;
+    }
+
+  return SECTION_STRIP_P (shdr, name, remove_comment);
+}
diff --git a/libebl/eblsectiontypename.c b/libebl/eblsectiontypename.c
new file mode 100644
index 0000000..5dc1ec6
--- /dev/null
+++ b/libebl/eblsectiontypename.c
@@ -0,0 +1,123 @@
+/* Return section type name.
+   Copyright (C) 2001, 2002, 2006, 2008 Red Hat, Inc.
+   This file is part of elfutils.
+   Written by Ulrich Drepper <drepper@redhat.com>, 2001.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <libeblP.h>
+
+
+const char *
+ebl_section_type_name (Ebl *ebl, int section, char *buf, size_t len)
+{
+  const char *res = ebl->section_type_name (section, buf, len);
+
+  if (res == NULL)
+    {
+      static const char *knowntypes[] =
+	{
+#define KNOWNSTYPE(name) [SHT_##name] = #name
+	  KNOWNSTYPE (NULL),
+	  KNOWNSTYPE (PROGBITS),
+	  KNOWNSTYPE (SYMTAB),
+	  KNOWNSTYPE (STRTAB),
+	  KNOWNSTYPE (RELA),
+	  KNOWNSTYPE (HASH),
+	  KNOWNSTYPE (DYNAMIC),
+	  KNOWNSTYPE (NOTE),
+	  KNOWNSTYPE (NOBITS),
+	  KNOWNSTYPE (REL),
+	  KNOWNSTYPE (SHLIB),
+	  KNOWNSTYPE (DYNSYM),
+	  KNOWNSTYPE (INIT_ARRAY),
+	  KNOWNSTYPE (FINI_ARRAY),
+	  KNOWNSTYPE (PREINIT_ARRAY),
+	  KNOWNSTYPE (GROUP),
+	  KNOWNSTYPE (SYMTAB_SHNDX)
+	};
+
+      /* Handle standard names.  */
+      if ((size_t) section < sizeof (knowntypes) / sizeof (knowntypes[0])
+	  && knowntypes[section] != NULL)
+	res = knowntypes[section];
+      /* The symbol versioning/Sun extensions.  */
+      else if (section >= SHT_LOSUNW && section <= SHT_HISUNW)
+	{
+	  static const char *sunwtypes[] =
+	    {
+#undef KNOWNSTYPE
+#define KNOWNSTYPE(name) [SHT_##name - SHT_LOSUNW] = #name
+	      KNOWNSTYPE (SUNW_move),
+	      KNOWNSTYPE (SUNW_COMDAT),
+	      KNOWNSTYPE (SUNW_syminfo),
+	      KNOWNSTYPE (GNU_verdef),
+	      KNOWNSTYPE (GNU_verneed),
+	      KNOWNSTYPE (GNU_versym)
+	    };
+	  res = sunwtypes[section - SHT_LOSUNW];
+	}
+      else
+	/* A few GNU additions.  */
+	switch (section)
+	  {
+	  case SHT_CHECKSUM:
+	    res = "CHECKSUM";
+	    break;
+	  case SHT_GNU_LIBLIST:
+	    res = "GNU_LIBLIST";
+	    break;
+	  case SHT_GNU_HASH:
+	    res = "GNU_HASH";
+	    break;
+	  case SHT_GNU_ATTRIBUTES:
+	    res = "GNU_ATTRIBUTES";
+	    break;
+
+	  default:
+	    /* Handle OS-specific section names.  */
+	    if (section >= SHT_LOOS && section <= SHT_HIOS)
+	      snprintf (buf, len, "SHT_LOOS+%x", section - SHT_LOOS);
+	    /* Handle processor-specific section names.  */
+	    else if (section >= SHT_LOPROC && section <= SHT_HIPROC)
+	      snprintf (buf, len, "SHT_LOPROC+%x", section - SHT_LOPROC);
+	    else if ((unsigned int) section >= SHT_LOUSER
+		     && (unsigned int) section <= SHT_HIUSER)
+	      snprintf (buf, len, "SHT_LOUSER+%x", section - SHT_LOUSER);
+	    else
+	      snprintf (buf, len, "%s: %d", gettext ("<unknown>"), section);
+
+	    res = buf;
+	    break;
+	  }
+    }
+
+  return res;
+}
diff --git a/libebl/eblsegmenttypename.c b/libebl/eblsegmenttypename.c
new file mode 100644
index 0000000..14eda76
--- /dev/null
+++ b/libebl/eblsegmenttypename.c
@@ -0,0 +1,86 @@
+/* Return segment type name.
+   Copyright (C) 2001, 2002, 2004 Red Hat, Inc.
+   This file is part of elfutils.
+   Written by Ulrich Drepper <drepper@redhat.com>, 2001.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <libeblP.h>
+
+
+const char *
+ebl_segment_type_name (Ebl *ebl, int segment, char *buf, size_t len)
+{
+  const char *res;
+
+  res = ebl != NULL ? ebl->segment_type_name (segment, buf, len) : NULL;
+  if (res == NULL)
+    {
+      static const char *ptypes[PT_NUM] =
+	{
+#define PTYPE(name) [PT_##name] = #name
+	  PTYPE (NULL),
+	  PTYPE (LOAD),
+	  PTYPE (DYNAMIC),
+	  PTYPE (INTERP),
+	  PTYPE (NOTE),
+	  PTYPE (SHLIB),
+	  PTYPE (PHDR),
+	  PTYPE (TLS)
+	};
+
+      /* Is it one of the standard segment types?  */
+      if (segment >= PT_NULL && segment < PT_NUM)
+	res = ptypes[segment];
+      else if (segment == PT_GNU_EH_FRAME)
+	res = "GNU_EH_FRAME";
+      else if (segment == PT_GNU_STACK)
+	res = "GNU_STACK";
+      else if (segment == PT_GNU_RELRO)
+	res = "GNU_RELRO";
+      else if (segment == PT_SUNWBSS)
+	res = "SUNWBSS";
+      else if (segment == PT_SUNWSTACK)
+	res = "SUNWSTACK";
+      else
+	{
+	  if (segment >= PT_LOOS && segment <= PT_HIOS)
+	    snprintf (buf, len, "LOOS+%d", segment - PT_LOOS);
+	  else if (segment >= PT_LOPROC && segment <= PT_HIPROC)
+	    snprintf (buf, len, "LOPROC+%d", segment - PT_LOPROC);
+	  else
+	    snprintf (buf, len, "%s: %d", gettext ("<unknown>"), segment);
+
+	  res = buf;
+	}
+    }
+
+  return res;
+}
diff --git a/libebl/eblstother.c b/libebl/eblstother.c
new file mode 100644
index 0000000..273f6fc
--- /dev/null
+++ b/libebl/eblstother.c
@@ -0,0 +1,41 @@
+/* Check st_other flag.
+   Copyright (C) 2011 Red Hat, Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libeblP.h>
+
+
+bool
+ebl_check_st_other_bits (Ebl *ebl, unsigned char st_other)
+{
+  return ((st_other ^ GELF_ST_VISIBILITY (st_other)) == 0
+	  || ebl->check_st_other_bits (st_other ^ GELF_ST_VISIBILITY (st_other)));
+}
diff --git a/libebl/eblsymbolbindingname.c b/libebl/eblsymbolbindingname.c
new file mode 100644
index 0000000..9797425
--- /dev/null
+++ b/libebl/eblsymbolbindingname.c
@@ -0,0 +1,74 @@
+/* Return symbol binding name.
+   Copyright (C) 2001, 2002, 2009 Red Hat, Inc.
+   This file is part of elfutils.
+   Written by Ulrich Drepper <drepper@redhat.com>, 2001.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <libeblP.h>
+
+
+const char *
+ebl_symbol_binding_name (Ebl *ebl, int binding, char *buf, size_t len)
+{
+  const char *res;
+
+  res = ebl != NULL ? ebl->symbol_type_name (binding, buf, len) : NULL;
+  if (res == NULL)
+    {
+      static const char *stb_names[STB_NUM] =
+	{
+	  "LOCAL", "GLOBAL", "WEAK"
+	};
+
+      /* Standard binding?  */
+      if (binding < STB_NUM)
+	res = stb_names[binding];
+      else
+	{
+	  char *ident;
+
+	  if (binding >= STB_LOPROC && binding <= STB_HIPROC)
+	    snprintf (buf, len, "LOPROC+%d", binding - STB_LOPROC);
+	  else if (binding == STB_GNU_UNIQUE
+		   && (ident = elf_getident (ebl->elf, NULL)) != NULL
+		   && ident[EI_OSABI] == ELFOSABI_LINUX)
+	    return "GNU_UNIQUE";
+	  else if (binding >= STB_LOOS && binding <= STB_HIOS)
+	    snprintf (buf, len, "LOOS+%d", binding - STB_LOOS);
+	  else
+	    snprintf (buf, len, gettext ("<unknown>: %d"), binding);
+
+	  res = buf;
+	}
+    }
+
+  return res;
+}
diff --git a/libebl/eblsymboltypename.c b/libebl/eblsymboltypename.c
new file mode 100644
index 0000000..09fa874
--- /dev/null
+++ b/libebl/eblsymboltypename.c
@@ -0,0 +1,80 @@
+/* Return symbol type name.
+   Copyright (C) 2001, 2002, 2009 Red Hat, Inc.
+   This file is part of elfutils.
+   Written by Ulrich Drepper <drepper@redhat.com>, 2001.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <libeblP.h>
+
+
+const char *
+ebl_symbol_type_name (Ebl *ebl, int symbol, char *buf, size_t len)
+{
+  const char *res;
+
+  res = ebl != NULL ? ebl->symbol_type_name (symbol, buf, len) : NULL;
+  if (res == NULL)
+    {
+      static const char *stt_names[STT_NUM] =
+	{
+	  [STT_NOTYPE] = "NOTYPE",
+	  [STT_OBJECT] = "OBJECT",
+	  [STT_FUNC] = "FUNC",
+	  [STT_SECTION] = "SECTION",
+	  [STT_FILE] = "FILE",
+	  [STT_COMMON] = "COMMON",
+	  [STT_TLS] = "TLS"
+	};
+
+      /* Standard type?  */
+      if (symbol < STT_NUM)
+	res = stt_names[symbol];
+      else
+	{
+	  char *ident;
+
+	  if (symbol >= STT_LOPROC && symbol <= STT_HIPROC)
+	    snprintf (buf, len, "LOPROC+%d", symbol - STT_LOPROC);
+	  else if (symbol == STT_GNU_IFUNC
+		   && (ident = elf_getident (ebl->elf, NULL)) != NULL
+		   && ident[EI_OSABI] == ELFOSABI_LINUX)
+	    return "GNU_IFUNC";
+	  else if (symbol >= STT_LOOS && symbol <= STT_HIOS)
+	    snprintf (buf, len, "LOOS+%d", symbol - STT_LOOS);
+	  else
+	    snprintf (buf, len, gettext ("<unknown>: %d"), symbol);
+
+	  res = buf;
+	}
+    }
+
+  return res;
+}
diff --git a/libebl/eblsysvhashentrysize.c b/libebl/eblsysvhashentrysize.c
new file mode 100644
index 0000000..2049431
--- /dev/null
+++ b/libebl/eblsysvhashentrysize.c
@@ -0,0 +1,41 @@
+/* Return OS ABI name
+   Copyright (C) 2006 Red Hat, Inc.
+   This file is part of elfutils.
+   Written by Ulrich Drepper <drepper@redhat.com>, 2006.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libeblP.h>
+
+
+int
+ebl_sysvhash_entrysize (Ebl *ebl)
+{
+  return ebl->sysvhash_entrysize;
+}
diff --git a/libebl/eblunwind.c b/libebl/eblunwind.c
new file mode 100644
index 0000000..2970d03
--- /dev/null
+++ b/libebl/eblunwind.c
@@ -0,0 +1,44 @@
+/* Get previous frame state for an existing frame state.
+   Copyright (C) 2013 Red Hat, Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libeblP.h>
+
+bool
+ebl_unwind (Ebl *ebl, Dwarf_Addr pc, ebl_tid_registers_t *setfunc,
+	    ebl_tid_registers_get_t *getfunc, ebl_pid_memory_read_t *readfunc,
+	    void *arg, bool *signal_framep)
+{
+  /* ebl is declared NN */
+  if (ebl->unwind == NULL)
+    return false;
+  return ebl->unwind (ebl, pc, setfunc, getfunc, readfunc, arg, signal_framep);
+}
diff --git a/libebl/libebl.h b/libebl/libebl.h
new file mode 100644
index 0000000..882bdb9
--- /dev/null
+++ b/libebl/libebl.h
@@ -0,0 +1,412 @@
+/* Interface for libebl.
+   Copyright (C) 2000-2010, 2013, 2014, 2015, 2016, 2017 Red Hat, Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+
+/* This is the interface for the Elfutils Backend Library.
+   It is a completely UNSUPPORTED interface.  Don't use any libebl
+   function directly.  These are only for internal elfutils backends
+   and tools.  There is NO source or binary compatible guarantee.
+
+   The ABI of the backend modules is not guaranteed.  Really, no guarantee
+   whatsoever.  We are enforcing this in the code.  The modules and their
+   users must match.  No third-party EBL module are supported or allowed.
+   The only reason there are separate modules is to not have the code for
+   all architectures in all the binaries.  */
+
+
+#ifndef _LIBEBL_H
+#define _LIBEBL_H 1
+
+#include <gelf.h>
+#include "libdw.h"
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+
+#include "elf-knowledge.h"
+
+
+/* Opaque type for the handle.  */
+typedef struct ebl Ebl;
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Get backend handle for object associated with ELF handle.  */
+extern Ebl *ebl_openbackend (Elf *elf);
+/* Similar but without underlying ELF file.  */
+extern Ebl *ebl_openbackend_machine (GElf_Half machine);
+/* Similar but with emulation name given.  */
+extern Ebl *ebl_openbackend_emulation (const char *emulation);
+
+/* Free resources allocated for backend handle.  */
+extern void ebl_closebackend (Ebl *bh);
+
+
+/* Information about the descriptor.  */
+
+/* Get ELF machine.  */
+extern int ebl_get_elfmachine (Ebl *ebl) __pure_attribute__;
+
+/* Get ELF class.  */
+extern int ebl_get_elfclass (Ebl *ebl) __pure_attribute__;
+
+/* Get ELF data encoding.  */
+extern int ebl_get_elfdata (Ebl *ebl) __pure_attribute__;
+
+
+/* Function to call the callback functions including default ELF
+   handling.  */
+
+/* Return backend name.  */
+extern const char *ebl_backend_name (Ebl *ebl);
+
+/* Return relocation type name.  */
+extern const char *ebl_reloc_type_name (Ebl *ebl, int reloc,
+					char *buf, size_t len);
+
+/* Check relocation type.  */
+extern bool ebl_reloc_type_check (Ebl *ebl, int reloc);
+
+/* Check relocation type use.  */
+extern bool ebl_reloc_valid_use (Ebl *ebl, int reloc);
+
+/* Check if relocation type is for simple absolute relocations.
+   Return ELF_T_{BYTE,HALF,SWORD,SXWORD} for a simple type, else ELF_T_NUM.  */
+extern Elf_Type ebl_reloc_simple_type (Ebl *ebl, int reloc);
+
+/* Return true if the symbol type is that referencing the GOT.  E.g.,
+   R_386_GOTPC.  */
+extern bool ebl_gotpc_reloc_check (Ebl *ebl, int reloc);
+
+/* Return segment type name.  */
+extern const char *ebl_segment_type_name (Ebl *ebl, int segment,
+					  char *buf, size_t len);
+
+/* Return section type name.  */
+extern const char *ebl_section_type_name (Ebl *ebl, int section,
+					  char *buf, size_t len);
+
+/* Return section name.  */
+extern const char *ebl_section_name (Ebl *ebl, int section, int xsection,
+				     char *buf, size_t len,
+				     const char *scnnames[], size_t shnum);
+
+/* Return machine flag names.  */
+extern const char *ebl_machine_flag_name (Ebl *ebl, GElf_Word flags,
+					  char *buf, size_t len);
+
+/* Check whether machine flag is valid.  */
+extern bool ebl_machine_flag_check (Ebl *ebl, GElf_Word flags);
+
+/* Check whether SHF_MASKPROC flags are valid.  */
+extern bool ebl_machine_section_flag_check (Ebl *ebl, GElf_Xword flags);
+
+/* Check whether the section with the given index, header, and name
+   is a special machine section that is valid despite a combination
+   of flags or other details that are not generically valid.  */
+extern bool ebl_check_special_section (Ebl *ebl, int ndx,
+				       const GElf_Shdr *shdr, const char *name);
+
+/* Return symbol type name.  */
+extern const char *ebl_symbol_type_name (Ebl *ebl, int symbol,
+					 char *buf, size_t len);
+
+/* Return symbol binding name.  */
+extern const char *ebl_symbol_binding_name (Ebl *ebl, int binding,
+					    char *buf, size_t len);
+
+/* Return dynamic tag name.  */
+extern const char *ebl_dynamic_tag_name (Ebl *ebl, int64_t tag,
+					 char *buf, size_t len);
+
+/* Check dynamic tag.  */
+extern bool ebl_dynamic_tag_check (Ebl *ebl, int64_t tag);
+
+/* Check whether given symbol's st_value and st_size are OK despite failing
+   normal checks.  */
+extern bool ebl_check_special_symbol (Ebl *ebl, GElf_Ehdr *ehdr,
+				      const GElf_Sym *sym, const char *name,
+				      const GElf_Shdr *destshdr);
+
+/* Check if this is a data marker symbol.  e.g. '$d' symbols for ARM.  */
+extern bool ebl_data_marker_symbol (Ebl *ebl, const GElf_Sym *sym,
+				    const char *sname);
+
+/* Check whether only valid bits are set on the st_other symbol flag.  */
+extern bool ebl_check_st_other_bits (Ebl *ebl, unsigned char st_other);
+
+/* Return symbolic representation of OS ABI.  */
+extern const char *ebl_osabi_name (Ebl *ebl, int osabi, char *buf, size_t len);
+
+
+/* Return name of the note section type for a core file.  */
+extern const char *ebl_core_note_type_name (Ebl *ebl, uint32_t type, char *buf,
+					    size_t len);
+
+/* Return name of the note section type for an object file.  */
+extern const char *ebl_object_note_type_name (Ebl *ebl, const char *name,
+					      uint32_t type, char *buf,
+					      size_t len);
+
+/* Print information about object note if available.  */
+extern void ebl_object_note (Ebl *ebl, const char *name, uint32_t type,
+			     uint32_t descsz, const char *desc);
+
+/* Check whether an attribute in a .gnu_attributes section is recognized.
+   Fills in *TAG_NAME with the name for this tag.
+   If VALUE is a known value for that tag, also fills in *VALUE_NAME.  */
+extern bool ebl_check_object_attribute (Ebl *ebl, const char *vendor,
+					int tag, uint64_t value,
+					const char **tag_name,
+					const char **value_name);
+
+/* Check whether a section type is a valid reloc target.  */
+extern bool ebl_check_reloc_target_type (Ebl *ebl, Elf64_Word sh_type);
+
+
+/* Check section name for being that of a debug informatino section.  */
+extern bool ebl_debugscn_p (Ebl *ebl, const char *name);
+
+/* Check whether given relocation is a copy relocation.  */
+extern bool ebl_copy_reloc_p (Ebl *ebl, int reloc);
+
+/* Check whether given relocation is a no-op relocation.  */
+extern bool ebl_none_reloc_p (Ebl *ebl, int reloc);
+
+/* Check whether given relocation is a relative relocation.  */
+extern bool ebl_relative_reloc_p (Ebl *ebl, int reloc);
+
+/* Check whether section should be stripped.  */
+extern bool ebl_section_strip_p (Ebl *ebl, const GElf_Ehdr *ehdr,
+				 const GElf_Shdr *shdr, const char *name,
+				 bool remove_comment, bool only_remove_debug);
+
+/* Check if backend uses a bss PLT in this file.  */
+extern bool ebl_bss_plt_p (Ebl *ebl);
+
+/* Return size of entry in SysV-style hash table.  */
+extern int ebl_sysvhash_entrysize (Ebl *ebl);
+
+/* Return location expression to find return value given a
+   DW_TAG_subprogram, DW_TAG_subroutine_type, or similar DIE describing
+   function itself (whose DW_AT_type attribute describes its return type).
+   Returns -1 for a libdw error (see dwarf_errno).
+   Returns -2 for an unrecognized type formation.
+   Returns zero if the function has no return value (e.g. "void" in C).
+   Otherwise, *LOCOPS gets a location expression to find the return value,
+   and returns the number of operations in the expression.  The pointer is
+   permanently allocated at least as long as the Ebl handle is open.  */
+extern int ebl_return_value_location (Ebl *ebl,
+				      Dwarf_Die *functypedie,
+				      const Dwarf_Op **locops);
+
+/* Fill in register information given DWARF register numbers.
+   If NAME is null, return the maximum REGNO + 1 that has a name.
+   Otherwise, store in NAME the name for DWARF register number REGNO
+   and return the number of bytes written (including '\0' terminator).
+   Return -1 if NAMELEN is too short or REGNO is negative or too large.
+   Return 0 if REGNO is unused (a gap in the DWARF number assignment).
+   On success, set *SETNAME to a description like "integer" or "FPU"
+   fit for "%s registers" title display, and *PREFIX to the string
+   that precedes NAME in canonical assembler syntax (e.g. "%" or "$").
+   The NAME string contains identifier characters only (maybe just digits).  */
+extern ssize_t ebl_register_info (Ebl *ebl,
+				  int regno, char *name, size_t namelen,
+				  const char **prefix, const char **setname,
+				  int *bits, int *type);
+
+/* Fill in the DWARF register numbers for the registers used in system calls.
+   The SP and PC are what kernel reports call the user stack pointer and PC.
+   The CALLNO and ARGS are the system call number and incoming arguments.
+   Each of these is filled with the DWARF register number corresponding,
+   or -1 if there is none.  Returns zero when the information is available.  */
+extern int ebl_syscall_abi (Ebl *ebl, int *sp, int *pc,
+			    int *callno, int args[6]);
+
+/* Supply the ABI-specified state of DWARF CFI before CIE initial programs.
+
+   The DWARF 3.0 spec says that the default initial states of all registers
+   are "undefined", unless otherwise specified by the machine/compiler ABI.
+
+   This default is wrong for every machine with the CFI generated by GCC.
+   The EH unwinder does not really distinguish "same_value" and "undefined",
+   since it doesn't matter for unwinding (in either case there is no change
+   to make for that register).  GCC generates CFI that says nothing at all
+   about registers it hasn't spilled somewhere.  For our unwinder to give
+   the true story, the backend must supply an initial state that uses
+   "same_value" rules for all the callee-saves registers.
+
+   This can fill in the initial_instructions, initial_instructions_end
+   members of *ABI_INFO to point at a CFI instruction stream to process
+   before each CIE's initial instructions.  It should set the
+   data_alignment_factor member if it affects the initial instructions.
+
+   The callback should not use the register rules DW_CFA_expression or
+   DW_CFA_val_expression.  Defining the CFA using DW_CFA_def_cfa_expression
+   is allowed.  This is an implementation detail since register rules
+   store expressions as offsets from the .eh_frame or .debug_frame data.
+
+   As a shorthand for some common cases, for this instruction stream
+   we overload some CFI instructions that cannot be used in a CIE:
+
+	DW_CFA_restore		-- Change default rule for all unmentioned
+				   registers from undefined to same_value.
+
+   This function can also fill in ABI_INFO->return_address_register with the
+   DWARF register number that identifies the actual PC in machine state.
+   If there is no canonical DWARF register number with that meaning, it's
+   left unchanged (callers usually initialize with (Dwarf_Word) -1).
+   This value is not used by CFI per se.
+
+   Function returns 0 on success and -1 for error or unsupported by the
+   backend.  */
+extern int ebl_abi_cfi (Ebl *ebl, Dwarf_CIE *abi_info)
+  __nonnull_attribute__ (2);
+
+/* Register map info. */
+typedef struct
+{
+  Dwarf_Half offset;		/* Byte offset in register data block.  */
+  Dwarf_Half regno;		/* DWARF register number.  */
+  uint8_t bits;			/* Bits of data for one register.  */
+  uint8_t pad;			/* Bytes of padding after register's data.  */
+  Dwarf_Half count;		/* Consecutive register numbers here.  */
+  bool pc_register;
+} Ebl_Register_Location;
+
+/* Non-register data items in core notes.  */
+typedef struct
+{
+  const char *name;		/* Printable identifier.  */
+  const char *group;		/* Identifier for category of related items.  */
+  Dwarf_Half offset;		/* Byte offset in note data.  */
+  Dwarf_Half count;
+  Elf_Type type;
+  char format;
+  bool thread_identifier;
+  bool pc_register;
+} Ebl_Core_Item;
+
+/* Describe the format of a core file note with the given header and NAME.
+   NAME is not guaranteed terminated, it's NHDR->n_namesz raw bytes.  */
+extern int ebl_core_note (Ebl *ebl, const GElf_Nhdr *nhdr, const char *name,
+			  GElf_Word *regs_offset, size_t *nregloc,
+			  const Ebl_Register_Location **reglocs,
+			  size_t *nitems, const Ebl_Core_Item **items)
+  __nonnull_attribute__ (1, 2, 3, 4, 5, 6, 7, 8);
+
+/* Describe the auxv type number.  */
+extern int ebl_auxv_info (Ebl *ebl, GElf_Xword a_type,
+			  const char **name, const char **format)
+  __nonnull_attribute__ (1, 3, 4);
+
+/* Callback type for ebl_set_initial_registers_tid.
+   Register -1 is mapped to PC (if arch PC has no DWARF number).
+   If FIRSTREG is -1 then NREGS has to be 1.  */
+typedef bool (ebl_tid_registers_t) (int firstreg, unsigned nregs,
+				    const Dwarf_Word *regs, void *arg)
+  __nonnull_attribute__ (3);
+
+/* Callback to fetch process data from live TID.
+   EBL architecture has to have EBL_FRAME_NREGS > 0, otherwise the
+   backend doesn't support unwinding and this function call may crash.  */
+extern bool ebl_set_initial_registers_tid (Ebl *ebl,
+					   pid_t tid,
+					   ebl_tid_registers_t *setfunc,
+					   void *arg)
+  __nonnull_attribute__ (1, 3);
+
+/* Number of registers to allocate for ebl_set_initial_registers_tid.
+   EBL architecture can unwind iff EBL_FRAME_NREGS > 0.  */
+extern size_t ebl_frame_nregs (Ebl *ebl)
+  __nonnull_attribute__ (1);
+
+/* Offset to apply to the value of the return_address_register, as
+   fetched from a Dwarf CFI.  This is used by some backends, where the
+   return_address_register actually contains the call address.  */
+extern int ebl_ra_offset (Ebl *ebl)
+  __nonnull_attribute__ (1);
+
+/* Mask to use for function symbol or unwind return addresses in case
+   the architecture adds some extra non-address bits to it.  This is
+   different from ebl_resolve_sym_value which only works for actual
+   symbol addresses (in non-ET_REL files) that might resolve to an
+   address in a different section.  ebl_func_addr_mask is called to
+   turn a given function value into the a real address or offset (the
+   original value might not be a real address).  This works for all
+   cases where an actual function address (or offset in ET_REL symbol
+   tables) is needed.  */
+extern GElf_Addr ebl_func_addr_mask (Ebl *ebl);
+
+/* Convert *REGNO as is in DWARF to a lower range suitable for
+   Dwarf_Frame->REGS indexing.  */
+extern bool ebl_dwarf_to_regno (Ebl *ebl, unsigned *regno)
+  __nonnull_attribute__ (1, 2);
+
+/* Modify PC as fetched from inferior data into valid PC.  */
+extern void ebl_normalize_pc (Ebl *ebl, Dwarf_Addr *pc)
+  __nonnull_attribute__ (1, 2);
+
+/* Callback type for ebl_unwind's parameter getfunc.  */
+typedef bool (ebl_tid_registers_get_t) (int firstreg, unsigned nregs,
+					Dwarf_Word *regs, void *arg)
+  __nonnull_attribute__ (3);
+
+/* Callback type for ebl_unwind's parameter readfunc.  */
+typedef bool (ebl_pid_memory_read_t) (Dwarf_Addr addr, Dwarf_Word *data,
+				      void *arg)
+  __nonnull_attribute__ (3);
+
+/* Get previous frame state for an existing frame state.  Method is called only
+   if unwinder could not find CFI for current PC.  PC is for the
+   existing frame.  SETFUNC sets register in the previous frame.  GETFUNC gets
+   register from the existing frame.  Note that GETFUNC vs. SETFUNC act on
+   a disjunct set of registers.  READFUNC reads memory.  ARG has to be passed
+   for SETFUNC, GETFUNC and READFUNC.  *SIGNAL_FRAMEP is initialized to false,
+   it can be set to true if existing frame is a signal frame.  SIGNAL_FRAMEP is
+   never NULL.  */
+extern bool ebl_unwind (Ebl *ebl, Dwarf_Addr pc, ebl_tid_registers_t *setfunc,
+			ebl_tid_registers_get_t *getfunc,
+			ebl_pid_memory_read_t *readfunc, void *arg,
+			bool *signal_framep)
+  __nonnull_attribute__ (1, 3, 4, 5, 7);
+
+/* Returns true if the value can be resolved to an address in an
+   allocated section, which will be returned in *ADDR
+   (e.g. function descriptor resolving)  */
+extern bool ebl_resolve_sym_value (Ebl *ebl, GElf_Addr *addr)
+   __nonnull_attribute__ (2);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* libebl.h */
diff --git a/libebl/libeblP.h b/libebl/libeblP.h
new file mode 100644
index 0000000..5b339b3
--- /dev/null
+++ b/libebl/libeblP.h
@@ -0,0 +1,103 @@
+/* Internal definitions for interface for libebl.
+   Copyright (C) 2000-2009, 2013, 2014 Red Hat, Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef _LIBEBLP_H
+#define _LIBEBLP_H 1
+
+#include <gelf.h>
+#include <libasm.h>
+#include <libebl.h>
+#include <libintl.h>
+
+
+/* Backend handle.  */
+struct ebl
+{
+  /* Machine name.  */
+  const char *name;
+
+  /* Emulation name.  */
+  const char *emulation;
+
+  /* ELF machine, class, and data encoding.  */
+  uint_fast16_t machine;
+  uint_fast8_t class;
+  uint_fast8_t data;
+
+  /* The libelf handle (if known).  */
+  Elf *elf;
+
+  /* See ebl-hooks.h for the declarations of the hook functions.  */
+# define EBLHOOK(name) (*name)
+# include "ebl-hooks.h"
+# undef EBLHOOK
+
+  /* Size of entry in Sysv-style hash table.  */
+  int sysvhash_entrysize;
+
+  /* Number of registers to allocate for ebl_set_initial_registers_tid.
+     Ebl architecture can unwind iff FRAME_NREGS > 0.  */
+  size_t frame_nregs;
+
+  /* Offset to apply to the value of the return_address_register, as
+     fetched from a Dwarf CFI.  This is used by some backends, where
+     the return_address_register actually contains the call
+     address.  */
+  int ra_offset;
+
+  /* Mask to use to turn a function value into a real function address
+     in case the architecture adds some extra non-address bits to it.
+     If not initialized (0) then ebl_func_addr_mask will return ~0,
+     otherwise it should be the actual mask to use.  */
+  GElf_Addr func_addr_mask;
+
+  /* Function descriptor load address and table as used by
+     ebl_resolve_sym_value if available for this arch.  */
+  GElf_Addr fd_addr;
+  Elf_Data *fd_data;
+
+  /* Internal data.  */
+  void *dlhandle;
+};
+
+
+/* Type of the initialization functions in the backend modules.  */
+typedef const char *(*ebl_bhinit_t) (Elf *, GElf_Half, Ebl *, size_t);
+
+
+/* gettext helper macros.  */
+#undef _
+#define _(Str) dgettext ("elfutils", Str)
+
+
+/* LEB128 constant helper macros.  */
+#define ULEB128_7(x)	(BUILD_BUG_ON_ZERO ((x) >= (1U << 7)) + (x))
+
+#define BUILD_BUG_ON_ZERO(x) (sizeof (char [(x) ? -1 : 1]) - 1)
+
+#endif	/* libeblP.h */