003 File Manager
Current Path:
/usr/src/contrib/elftoolchain/libdwarf
usr
/
src
/
contrib
/
elftoolchain
/
libdwarf
/
📁
..
📄
Makefile
(10.53 KB)
📄
Version.map
(5.24 KB)
📄
_libdwarf.h
(28.02 KB)
📄
dwarf.3
(22.99 KB)
📄
dwarf.h
(20.09 KB)
📄
dwarf_abbrev.c
(3.67 KB)
📄
dwarf_add_AT_comp_dir.3
(2.93 KB)
📄
dwarf_add_AT_const_value_string.3
(3.79 KB)
📄
dwarf_add_AT_dataref.3
(3.53 KB)
📄
dwarf_add_AT_flag.3
(3.23 KB)
📄
dwarf_add_AT_location_expr.3
(3.48 KB)
📄
dwarf_add_AT_name.3
(2.89 KB)
📄
dwarf_add_AT_producer.3
(2.94 KB)
📄
dwarf_add_AT_ref_address.3
(3.37 KB)
📄
dwarf_add_AT_reference.3
(3.44 KB)
📄
dwarf_add_AT_signed_const.3
(3.78 KB)
📄
dwarf_add_AT_string.3
(3.23 KB)
📄
dwarf_add_AT_targ_address.3
(4.03 KB)
📄
dwarf_add_arange.3
(4.38 KB)
📄
dwarf_add_die_to_debug.3
(2.78 KB)
📄
dwarf_add_directory_decl.3
(2.93 KB)
📄
dwarf_add_expr_addr.3
(3.25 KB)
📄
dwarf_add_expr_gen.3
(3.4 KB)
📄
dwarf_add_fde_inst.3
(3.23 KB)
📄
dwarf_add_file_decl.3
(3.45 KB)
📄
dwarf_add_frame_cie.3
(3.45 KB)
📄
dwarf_add_frame_fde.3
(5.54 KB)
📄
dwarf_add_funcname.3
(2.96 KB)
📄
dwarf_add_line_entry.3
(4.74 KB)
📄
dwarf_add_pubname.3
(2.95 KB)
📄
dwarf_add_typename.3
(2.97 KB)
📄
dwarf_add_varname.3
(2.96 KB)
📄
dwarf_add_weakname.3
(2.95 KB)
📄
dwarf_arange.c
(4.24 KB)
📄
dwarf_attr.3
(3.29 KB)
📄
dwarf_attr.c
(7.19 KB)
📄
dwarf_attrlist.3
(4.28 KB)
📄
dwarf_attroffset.3
(2.52 KB)
📄
dwarf_attrval.c
(5.27 KB)
📄
dwarf_attrval_signed.3
(5.8 KB)
📄
dwarf_child.3
(7.35 KB)
📄
dwarf_cu.c
(4.72 KB)
📄
dwarf_dealloc.3
(5.19 KB)
📄
dwarf_dealloc.c
(3.68 KB)
📄
dwarf_def_macro.3
(3.63 KB)
📄
dwarf_die.c
(9.85 KB)
📄
dwarf_die_abbrev_code.3
(2.04 KB)
📄
dwarf_die_link.3
(3.19 KB)
📄
dwarf_diename.3
(2.68 KB)
📄
dwarf_dieoffset.3
(5.8 KB)
📄
dwarf_dump.c
(37.44 KB)
📄
dwarf_end_macro_file.3
(2.65 KB)
📄
dwarf_errmsg.3
(2.07 KB)
📄
dwarf_errmsg.c
(3.91 KB)
📄
dwarf_errno.3
(1.9 KB)
📄
dwarf_expand_frame_instructions.3
(5.08 KB)
📄
dwarf_expr_current_offset.3
(2.64 KB)
📄
dwarf_expr_into_block.3
(2.88 KB)
📄
dwarf_fde_cfa_offset.3
(2.89 KB)
📄
dwarf_find_macro_value_start.3
(2.42 KB)
📄
dwarf_finish.3
(3.65 KB)
📄
dwarf_finish.c
(1.81 KB)
📄
dwarf_form.c
(10.87 KB)
📄
dwarf_formaddr.3
(2.69 KB)
📄
dwarf_formblock.3
(3.02 KB)
📄
dwarf_formexprloc.3
(3.12 KB)
📄
dwarf_formflag.3
(2.7 KB)
📄
dwarf_formref.3
(3.56 KB)
📄
dwarf_formsig8.3
(2.74 KB)
📄
dwarf_formstring.3
(2.88 KB)
📄
dwarf_formudata.3
(3.29 KB)
📄
dwarf_frame.c
(15.45 KB)
📄
dwarf_funcs.m4
(1.55 KB)
📄
dwarf_get_AT_name.3
(5.4 KB)
📄
dwarf_get_abbrev.3
(4.86 KB)
📄
dwarf_get_abbrev_children_flag.3
(3.07 KB)
📄
dwarf_get_abbrev_code.3
(2.55 KB)
📄
dwarf_get_abbrev_entry.3
(4.3 KB)
📄
dwarf_get_abbrev_tag.3
(2.51 KB)
📄
dwarf_get_address_size.3
(2.52 KB)
📄
dwarf_get_arange.3
(3.12 KB)
📄
dwarf_get_arange_info.3
(3.73 KB)
📄
dwarf_get_aranges.3
(3.98 KB)
📄
dwarf_get_cie_index.3
(2.54 KB)
📄
dwarf_get_cie_info.3
(4.15 KB)
📄
dwarf_get_cie_of_fde.3
(2.51 KB)
📄
dwarf_get_cu_die_offset.3
(3.05 KB)
📄
dwarf_get_die_infotypes_flag.3
(2.35 KB)
📄
dwarf_get_elf.3
(2.66 KB)
📄
dwarf_get_fde_at_pc.3
(3.56 KB)
📄
dwarf_get_fde_info_for_all_regs.3
(4.44 KB)
📄
dwarf_get_fde_info_for_all_regs3.3
(5.23 KB)
📄
dwarf_get_fde_info_for_cfa_reg3.3
(4.94 KB)
📄
dwarf_get_fde_info_for_reg.3
(4.54 KB)
📄
dwarf_get_fde_info_for_reg3.3
(6.17 KB)
📄
dwarf_get_fde_instr_bytes.3
(3.32 KB)
📄
dwarf_get_fde_list.3
(6.03 KB)
📄
dwarf_get_fde_n.3
(3.16 KB)
📄
dwarf_get_fde_range.3
(4.19 KB)
📄
dwarf_get_form_class.3
(2.74 KB)
📄
dwarf_get_funcs.3
(5.86 KB)
📄
dwarf_get_globals.3
(5.87 KB)
📄
dwarf_get_loclist_entry.3
(4.2 KB)
📄
dwarf_get_macro_details.3
(5.41 KB)
📄
dwarf_get_pubtypes.3
(6.61 KB)
📄
dwarf_get_ranges.3
(6.71 KB)
📄
dwarf_get_relocation_info.3
(6.73 KB)
📄
dwarf_get_relocation_info_count.3
(3.38 KB)
📄
dwarf_get_section_bytes.3
(4.63 KB)
📄
dwarf_get_section_max_offsets.3
(3.75 KB)
📄
dwarf_get_str.3
(3.73 KB)
📄
dwarf_get_types.3
(6.29 KB)
📄
dwarf_get_vars.3
(5.77 KB)
📄
dwarf_get_weaks.3
(5.84 KB)
📄
dwarf_hasattr.3
(2.71 KB)
📄
dwarf_hasform.3
(3.48 KB)
📄
dwarf_highpc.3
(4.78 KB)
📄
dwarf_init.3
(4.49 KB)
📄
dwarf_init.c
(4.09 KB)
📄
dwarf_lineno.3
(5.39 KB)
📄
dwarf_lineno.c
(6.75 KB)
📄
dwarf_lne_end_sequence.3
(2.95 KB)
📄
dwarf_lne_set_address.3
(3 KB)
📄
dwarf_loclist.3
(6.09 KB)
📄
dwarf_loclist.c
(8.32 KB)
📄
dwarf_loclist_from_expr.3
(5.38 KB)
📄
dwarf_macinfo.c
(2.62 KB)
📄
dwarf_nametbl.m4
(3.89 KB)
📄
dwarf_new_die.3
(4.33 KB)
📄
dwarf_new_expr.3
(3.91 KB)
📄
dwarf_new_fde.3
(2.58 KB)
📄
dwarf_next_cu_header.3
(8.19 KB)
📄
dwarf_next_types_section.3
(3.83 KB)
📄
dwarf_object_init.3
(6.4 KB)
📄
dwarf_pro_arange.c
(2.51 KB)
📄
dwarf_pro_attr.c
(9.29 KB)
📄
dwarf_pro_die.c
(3.09 KB)
📄
dwarf_pro_expr.c
(5.69 KB)
📄
dwarf_pro_finish.c
(1.67 KB)
📄
dwarf_pro_frame.c
(5.37 KB)
📄
dwarf_pro_funcs.m4
(1.54 KB)
📄
dwarf_pro_init.c
(3.28 KB)
📄
dwarf_pro_lineno.c
(5.06 KB)
📄
dwarf_pro_macinfo.c
(3.96 KB)
📄
dwarf_pro_nametbl.m4
(2.28 KB)
📄
dwarf_pro_pubnames.m4
(1.54 KB)
📄
dwarf_pro_reloc.c
(3.75 KB)
📄
dwarf_pro_sections.c
(2.54 KB)
📄
dwarf_pro_types.m4
(1.54 KB)
📄
dwarf_pro_vars.m4
(1.54 KB)
📄
dwarf_pro_weaks.m4
(1.54 KB)
📄
dwarf_producer_init.3
(7.59 KB)
📄
dwarf_producer_set_isa.3
(2.88 KB)
📄
dwarf_pubnames.m4
(1.56 KB)
📄
dwarf_pubtypes.m4
(1.56 KB)
📄
dwarf_ranges.c
(2.91 KB)
📄
dwarf_reloc.c
(1.56 KB)
📄
dwarf_reset_section_bytes.3
(2.44 KB)
📄
dwarf_sections.c
(3.79 KB)
📄
dwarf_set_frame_cfa_value.3
(4.11 KB)
📄
dwarf_set_reloc_application.3
(2.71 KB)
📄
dwarf_seterrarg.3
(3.18 KB)
📄
dwarf_seterror.c
(1.97 KB)
📄
dwarf_srcfiles.3
(3.23 KB)
📄
dwarf_srclines.3
(4.66 KB)
📄
dwarf_start_macro_file.3
(3.09 KB)
📄
dwarf_str.c
(2.13 KB)
📄
dwarf_tag.3
(2.38 KB)
📄
dwarf_transform_to_disk_form.3
(3.22 KB)
📄
dwarf_types.m4
(1.55 KB)
📄
dwarf_undef_macro.3
(3.38 KB)
📄
dwarf_vars.m4
(1.55 KB)
📄
dwarf_vendor_ext.3
(3.1 KB)
📄
dwarf_weaks.m4
(1.55 KB)
📄
dwarf_whatattr.3
(2.39 KB)
📄
libdwarf.c
(1.5 KB)
📄
libdwarf.h
(32.98 KB)
📄
libdwarf_abbrev.c
(6.74 KB)
📄
libdwarf_arange.c
(7.22 KB)
📄
libdwarf_attr.c
(12.08 KB)
📄
libdwarf_die.c
(10.49 KB)
📄
libdwarf_elf_access.c
(3.52 KB)
📄
libdwarf_elf_init.c
(9.21 KB)
📄
libdwarf_error.c
(2.19 KB)
📄
libdwarf_frame.c
(39.32 KB)
📄
libdwarf_info.c
(9.22 KB)
📄
libdwarf_init.c
(8.14 KB)
📄
libdwarf_lineno.c
(18.27 KB)
📄
libdwarf_loc.c
(14.79 KB)
📄
libdwarf_loclist.c
(4.47 KB)
📄
libdwarf_macinfo.c
(5.96 KB)
📄
libdwarf_nametbl.c
(6.64 KB)
📄
libdwarf_ranges.c
(3.88 KB)
📄
libdwarf_reloc.c
(12.86 KB)
📄
libdwarf_rw.c
(10.93 KB)
📄
libdwarf_sections.c
(7.01 KB)
📄
libdwarf_str.c
(4.29 KB)
📄
os.NetBSD.mk
(74 B)
Editing: libdwarf_reloc.c
/*- * Copyright (c) 2010 Kai Wang * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include "_libdwarf.h" ELFTC_VCSID("$Id: libdwarf_reloc.c 3741 2019-06-07 06:32:01Z jkoshy $"); Dwarf_Unsigned _dwarf_get_reloc_type(Dwarf_P_Debug dbg, int is64) { assert(dbg != NULL); switch (dbg->dbgp_isa) { case DW_ISA_AARCH64: return (is64 ? R_AARCH64_ABS64 : R_AARCH64_ABS32); case DW_ISA_X86: return (R_386_32); case DW_ISA_X86_64: return (is64 ? R_X86_64_64 : R_X86_64_32); case DW_ISA_SPARC: return (is64 ? R_SPARC_UA64 : R_SPARC_UA32); case DW_ISA_PPC: return (is64 ? R_PPC64_ADDR64 : R_PPC_ADDR32); case DW_ISA_ARM: return (R_ARM_ABS32); case DW_ISA_MIPS: return (is64 ? R_MIPS_64 : R_MIPS_32); case DW_ISA_RISCV: return (is64 ? R_RISCV_64 : R_RISCV_32); case DW_ISA_IA64: return (is64 ? R_IA_64_DIR64LSB : R_IA_64_DIR32LSB); default: break; } return (0); /* NOT REACHED */ } int _dwarf_get_reloc_size(Dwarf_Debug dbg, Dwarf_Unsigned rel_type) { switch (dbg->dbg_machine) { case EM_NONE: break; case EM_AARCH64: if (rel_type == R_AARCH64_ABS32) return (4); else if (rel_type == R_AARCH64_ABS64) return (8); break; case EM_ARM: if (rel_type == R_ARM_ABS32) return (4); break; case EM_386: case EM_IAMCU: if (rel_type == R_386_32) return (4); break; case EM_X86_64: if (rel_type == R_X86_64_32) return (4); else if (rel_type == R_X86_64_64) return (8); break; case EM_SPARC: if (rel_type == R_SPARC_UA32) return (4); else if (rel_type == R_SPARC_UA64) return (8); break; case EM_PPC: if (rel_type == R_PPC_ADDR32) return (4); break; case EM_PPC64: if (rel_type == R_PPC_ADDR32) return (4); else if (rel_type == R_PPC64_ADDR64) return (8); break; case EM_MIPS: if (rel_type == R_MIPS_32) return (4); else if (rel_type == R_MIPS_64) return (8); break; case EM_RISCV: if (rel_type == R_RISCV_32) return (4); else if (rel_type == R_RISCV_64) return (8); break; case EM_IA_64: if (rel_type == R_IA_64_SECREL32LSB) return (4); else if (rel_type == R_IA_64_DIR64LSB) return (8); break; default: break; } /* unknown relocation. */ return (0); } int _dwarf_reloc_section_init(Dwarf_P_Debug dbg, Dwarf_Rel_Section *drsp, Dwarf_P_Section ref, Dwarf_Error *error) { Dwarf_Rel_Section drs; char name[128]; int pseudo; assert(dbg != NULL && drsp != NULL && ref != NULL); if ((drs = calloc(1, sizeof(struct _Dwarf_Rel_Section))) == NULL) { DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY); return (DW_DLE_MEMORY); } drs->drs_ref = ref; /* * FIXME The logic here is most likely wrong. It should * be the ISA that determines relocation type. */ if (dbg->dbgp_flags & DW_DLC_SIZE_64) drs->drs_addend = 1; else drs->drs_addend = 0; if (dbg->dbgp_flags & DW_DLC_SYMBOLIC_RELOCATIONS) pseudo = 1; else pseudo = 0; snprintf(name, sizeof(name), "%s%s", drs->drs_addend ? ".rela" : ".rel", ref->ds_name); if (_dwarf_section_init(dbg, &drs->drs_ds, name, pseudo, error) != DW_DLE_NONE) { free(drs); DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY); return (DW_DLE_MEMORY); } STAILQ_INIT(&drs->drs_dre); STAILQ_INSERT_TAIL(&dbg->dbgp_drslist, drs, drs_next); dbg->dbgp_drscnt++; *drsp = drs; return (DW_DLE_NONE); } void _dwarf_reloc_section_free(Dwarf_P_Debug dbg, Dwarf_Rel_Section *drsp) { Dwarf_Rel_Section drs, tdrs; Dwarf_Rel_Entry dre, tdre; assert(dbg != NULL && drsp != NULL); if (*drsp == NULL) return; STAILQ_FOREACH_SAFE(drs, &dbg->dbgp_drslist, drs_next, tdrs) { if (drs != *drsp) continue; STAILQ_REMOVE(&dbg->dbgp_drslist, drs, _Dwarf_Rel_Section, drs_next); STAILQ_FOREACH_SAFE(dre, &drs->drs_dre, dre_next, tdre) { STAILQ_REMOVE(&drs->drs_dre, dre, _Dwarf_Rel_Entry, dre_next); free(dre); } if ((dbg->dbgp_flags & DW_DLC_SYMBOLIC_RELOCATIONS) == 0) _dwarf_section_free(dbg, &drs->drs_ds); else { if (drs->drs_ds->ds_name) free(drs->drs_ds->ds_name); free(drs->drs_ds); } free(drs); *drsp = NULL; dbg->dbgp_drscnt--; break; } } int _dwarf_reloc_entry_add(Dwarf_P_Debug dbg, Dwarf_Rel_Section drs, Dwarf_P_Section ds, unsigned char type, unsigned char length, Dwarf_Unsigned offset, Dwarf_Unsigned symndx, Dwarf_Unsigned addend, const char *secname, Dwarf_Error *error) { Dwarf_Rel_Entry dre; Dwarf_Unsigned reloff; int ret; assert(drs != NULL); assert(offset <= ds->ds_size); reloff = offset; /* * If the DW_DLC_SYMBOLIC_RELOCATIONS flag is set or ElfXX_Rel * is used instead of ELfXX_Rela, we need to write the addend * in the storage unit to be relocated. Otherwise write 0 in the * storage unit and the addend will be written into relocation * section later. */ if ((dbg->dbgp_flags & DW_DLC_SYMBOLIC_RELOCATIONS) || drs->drs_addend == 0) ret = dbg->write_alloc(&ds->ds_data, &ds->ds_cap, &offset, addend, length, error); else ret = dbg->write_alloc(&ds->ds_data, &ds->ds_cap, &offset, 0, length, error); if (ret != DW_DLE_NONE) return (ret); if (offset > ds->ds_size) ds->ds_size = offset; if ((dre = calloc(1, sizeof(struct _Dwarf_Rel_Entry))) == NULL) { DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY); return (DW_DLE_MEMORY); } STAILQ_INSERT_TAIL(&drs->drs_dre, dre, dre_next); dre->dre_type = type; dre->dre_length = length; dre->dre_offset = reloff; dre->dre_symndx = symndx; dre->dre_addend = addend; dre->dre_secname = secname; drs->drs_drecnt++; return (DW_DLE_NONE); } int _dwarf_reloc_entry_add_pair(Dwarf_P_Debug dbg, Dwarf_Rel_Section drs, Dwarf_P_Section ds, unsigned char length, Dwarf_Unsigned offset, Dwarf_Unsigned symndx, Dwarf_Unsigned esymndx, Dwarf_Unsigned symoff, Dwarf_Unsigned esymoff, Dwarf_Error *error) { Dwarf_Rel_Entry dre; Dwarf_Unsigned reloff; int ret; assert(drs != NULL); assert(offset <= ds->ds_size); assert(dbg->dbgp_flags & DW_DLC_SYMBOLIC_RELOCATIONS); reloff = offset; /* Write net offset into section stream. */ ret = dbg->write_alloc(&ds->ds_data, &ds->ds_cap, &offset, esymoff - symoff, length, error); if (ret != DW_DLE_NONE) return (ret); if (offset > ds->ds_size) ds->ds_size = offset; if ((dre = calloc(2, sizeof(struct _Dwarf_Rel_Entry))) == NULL) { DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY); return (DW_DLE_MEMORY); } STAILQ_INSERT_TAIL(&drs->drs_dre, &dre[0], dre_next); STAILQ_INSERT_TAIL(&drs->drs_dre, &dre[1], dre_next); dre[0].dre_type = dwarf_drt_first_of_length_pair; dre[0].dre_length = length; dre[0].dre_offset = reloff; dre[0].dre_symndx = symndx; dre[0].dre_addend = 0; dre[0].dre_secname = NULL; dre[1].dre_type = dwarf_drt_second_of_length_pair; dre[1].dre_length = length; dre[1].dre_offset = reloff; dre[1].dre_symndx = esymndx; dre[1].dre_addend = 0; dre[1].dre_secname = NULL; drs->drs_drecnt += 2; return (DW_DLE_NONE); } int _dwarf_reloc_section_finalize(Dwarf_P_Debug dbg, Dwarf_Rel_Section drs, Dwarf_Error *error) { Dwarf_P_Section ds; Dwarf_Unsigned unit; int ret, size; assert(dbg != NULL && drs != NULL && drs->drs_ds != NULL && drs->drs_ref != NULL); ds = drs->drs_ds; /* * Calculate the size (in bytes) of the relocation section. */ if (dbg->dbgp_flags & DW_DLC_SIZE_64) unit = drs->drs_addend ? sizeof(Elf64_Rela) : sizeof(Elf64_Rel); else unit = drs->drs_addend ? sizeof(Elf32_Rela) : sizeof(Elf32_Rel); assert(ds->ds_size == 0); size = drs->drs_drecnt * unit; /* * Discard this relocation section if there is no entry in it. */ if (size == 0) { _dwarf_reloc_section_free(dbg, &drs); return (DW_DLE_NONE); } /* * If we are under stream mode, realloc the section data block to * this size. */ if ((dbg->dbgp_flags & DW_DLC_SYMBOLIC_RELOCATIONS) == 0) { ds->ds_cap = size; if ((ds->ds_data = realloc(ds->ds_data, (size_t) ds->ds_cap)) == NULL) { DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY); return (DW_DLE_MEMORY); } } /* * Notify the application the creation of this relocation section. * Note that the section link here should point to the .symtab * section, we set it to 0 since we have no way to know .symtab * section index. */ ret = _dwarf_pro_callback(dbg, ds->ds_name, size, drs->drs_addend ? SHT_RELA : SHT_REL, 0, 0, drs->drs_ref->ds_ndx, &ds->ds_symndx, NULL); if (ret < 0) { DWARF_SET_ERROR(dbg, error, DW_DLE_ELF_SECT_ERR); return (DW_DLE_ELF_SECT_ERR); } ds->ds_ndx = ret; return (DW_DLE_NONE); } int _dwarf_reloc_section_gen(Dwarf_P_Debug dbg, Dwarf_Rel_Section drs, Dwarf_Error *error) { Dwarf_Rel_Entry dre; Dwarf_P_Section ds; Dwarf_Unsigned type; int ret; assert((dbg->dbgp_flags & DW_DLC_SYMBOLIC_RELOCATIONS) == 0); assert(drs->drs_ds != NULL && drs->drs_ds->ds_size == 0); assert(!STAILQ_EMPTY(&drs->drs_dre)); ds = drs->drs_ds; STAILQ_FOREACH(dre, &drs->drs_dre, dre_next) { assert(dre->dre_length == 4 || dre->dre_length == 8); type = _dwarf_get_reloc_type(dbg, dre->dre_length == 8); if (dbg->dbgp_flags & DW_DLC_SIZE_64) { /* Write r_offset (8 bytes) */ ret = dbg->write_alloc(&ds->ds_data, &ds->ds_cap, &ds->ds_size, dre->dre_offset, 8, error); if (ret != DW_DLE_NONE) return (ret); /* Write r_info (8 bytes) */ ret = dbg->write_alloc(&ds->ds_data, &ds->ds_cap, &ds->ds_size, ELF64_R_INFO(dre->dre_symndx, type), 8, error); if (ret != DW_DLE_NONE) return (ret); /* Write r_addend (8 bytes) */ if (drs->drs_addend) { ret = dbg->write_alloc(&ds->ds_data, &ds->ds_cap, &ds->ds_size, dre->dre_addend, 8, error); if (ret != DW_DLE_NONE) return (ret); } } else { /* Write r_offset (4 bytes) */ ret = dbg->write_alloc(&ds->ds_data, &ds->ds_cap, &ds->ds_size, dre->dre_offset, 4, error); if (ret != DW_DLE_NONE) return (ret); /* Write r_info (4 bytes) */ ret = dbg->write_alloc(&ds->ds_data, &ds->ds_cap, &ds->ds_size, ELF32_R_INFO(dre->dre_symndx, type), 4, error); if (ret != DW_DLE_NONE) return (ret); /* Write r_addend (4 bytes) */ if (drs->drs_addend) { ret = dbg->write_alloc(&ds->ds_data, &ds->ds_cap, &ds->ds_size, dre->dre_addend, 4, error); if (ret != DW_DLE_NONE) return (ret); } } } assert(ds->ds_size == ds->ds_cap); return (DW_DLE_NONE); } int _dwarf_reloc_gen(Dwarf_P_Debug dbg, Dwarf_Error *error) { Dwarf_Rel_Section drs; Dwarf_Rel_Entry dre; Dwarf_P_Section ds; int ret; STAILQ_FOREACH(drs, &dbg->dbgp_drslist, drs_next) { /* * Update relocation entries: translate any section name * reference to section symbol index. */ STAILQ_FOREACH(dre, &drs->drs_dre, dre_next) { if (dre->dre_secname == NULL) continue; ds = _dwarf_pro_find_section(dbg, dre->dre_secname); assert(ds != NULL && ds->ds_symndx != 0); dre->dre_symndx = ds->ds_symndx; } /* * Generate ELF relocation section if we are under stream * mode. */ if ((dbg->dbgp_flags & DW_DLC_SYMBOLIC_RELOCATIONS) == 0) { ret = _dwarf_reloc_section_gen(dbg, drs, error); if (ret != DW_DLE_NONE) return (ret); } } return (DW_DLE_NONE); } void _dwarf_reloc_cleanup(Dwarf_P_Debug dbg) { Dwarf_Rel_Section drs, tdrs; Dwarf_Rel_Entry dre, tdre; assert(dbg != NULL && dbg->dbg_mode == DW_DLC_WRITE); STAILQ_FOREACH_SAFE(drs, &dbg->dbgp_drslist, drs_next, tdrs) { STAILQ_REMOVE(&dbg->dbgp_drslist, drs, _Dwarf_Rel_Section, drs_next); free(drs->drs_drd); STAILQ_FOREACH_SAFE(dre, &drs->drs_dre, dre_next, tdre) { STAILQ_REMOVE(&drs->drs_dre, dre, _Dwarf_Rel_Entry, dre_next); free(dre); } if (dbg->dbgp_flags & DW_DLC_SYMBOLIC_RELOCATIONS) { if (drs->drs_ds) { if (drs->drs_ds->ds_name) free(drs->drs_ds->ds_name); free(drs->drs_ds); } } free(drs); } dbg->dbgp_drscnt = 0; dbg->dbgp_drspos = NULL; }
Upload File
Create Folder