Change the way ELF file are parsed 00/237600/9
authorMateusz Moscicki <m.moscicki2@partner.samsung.com>
Tue, 30 Jun 2020 08:47:26 +0000 (10:47 +0200)
committerMateusz Moscicki <m.moscicki2@partner.samsung.com>
Fri, 17 Jul 2020 10:25:57 +0000 (12:25 +0200)
Change-Id: I737ec17f8a5a6e71efe24f7f44ad1e08775d24b7

12 files changed:
packaging/crash-worker.spec
src/crash-stack/CMakeLists.txt
src/crash-stack/crash-stack-arm.c
src/crash-stack/crash-stack-libunw.c
src/crash-stack/crash-stack.c
src/crash-stack/crash-stack.h
src/crash-stack/dwarf.h [new file with mode: 0644]
src/crash-stack/unwind.c
src/livedumper/CMakeLists.txt
src/livedumper/core.hpp
src/livedumper/helpers.hpp
src/livedumper/main.cpp

index b13960b..d0abb12 100644 (file)
@@ -28,7 +28,6 @@ BuildRequires:  pkgconfig(rpm)
 BuildRequires:  cmake
 BuildRequires:  pkgconfig(pkgmgr-info)
 BuildRequires:  pkgconfig(libunwind-generic)
-BuildRequires:  libelf-devel libelf
 BuildRequires:  libdw-devel libdw
 BuildRequires:  libcap-devel
 BuildRequires:  pkgconfig(json-c)
@@ -45,7 +44,6 @@ Requires(post): coreutils
 Requires(post): tar
 Requires(post): gzip
 Requires:       zip
-Requires:       libelf
 Requires:       libdw
 Requires:       minicoredumper >= 2.1.0
 Requires:       %{_bindir}/buxton2ctl
index b996dfb..34b42b0 100644 (file)
@@ -4,7 +4,7 @@ set(CRASH_STACK_BIN "crash-stack")
 
 # Common source code files
 INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src)
-set(CRASH_STACK_SRCS crash-stack.c crash-stack-libunw.c unwind.c proc.c mem_map.c ${CMAKE_SOURCE_DIR}/src/shared/util.c report_info.c)
+set(CRASH_STACK_SRCS crash-stack.c crash-stack-libunw.c unwind.c proc.c mem_map.c ${CMAKE_SOURCE_DIR}/src/shared/util.c ${CMAKE_SOURCE_DIR}/src/shared/telf.c report_info.c)
 
 # Add architecture dependent source files
 if (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64")
@@ -34,7 +34,7 @@ pkg_check_modules(JSON REQUIRED json-c)
 set_property(TARGET ${CRASH_STACK_BIN} APPEND_STRING PROPERTY COMPILE_FLAGS "${JSON_CFLAGS} ${LIBUNWIND_CFLAGS} ${DLOG_CFLAGS}")
 
 # Linking
-target_link_libraries(${CRASH_STACK_BIN} ${DLOG_LIBRARIES} ${LIBUNWIND_LIBRARIES} ${EBL_LIBRARY} ${JSON_LIBRARIES} elf dl stdc++)
+target_link_libraries(${CRASH_STACK_BIN} ${DLOG_LIBRARIES} ${LIBUNWIND_LIBRARIES} ${EBL_LIBRARY} ${JSON_LIBRARIES} dl stdc++)
 
 # Installing
 install(TARGETS ${CRASH_STACK_BIN} DESTINATION libexec)
index 1d3a3f9..81e0de3 100644 (file)
@@ -26,6 +26,8 @@
 #include "shared/log.h"
 #include "shared/util.h"
 
+#include <elf.h>
+#include <stdio.h>
 #include <string.h>
 #include <sys/user.h>
 
  * @brief Important registers for unwinding stack on ARM
  */
 struct Regs {
-       Dwarf_Addr regs[REGS_REGULAR_NUM];              ///< regular registers
-       Dwarf_Addr sp;                                                  ///< register: stack pointer
-       Dwarf_Addr lr;                                                  ///< register: link register
-       Dwarf_Addr pc;                                                  ///< register: program counter
-       Dwarf_Addr spsr;                                                ///< register: status register
+       Elf64_Addr regs[REGS_REGULAR_NUM];              ///< regular registers
+       Elf64_Addr sp;                                                  ///< register: stack pointer
+       Elf64_Addr lr;                                                  ///< register: link register
+       Elf64_Addr pc;                                                  ///< register: program counter
+       Elf64_Addr spsr;                                                ///< register: status register
 };
 
 typedef struct Regs Regs;                                      ///< convenience type definition
index 1ed1fa9..0ef9b74 100644 (file)
@@ -31,7 +31,7 @@
 
 #define MAXPROCNAMELEN 1024
 
-void _create_crash_stack(Dwfl *dwfl, pid_t pid, Callstack *callstack, elf_gregset_t *regs)
+void _create_crash_stack(void *dwfl, pid_t pid, Callstack *callstack, elf_gregset_t *regs)
 {
        // reimplemented based on libunwind tests/test-ptrace.c file
        unw_addr_space_t as = 0;
index 8f00241..7b1d05f 100644 (file)
@@ -31,7 +31,6 @@
 #include <fcntl.h>
 #include <getopt.h>
 #include <json-c/json.h>
-#include <libelf.h>
 #include <limits.h>
 #include <linux/prctl.h>
 #include <stdio.h>
@@ -601,8 +600,6 @@ int main(int argc, char **argv)
 
        argc -= optind;
 
-       elf_version(EV_CURRENT);
-
        /* Executable File Path */
        __crash_stack_print_exe(j_root, pid);
 
index dc07897..06a95b6 100644 (file)
@@ -26,7 +26,7 @@
 
 #define LOG_TAG "CRASH_STACK"
 #include <stdint.h>
-#include <elfutils/libdwfl.h>
+// #include <elfutils/libdwfl.h>
 #include <json-c/json.h>
 #include <libunwind.h>
 #include <sys/procfs.h>
@@ -119,7 +119,7 @@ void *_get_place_for_register_value(const char *regname, int regnum);
  * @param callstack pointer to call stack database; results are put here
  * @param regs pointer to registers of the analyzed process
  */
-void _create_crash_stack(Dwfl *dwfl, pid_t pid, Callstack *callstack, elf_gregset_t *regs);
+void _create_crash_stack(void *dwfl, pid_t pid, Callstack *callstack, elf_gregset_t *regs);
 
 /**
  * @brief Gets allocated space for getting target registers.
diff --git a/src/crash-stack/dwarf.h b/src/crash-stack/dwarf.h
new file mode 100644 (file)
index 0000000..8f37335
--- /dev/null
@@ -0,0 +1,652 @@
+/*-
+ * Copyright (c) 2007 John Birrell (jb@freebsd.org)
+ * 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.
+ *
+ * $Id: dwarf.h 3749 2019-06-28 01:10:44Z emaste $
+ */
+
+#ifndef        _DWARF_H_
+#define        _DWARF_H_
+
+#define DW_TAG_array_type              0x01
+#define DW_TAG_class_type              0x02
+#define DW_TAG_entry_point             0x03
+#define DW_TAG_enumeration_type                0x04
+#define DW_TAG_formal_parameter                0x05
+#define DW_TAG_imported_declaration    0x08
+#define DW_TAG_label                   0x0a
+#define DW_TAG_lexical_block           0x0b
+#define DW_TAG_member                  0x0d
+#define DW_TAG_pointer_type            0x0f
+#define DW_TAG_reference_type          0x10
+#define DW_TAG_compile_unit            0x11
+#define DW_TAG_string_type             0x12
+#define DW_TAG_structure_type          0x13
+#define DW_TAG_subroutine_type         0x15
+#define DW_TAG_typedef                 0x16
+#define DW_TAG_union_type              0x17
+#define DW_TAG_unspecified_parameters  0x18
+#define DW_TAG_variant                 0x19
+#define DW_TAG_common_block            0x1a
+#define DW_TAG_common_inclusion                0x1b
+#define DW_TAG_inheritance             0x1c
+#define DW_TAG_inlined_subroutine      0x1d
+#define DW_TAG_module                  0x1e
+#define DW_TAG_ptr_to_member_type      0x1f
+#define DW_TAG_set_type                        0x20
+#define DW_TAG_subrange_type           0x21
+#define DW_TAG_with_stmt               0x22
+#define DW_TAG_access_declaration      0x23
+#define DW_TAG_base_type               0x24
+#define DW_TAG_catch_block             0x25
+#define DW_TAG_const_type              0x26
+#define DW_TAG_constant                        0x27
+#define DW_TAG_enumerator              0x28
+#define DW_TAG_friend                  0x2a
+#define DW_TAG_namelist                        0x2b
+#define DW_TAG_namelist_item           0x2c
+#define DW_TAG_packed_type             0x2d
+#define DW_TAG_subprogram              0x2e
+#define DW_TAG_template_type_parameter 0x2f
+#define DW_TAG_template_type_param     0x2f
+#define DW_TAG_template_value_parameter        0x30
+#define DW_TAG_template_value_param    0x30
+#define DW_TAG_thrown_type             0x31
+#define DW_TAG_try_block               0x32
+#define DW_TAG_variant_part            0x33
+#define DW_TAG_variable                        0x34
+#define DW_TAG_volatile_type           0x35
+#define DW_TAG_dwarf_procedure          0x36
+#define DW_TAG_restrict_type            0x37
+#define DW_TAG_interface_type           0x38
+#define DW_TAG_namespace                0x39
+#define DW_TAG_imported_module          0x3a
+#define DW_TAG_unspecified_type         0x3b
+#define DW_TAG_partial_unit             0x3c
+#define DW_TAG_imported_unit            0x3d
+#define DW_TAG_condition                0x3f
+#define DW_TAG_shared_type              0x40
+#define DW_TAG_type_unit               0x41
+#define DW_TAG_rvalue_reference_type   0x42
+#define DW_TAG_template_alias          0x43
+#define DW_TAG_lo_user                 0x4080
+#define DW_TAG_hi_user                 0xffff
+
+/* GNU extensions. */
+#define        DW_TAG_format_label             0x4101
+#define        DW_TAG_function_template        0x4102
+#define        DW_TAG_class_template           0x4103
+#define        DW_TAG_GNU_BINCL                0x4104
+#define        DW_TAG_GNU_EINCL                0x4105
+#define        DW_TAG_GNU_template_template_parameter  0x4106
+#define        DW_TAG_GNU_template_template_param      0x4106
+#define        DW_TAG_GNU_template_parameter_pack      0x4107
+#define        DW_TAG_GNU_formal_parameter_pack        0x4108
+#define        DW_TAG_GNU_call_site                    0x4109
+#define        DW_TAG_GNU_call_site_parameter          0x410a
+
+#define DW_CHILDREN_no                 0x00
+#define DW_CHILDREN_yes                        0x01
+
+#define DW_AT_sibling                  0x01
+#define DW_AT_location                 0x02
+#define DW_AT_name                     0x03
+#define DW_AT_ordering                 0x09
+#define DW_AT_subscr_data              0x0a
+#define DW_AT_byte_size                        0x0b
+#define DW_AT_bit_offset               0x0c
+#define DW_AT_bit_size                 0x0d
+#define DW_AT_element_list             0x0f
+#define DW_AT_stmt_list                        0x10
+#define DW_AT_low_pc                   0x11
+#define DW_AT_high_pc                  0x12
+#define DW_AT_language                 0x13
+#define DW_AT_member                   0x14
+#define DW_AT_discr                    0x15
+#define DW_AT_discr_value              0x16
+#define DW_AT_visibility               0x17
+#define DW_AT_import                   0x18
+#define DW_AT_string_length            0x19
+#define DW_AT_common_reference         0x1a
+#define DW_AT_comp_dir                 0x1b
+#define DW_AT_const_value              0x1c
+#define DW_AT_containing_type          0x1d
+#define DW_AT_default_value            0x1e
+#define DW_AT_inline                   0x20
+#define DW_AT_is_optional              0x21
+#define DW_AT_lower_bound              0x22
+#define DW_AT_producer                 0x25
+#define DW_AT_prototyped               0x27
+#define DW_AT_return_addr              0x2a
+#define DW_AT_start_scope              0x2c
+#define DW_AT_bit_stride               0x2e
+#define DW_AT_stride_size              0x2e
+#define DW_AT_upper_bound              0x2f
+#define DW_AT_abstract_origin          0x31
+#define DW_AT_accessibility            0x32
+#define DW_AT_address_class            0x33
+#define DW_AT_artificial               0x34
+#define DW_AT_base_types               0x35
+#define DW_AT_calling_convention       0x36
+#define DW_AT_count                    0x37
+#define DW_AT_data_member_location     0x38
+#define DW_AT_decl_column              0x39
+#define DW_AT_decl_file                        0x3a
+#define DW_AT_decl_line                        0x3b
+#define DW_AT_declaration              0x3c
+#define DW_AT_discr_list               0x3d
+#define DW_AT_encoding                 0x3e
+#define DW_AT_external                 0x3f
+#define DW_AT_frame_base               0x40
+#define DW_AT_friend                   0x41
+#define DW_AT_identifier_case          0x42
+#define DW_AT_macro_info               0x43
+#define DW_AT_namelist_item            0x44
+#define DW_AT_priority                 0x45
+#define DW_AT_segment                  0x46
+#define DW_AT_specification            0x47
+#define DW_AT_static_link              0x48
+#define DW_AT_type                     0x49
+#define DW_AT_use_location             0x4a
+#define DW_AT_variable_parameter       0x4b
+#define DW_AT_virtuality               0x4c
+#define DW_AT_vtable_elem_location     0x4d
+#define DW_AT_allocated                        0x4e
+#define DW_AT_associated               0x4f
+#define DW_AT_data_location            0x50
+#define DW_AT_byte_stride              0x51
+#define DW_AT_entry_pc                 0x52
+#define DW_AT_use_UTF8                 0x53
+#define DW_AT_extension                        0x54
+#define DW_AT_ranges                   0x55
+#define DW_AT_trampoline               0x56
+#define DW_AT_call_column              0x57
+#define DW_AT_call_file                        0x58
+#define DW_AT_call_line                        0x59
+#define DW_AT_description              0x5a
+#define DW_AT_binary_scale             0x5b
+#define DW_AT_decimal_scale            0x5c
+#define DW_AT_small                    0x5d
+#define DW_AT_decimal_sign             0x5e
+#define DW_AT_digit_count              0x5f
+#define DW_AT_picture_string           0x60
+#define DW_AT_mutable                  0x61
+#define DW_AT_threads_scaled           0x62
+#define DW_AT_explicit                 0x63
+#define DW_AT_object_pointer           0x64
+#define DW_AT_endianity                        0x65
+#define DW_AT_elemental                        0x66
+#define DW_AT_pure                     0x67
+#define DW_AT_recursive                        0x68
+#define DW_AT_signature                        0x69
+#define DW_AT_main_subprogram          0x6a
+#define DW_AT_data_bit_offset          0x6b
+#define DW_AT_const_expr               0x6c
+#define DW_AT_enum_class               0x6d
+#define DW_AT_linkage_name             0x6e
+#define DW_AT_lo_user                  0x2000
+#define DW_AT_hi_user                  0x3fff
+
+/* SGI/MIPS extensions. */
+#define DW_AT_MIPS_fde                         0x2001
+#define DW_AT_MIPS_loop_begin                  0x2002
+#define DW_AT_MIPS_tail_loop_begin             0x2003
+#define DW_AT_MIPS_epilog_begin                        0x2004
+#define DW_AT_MIPS_loop_unroll_factor          0x2005
+#define DW_AT_MIPS_software_pipeline_depth     0x2006
+#define DW_AT_MIPS_linkage_name                        0x2007
+#define DW_AT_MIPS_stride                      0x2008
+#define DW_AT_MIPS_abstract_name               0x2009
+#define DW_AT_MIPS_clone_origin                        0x200a
+#define DW_AT_MIPS_has_inlines                 0x200b
+#define DW_AT_MIPS_stride_byte                 0x200c
+#define DW_AT_MIPS_stride_elem                 0x200d
+#define DW_AT_MIPS_ptr_dopetype                        0x200e
+#define DW_AT_MIPS_allocatable_dopetype                0x200f
+#define DW_AT_MIPS_assumed_shape_dopetype      0x2010
+#define DW_AT_MIPS_assumed_size                        0x2011
+
+/* GNU extensions. */
+#define        DW_AT_sf_names                          0x2101
+#define        DW_AT_src_info                          0x2102
+#define        DW_AT_mac_info                          0x2103
+#define        DW_AT_src_coords                        0x2104
+#define        DW_AT_body_begin                        0x2105
+#define        DW_AT_body_end                          0x2106
+#define        DW_AT_GNU_vector                        0x2107
+#define        DW_AT_GNU_guarded_by                    0x2108
+#define        DW_AT_GNU_pt_guarded_by                 0x2109
+#define        DW_AT_GNU_guarded                       0x210a
+#define        DW_AT_GNU_pt_guarded                    0x210b
+#define        DW_AT_GNU_locks_excluded                0x210c
+#define        DW_AT_GNU_exclusive_locks_required      0x210d
+#define        DW_AT_GNU_shared_locks_required         0x210e
+#define        DW_AT_GNU_odr_signature                 0x210f
+#define        DW_AT_GNU_template_name                 0x2110
+#define        DW_AT_GNU_call_site_value               0x2111
+#define        DW_AT_GNU_call_site_data_value          0x2112
+#define        DW_AT_GNU_call_site_target              0x2113
+#define        DW_AT_GNU_call_site_target_clobbered    0x2114
+#define        DW_AT_GNU_tail_call                     0x2115
+#define        DW_AT_GNU_all_tail_call_sites           0x2116
+#define        DW_AT_GNU_all_call_sites                0x2117
+#define        DW_AT_GNU_all_source_call_sites         0x2118
+
+/* Apple extensions. */
+#define        DW_AT_APPLE_optimized                   0x3fe1
+#define        DW_AT_APPLE_flags                       0x3fe2
+#define        DW_AT_APPLE_isa                         0x3fe3
+#define        DW_AT_APPLE_block                       0x3fe4
+#define        DW_AT_APPLE_major_runtime_vers          0x3fe5
+#define        DW_AT_APPLE_runtime_class               0x3fe6
+#define        DW_AT_APPLE_omit_frame_ptr              0x3fe7
+#define        DW_AT_APPLE_property_name               0x3fe8
+#define        DW_AT_APPLE_property_getter             0x3fe9
+#define        DW_AT_APPLE_property_setter             0x3fea
+#define        DW_AT_APPLE_property_attribute          0x3feb
+#define        DW_AT_APPLE_objc_complete_type          0x3fec
+#define        DW_AT_APPLE_property                    0x3fed
+
+#define DW_FORM_addr                   0x01
+#define DW_FORM_block2                 0x03
+#define DW_FORM_block4                 0x04
+#define DW_FORM_data2                  0x05
+#define DW_FORM_data4                  0x06
+#define DW_FORM_data8                  0x07
+#define DW_FORM_string                 0x08
+#define DW_FORM_block                  0x09
+#define DW_FORM_block1                 0x0a
+#define DW_FORM_data1                  0x0b
+#define DW_FORM_flag                   0x0c
+#define DW_FORM_sdata                  0x0d
+#define DW_FORM_strp                   0x0e
+#define DW_FORM_udata                  0x0f
+#define DW_FORM_ref_addr               0x10
+#define DW_FORM_ref1                   0x11
+#define DW_FORM_ref2                   0x12
+#define DW_FORM_ref4                   0x13
+#define DW_FORM_ref8                   0x14
+#define DW_FORM_ref_udata              0x15
+#define DW_FORM_indirect               0x16
+#define DW_FORM_sec_offset             0x17
+#define DW_FORM_exprloc                        0x18
+#define DW_FORM_flag_present           0x19
+#define DW_FORM_ref_sig8               0x20
+#define        DW_FORM_GNU_ref_alt             0x1f20
+#define        DW_FORM_GNU_strp_alt            0x1f21
+
+#define DW_OP_addr                     0x03
+#define DW_OP_deref                    0x06
+#define DW_OP_const1u                  0x08
+#define DW_OP_const1s                  0x09
+#define DW_OP_const2u                  0x0a
+#define DW_OP_const2s                  0x0b
+#define DW_OP_const4u                  0x0c
+#define DW_OP_const4s                  0x0d
+#define DW_OP_const8u                  0x0e
+#define DW_OP_const8s                  0x0f
+#define DW_OP_constu                   0x10
+#define DW_OP_consts                   0x11
+#define DW_OP_dup                      0x12
+#define DW_OP_drop                     0x13
+#define DW_OP_over                     0x14
+#define DW_OP_pick                     0x15
+#define DW_OP_swap                     0x16
+#define DW_OP_rot                      0x17
+#define DW_OP_xderef                   0x18
+#define DW_OP_abs                      0x19
+#define DW_OP_and                      0x1a
+#define DW_OP_div                      0x1b
+#define DW_OP_minus                    0x1c
+#define DW_OP_mod                      0x1d
+#define DW_OP_mul                      0x1e
+#define DW_OP_neg                      0x1f
+#define DW_OP_not                      0x20
+#define DW_OP_or                       0x21
+#define DW_OP_plus                     0x22
+#define DW_OP_plus_uconst              0x23
+#define DW_OP_shl                      0x24
+#define DW_OP_shr                      0x25
+#define DW_OP_shra                     0x26
+#define DW_OP_xor                      0x27
+#define DW_OP_bra                      0x28
+#define DW_OP_eq                       0x29
+#define DW_OP_ge                       0x2a
+#define DW_OP_gt                       0x2b
+#define DW_OP_le                       0x2c
+#define DW_OP_lt                       0x2d
+#define DW_OP_ne                       0x2e
+#define DW_OP_skip                     0x2f
+#define DW_OP_lit0                     0x30
+#define DW_OP_lit1                     0x31
+#define DW_OP_lit2                     0x32
+#define DW_OP_lit3                     0x33
+#define DW_OP_lit4                     0x34
+#define DW_OP_lit5                     0x35
+#define DW_OP_lit6                     0x36
+#define DW_OP_lit7                     0x37
+#define DW_OP_lit8                     0x38
+#define DW_OP_lit9                     0x39
+#define DW_OP_lit10                    0x3a
+#define DW_OP_lit11                    0x3b
+#define DW_OP_lit12                    0x3c
+#define DW_OP_lit13                    0x3d
+#define DW_OP_lit14                    0x3e
+#define DW_OP_lit15                    0x3f
+#define DW_OP_lit16                    0x40
+#define DW_OP_lit17                    0x41
+#define DW_OP_lit18                    0x42
+#define DW_OP_lit19                    0x43
+#define DW_OP_lit20                    0x44
+#define DW_OP_lit21                    0x45
+#define DW_OP_lit22                    0x46
+#define DW_OP_lit23                    0x47
+#define DW_OP_lit24                    0x48
+#define DW_OP_lit25                    0x49
+#define DW_OP_lit26                    0x4a
+#define DW_OP_lit27                    0x4b
+#define DW_OP_lit28                    0x4c
+#define DW_OP_lit29                    0x4d
+#define DW_OP_lit30                    0x4e
+#define DW_OP_lit31                    0x4f
+#define DW_OP_reg0                     0x50
+#define DW_OP_reg1                     0x51
+#define DW_OP_reg2                     0x52
+#define DW_OP_reg3                     0x53
+#define DW_OP_reg4                     0x54
+#define DW_OP_reg5                     0x55
+#define DW_OP_reg6                     0x56
+#define DW_OP_reg7                     0x57
+#define DW_OP_reg8                     0x58
+#define DW_OP_reg9                     0x59
+#define DW_OP_reg10                    0x5a
+#define DW_OP_reg11                    0x5b
+#define DW_OP_reg12                    0x5c
+#define DW_OP_reg13                    0x5d
+#define DW_OP_reg14                    0x5e
+#define DW_OP_reg15                    0x5f
+#define DW_OP_reg16                    0x60
+#define DW_OP_reg17                    0x61
+#define DW_OP_reg18                    0x62
+#define DW_OP_reg19                    0x63
+#define DW_OP_reg20                    0x64
+#define DW_OP_reg21                    0x65
+#define DW_OP_reg22                    0x66
+#define DW_OP_reg23                    0x67
+#define DW_OP_reg24                    0x68
+#define DW_OP_reg25                    0x69
+#define DW_OP_reg26                    0x6a
+#define DW_OP_reg27                    0x6b
+#define DW_OP_reg28                    0x6c
+#define DW_OP_reg29                    0x6d
+#define DW_OP_reg30                    0x6e
+#define DW_OP_reg31                    0x6f
+#define DW_OP_breg0                    0x70
+#define DW_OP_breg1                    0x71
+#define DW_OP_breg2                    0x72
+#define DW_OP_breg3                    0x73
+#define DW_OP_breg4                    0x74
+#define DW_OP_breg5                    0x75
+#define DW_OP_breg6                    0x76
+#define DW_OP_breg7                    0x77
+#define DW_OP_breg8                    0x78
+#define DW_OP_breg9                    0x79
+#define DW_OP_breg10                   0x7a
+#define DW_OP_breg11                   0x7b
+#define DW_OP_breg12                   0x7c
+#define DW_OP_breg13                   0x7d
+#define DW_OP_breg14                   0x7e
+#define DW_OP_breg15                   0x7f
+#define DW_OP_breg16                   0x80
+#define DW_OP_breg17                   0x81
+#define DW_OP_breg18                   0x82
+#define DW_OP_breg19                   0x83
+#define DW_OP_breg20                   0x84
+#define DW_OP_breg21                   0x85
+#define DW_OP_breg22                   0x86
+#define DW_OP_breg23                   0x87
+#define DW_OP_breg24                   0x88
+#define DW_OP_breg25                   0x89
+#define DW_OP_breg26                   0x8a
+#define DW_OP_breg27                   0x8b
+#define DW_OP_breg28                   0x8c
+#define DW_OP_breg29                   0x8d
+#define DW_OP_breg30                   0x8e
+#define DW_OP_breg31                   0x8f
+#define DW_OP_regx                     0x90
+#define DW_OP_fbreg                    0x91
+#define DW_OP_bregx                    0x92
+#define DW_OP_piece                    0x93
+#define DW_OP_deref_size               0x94
+#define DW_OP_xderef_size              0x95
+#define DW_OP_nop                      0x96
+#define DW_OP_push_object_address      0x97
+#define DW_OP_call2                    0x98
+#define DW_OP_call4                    0x99
+#define DW_OP_call_ref                 0x9a
+#define DW_OP_form_tls_address         0x9b
+#define DW_OP_call_frame_cfa           0x9c
+#define DW_OP_bit_piece                        0x9d
+#define DW_OP_implicit_value           0x9e
+#define DW_OP_stack_value              0x9f
+#define DW_OP_lo_user                  0xe0
+#define DW_OP_hi_user                  0xff
+
+/* GNU extensions. */
+#define        DW_OP_GNU_push_tls_address      0xe0
+#define        DW_OP_GNU_uninit                0xf0
+#define        DW_OP_GNU_encoded_addr          0xf1
+#define        DW_OP_GNU_implicit_pointer      0xf2
+#define        DW_OP_GNU_entry_value           0xf3
+#define        DW_OP_GNU_const_type            0xf4
+#define        DW_OP_GNU_regval_type           0xf5
+#define        DW_OP_GNU_deref_type            0xf6
+#define        DW_OP_GNU_convert               0xf7
+#define        DW_OP_GNU_reinterpret           0xf9
+#define        DW_OP_GNU_parameter_ref         0xfa
+#define        DW_OP_GNU_addr_index            0xfb
+#define        DW_OP_GNU_const_index           0xfc
+
+#define DW_ATE_address                 0x1
+#define DW_ATE_boolean                 0x2
+#define DW_ATE_complex_float           0x3
+#define DW_ATE_float                   0x4
+#define DW_ATE_signed                  0x5
+#define DW_ATE_signed_char             0x6
+#define DW_ATE_unsigned                        0x7
+#define DW_ATE_unsigned_char           0x8
+#define DW_ATE_imaginary_float         0x9
+#define DW_ATE_packed_decimal          0xa
+#define DW_ATE_numeric_string          0xb
+#define DW_ATE_edited                  0xc
+#define DW_ATE_signed_fixed            0xd
+#define DW_ATE_unsigned_fixed          0xe
+#define DW_ATE_decimal_float           0xf
+#define DW_ATE_lo_user                 0x80
+#define DW_ATE_hi_user                 0xff
+
+#define DW_ACCESS_public               0x01
+#define DW_ACCESS_protected            0x02
+#define DW_ACCESS_private              0x03
+
+#define        DW_END_default                  0x00
+#define        DW_END_big                      0x01
+#define        DW_END_little                   0x02
+#define        DW_END_lo_user                  0x40
+#define        DW_END_high_user                0xff
+
+#define DW_VIS_local                   0x01
+#define DW_VIS_exported                        0x02
+#define DW_VIS_qualified               0x03
+
+#define DW_VIRTUALITY_none             0x00
+#define DW_VIRTUALITY_virtual          0x01
+#define DW_VIRTUALITY_pure_virtual     0x02
+
+#define DW_LANG_C89                    0x0001
+#define DW_LANG_C                      0x0002
+#define DW_LANG_Ada83                  0x0003
+#define DW_LANG_C_plus_plus            0x0004
+#define DW_LANG_Cobol74                        0x0005
+#define DW_LANG_Cobol85                        0x0006
+#define DW_LANG_Fortran77              0x0007
+#define DW_LANG_Fortran90              0x0008
+#define DW_LANG_Pascal83               0x0009
+#define DW_LANG_Modula2                        0x000a
+#define DW_LANG_Java                   0x000b
+#define DW_LANG_C99                    0x000c
+#define DW_LANG_Ada95                  0x000d
+#define DW_LANG_Fortran95              0x000e
+#define DW_LANG_PLI                    0x000f
+#define DW_LANG_ObjC                   0x0010
+#define DW_LANG_ObjC_plus_plus         0x0011
+#define DW_LANG_UPC                    0x0012
+#define DW_LANG_D                      0x0013
+#define DW_LANG_Python                 0x0014
+#define DW_LANG_OpenCL                 0x0015
+#define DW_LANG_Go                     0x0016
+#define DW_LANG_Modula3                        0x0017
+#define DW_LANG_Haskell                        0x0018
+#define DW_LANG_C_plus_plus_03         0x0019
+#define DW_LANG_C_plus_plus_11         0x001a
+#define DW_LANG_OCaml                  0x001b
+#define DW_LANG_Rust                   0x001c
+#define DW_LANG_C11                    0x001d
+#define DW_LANG_Swift                  0x001e
+#define DW_LANG_Julia                  0x001f
+#define DW_LANG_Dylan                  0x0020
+#define DW_LANG_C_plus_plus_14         0x0021
+#define DW_LANG_Fortran03              0x0022
+#define DW_LANG_Fortran08              0x0023
+#define DW_LANG_RenderScript           0x0024
+#define DW_LANG_BLISS                  0x0025
+#define DW_LANG_lo_user                        0x8000
+#define DW_LANG_Mips_Assembler         0x8001
+#define DW_LANG_hi_user                        0xffff
+
+#define DW_ID_case_sensitive           0x00
+#define DW_ID_up_case                  0x01
+#define DW_ID_down_case                        0x02
+#define DW_ID_case_insensitive         0x03
+
+#define DW_CC_normal                   0x01
+#define DW_CC_program                  0x02
+#define DW_CC_nocall                   0x03
+#define DW_CC_lo_user                  0x40
+#define DW_CC_hi_user                  0xff
+
+#define DW_INL_not_inlined             0x00
+#define DW_INL_inlined                 0x01
+#define DW_INL_declared_not_inlined    0x02
+#define DW_INL_declared_inlined                0x03
+
+#define DW_ORD_row_major               0x00
+#define DW_ORD_col_major               0x01
+
+#define        DW_DS_unsigned                  0x01
+#define        DW_DS_leading_overpunch         0x02
+#define        DW_DS_trailing_overpunch        0x03
+#define        DW_DS_leading_separate          0x04
+#define        DW_DS_trailing_separate         0x05
+
+#define DW_DSC_label                   0x00
+#define DW_DSC_range                   0x01
+
+#define DW_LNS_copy                    0x01
+#define DW_LNS_advance_pc              0x02
+#define DW_LNS_advance_line            0x03
+#define DW_LNS_set_file                        0x04
+#define DW_LNS_set_column              0x05
+#define DW_LNS_negate_stmt             0x06
+#define DW_LNS_set_basic_block         0x07
+#define DW_LNS_const_add_pc            0x08
+#define DW_LNS_fixed_advance_pc                0x09
+#define DW_LNS_set_prologue_end                0x0a
+#define DW_LNS_set_epilogue_begin      0x0b
+#define DW_LNS_set_isa                 0x0c
+
+#define DW_LNE_end_sequence            0x01
+#define DW_LNE_set_address             0x02
+#define DW_LNE_define_file             0x03
+#define DW_LNE_lo_user                 0x80
+#define DW_LNE_hi_user                 0xff
+
+#define DW_MACINFO_define              0x01
+#define DW_MACINFO_undef               0x02
+#define DW_MACINFO_start_file          0x03
+#define DW_MACINFO_end_file            0x04
+#define DW_MACINFO_vendor_ext          0xff
+
+#define DW_CFA_advance_loc             0x40
+#define DW_CFA_offset                  0x80
+#define DW_CFA_restore                 0xc0
+#define DW_CFA_extended                        0
+
+#define DW_CFA_nop                     0x00
+#define DW_CFA_set_loc                 0x01
+#define DW_CFA_advance_loc1            0x02
+#define DW_CFA_advance_loc2            0x03
+#define DW_CFA_advance_loc4            0x04
+#define DW_CFA_offset_extended                 0x05
+#define DW_CFA_restore_extended        0x06
+#define DW_CFA_undefined               0x07
+#define DW_CFA_same_value              0x08
+#define DW_CFA_register                        0x09
+#define DW_CFA_remember_state          0x0a
+#define DW_CFA_restore_state           0x0b
+#define DW_CFA_def_cfa                 0x0c
+#define DW_CFA_def_cfa_register        0x0d
+#define DW_CFA_def_cfa_offset          0x0e
+#define DW_CFA_def_cfa_expression      0x0f
+#define DW_CFA_expression              0x10
+#define DW_CFA_offset_extended_sf      0x11
+#define DW_CFA_def_cfa_sf              0x12
+#define DW_CFA_def_cfa_offset_sf       0x13
+#define DW_CFA_val_offset              0x14
+#define DW_CFA_val_offset_sf           0x15
+#define DW_CFA_val_expression          0x16
+#define DW_CFA_lo_user                 0x1c
+#define DW_CFA_high_user               0x3f
+
+/*
+ * LSB(Linux Standard Base) extension to DWARF2.
+ */
+
+#define        DW_EH_PE_absptr                 0x00
+#define        DW_EH_PE_uleb128                0x01
+#define        DW_EH_PE_udata2                 0x02
+#define        DW_EH_PE_udata4                 0x03
+#define        DW_EH_PE_udata8                 0x04
+#define        DW_EH_PE_sleb128                0x09
+#define        DW_EH_PE_sdata2                 0x0a
+#define        DW_EH_PE_sdata4                 0x0b
+#define        DW_EH_PE_sdata8                 0x0c
+#define        DW_EH_PE_pcrel                  0x10
+#define        DW_EH_PE_textrel                0x20
+#define        DW_EH_PE_datarel                0x30
+#define        DW_EH_PE_funcrel                0x40
+#define        DW_EH_PE_aligned                0x50
+#define        DW_EH_PE_omit                   0xff
+
+#endif /* !_DWARF_H_ */
index d372bbe..30109fb 100644 (file)
@@ -27,9 +27,6 @@
  * DAMAGE.
  */
 
-#include <dwarf.h>
-#include <gelf.h>
-#include <libelf.h>
 #include <libgen.h>
 #include <libunwind.h>
 #include <stdio.h>
 #include <sys/user.h>
 #include <unistd.h>
 
+#include "dwarf.h"
 #include "mem_map.h"
 #include "proc.h"
 #include "crash-stack.h"
 
 #define LOG_TAG "CRASH_STACK"
 #include "shared/log.h"
+#include "shared/telf.h"
 
 size_t stack_size = 0xa00000;
 
@@ -76,16 +75,17 @@ static unsigned long eip = 0;
 static unsigned long esp = 0;
 static FILE *debug;
 
+
 static Elf *elf_start(int fd, char *image, uint64_t size)
 {
-    Elf *elf;
+    Elf *elf = malloc(sizeof(Elf));
 
     if (fd > 0) {
-        if ((elf = elf_begin(fd, TBSTACK_ELF_C_READ, NULL)) == NULL)
-            _E("elf_begin: %s", elf_errmsg(elf_errno()));
+        if (!teu_begin(fd, elf))
+            _E("elf_begin: %s", teu_errmsg(elf));
     } else {
-        if ((elf = elf_memory(image, size)) == NULL)
-            _E("elf_memory: %s", elf_errmsg(elf_errno()));
+        if (!teu_begin_memory(image, elf))
+            _E("elf_memory: %s", teu_errmsg(elf));
     }
 
     return elf;
@@ -99,40 +99,27 @@ static int find_exidx(int fd, char *image, uint64_t size,
                      uint64_t *table_data, uint64_t *table_len)
 {
     Elf *elf;
-    GElf_Ehdr ehdr;
-    Elf_Scn *scn = NULL;
-    GElf_Shdr shdr;
     uint64_t offset = 0;
 
     if ((elf = elf_start(fd, image, size)) == NULL)
         return -1;
 
-    if (gelf_getehdr(elf, &ehdr) == NULL) {
-        _E("elf_getehdr: %s", elf_errmsg(elf_errno()));
-        goto find_exidx_end;
-    }
+    for (size_t i = 0; i < elf->ehdr.e_shnum; i++) {
+        Elf64_Shdr shdr;
 
-    while ((scn = elf_nextscn(elf, scn)) != NULL) {
-        if (gelf_getshdr(scn, &shdr) == NULL) {
-            _E("elf_getshdr: %s", elf_errmsg(elf_errno()));
+        if (!teu_getshdr(elf, i, &shdr)) {
+            _E("Can not read section header: %s", teu_errmsg(elf));
             break;
         }
 
         if (shdr.sh_type == SHT_ARM_EXIDX) {
-            Elf_Data *data = NULL;
-
-            if ((data = elf_getdata(scn, data)) == NULL) {
-                _E("elf_getdata: %s", elf_errmsg(elf_errno()));
-                break;
-            }
-
             offset = *table_data = shdr.sh_offset;
            *table_len = shdr.sh_size;
         }
     }
 
-find_exidx_end:
-    elf_end(elf);
+    teu_close(elf);
+    free(elf);
     return (offset ? 0 : -1);
 }
 #else /* __arm__ */
@@ -252,35 +239,25 @@ static int find_eh_frame_hdr(int fd, char *image, uint64_t size,
         uint64_t *table_data, uint64_t *segbase, uint64_t *fde_count)
 {
     Elf *elf;
-    GElf_Ehdr ehdr;
-    Elf_Scn *scn = NULL;
-    GElf_Shdr shdr;
+    Elf64_Ehdr ehdr;
+    Elf64_Shdr shdr;
     uint64_t offset = 0;
 
     if ((elf = elf_start(fd, image, size)) == NULL)
         return -1;
 
-    if (gelf_getehdr(elf, &ehdr) == NULL) {
-        _E("elf_getehdr: %s", elf_errmsg(elf_errno()));
+    if (!teu_getehdr(elf, &ehdr)) {
+        _E("teu_getehdr: %s", teu_errmsg(elf));
         goto elf_section_offset_end;
     }
 
-    while ((scn = elf_nextscn(elf, scn)) != NULL) {
-        char *str;
-
-        if (gelf_getshdr(scn, &shdr) == NULL) {
-            _E("elf_getshdr: %s", elf_errmsg(elf_errno()));
+    for (size_t i = 0; i < elf->ehdr.e_shnum; i++) {
+        if (!teu_getshdr(elf, i, &shdr))
             break;
-        }
 
-        str = elf_strptr(elf, ehdr.e_shstrndx, shdr.sh_name);
+        char *str = teu_strptr(&elf, ehdr.e_shstrndx, shdr.sh_name);
         if (str != NULL && !strcmp(str, ".eh_frame_hdr")) {
-            Elf_Data *data = NULL;
-
-            if ((data = elf_getdata(scn, data)) == NULL) {
-                _E("elf_getdata: %s", elf_errmsg(elf_errno()));
-                break;
-            }
+            void *data = teu_getsdata(elf, &shdr);
 
             offset = *segbase = shdr.sh_offset;
             parse_eh_frame_hdr(data->d_buf, offset, table_data, fde_count);
@@ -289,7 +266,8 @@ static int find_eh_frame_hdr(int fd, char *image, uint64_t size,
     }
 
 elf_section_offset_end:
-    elf_end(elf);
+    teu_close(elf);
+    free(elf);
     return (offset ? 0 : -1);
 }
 #endif /* __arm__ */
@@ -315,7 +293,7 @@ static int find_unwind_table(int fd, char *image, uint64_t size,
  */
 struct symbols
 {
-    GElf_Sym *s_data;
+    Elf64_Sym *s_data;
     size_t s_size;
     size_t s_cap;
 };
@@ -323,22 +301,22 @@ struct symbols
 /*
  * add a symbol to array
  */
-static int push_symbol(struct symbols *array, const GElf_Sym *s)
+static int push_symbol(struct symbols *array, const Elf64_Sym *s)
 {
     ++array->s_size;
     if (array->s_size > array->s_cap) {
-        GElf_Sym *new_data;
+        Elf64_Sym *new_data;
         array->s_cap <<= 1;
-        new_data = malloc(sizeof(GElf_Sym) * array->s_cap);
+        new_data = malloc(sizeof(Elf64_Sym) * array->s_cap);
         if (new_data == NULL) {
             _E("malloc(): %m");
             return -1;
         }
-        memcpy(new_data, array->s_data, sizeof(GElf_Sym) * (array->s_size-1));
+        memcpy(new_data, array->s_data, sizeof(Elf64_Sym) * (array->s_size-1));
         free(array->s_data);
         array->s_data = new_data;
     }
-    memcpy(array->s_data + (array->s_size-1), s, sizeof(GElf_Sym));
+    memcpy(array->s_data + (array->s_size-1), s, sizeof(Elf64_Sym));
     return 0;
 }
 
@@ -347,8 +325,8 @@ static int push_symbol(struct symbols *array, const GElf_Sym *s)
  */
 static int sym_compar(const void *v1, const void *v2)
 {
-    const GElf_Sym *s1 = v1;
-    const GElf_Sym *s2 = v2;
+    const Elf64_Sym *s1 = v1;
+    const Elf64_Sym *s2 = v2;
 
     if (s1->st_value < s2->st_value)
         return -1;
@@ -370,7 +348,6 @@ static char *proc_name(int fd, char *image, size_t size, uint64_t load,
         uint64_t offset, uint64_t addr, unw_word_t *off)
 {
     Elf *elf;
-    Elf_Scn *scn = NULL;
     char *str = NULL;
     int rc = 0;
     struct symbols all;
@@ -388,17 +365,18 @@ static char *proc_name(int fd, char *image, size_t size, uint64_t load,
      */
     all.s_cap = 64;
     all.s_size = 0;
-    all.s_data = malloc(all.s_cap * sizeof(GElf_Sym));
+    all.s_data = malloc(all.s_cap * sizeof(Elf64_Sym));
 
     if (all.s_data == NULL)
            goto proc_name_end;
 
-    if (elf_getphdrnum (elf, &pnum))
+    pnum = elf->ehdr.e_phnum;
+    if (pnum == 0)
         goto proc_name_end;
 
     for (i = 0; i < pnum; ++i) {
-        GElf_Phdr phdr;
-        if (gelf_getphdr(elf, i, &phdr) == NULL)
+        Elf64_Phdr phdr;
+        if (!teu_getphdr(elf, i, &phdr))
             goto proc_name_end;
         if (phdr.p_type != PT_LOAD)
             continue;
@@ -419,30 +397,24 @@ static char *proc_name(int fd, char *image, size_t size, uint64_t load,
     /*
      * search symtab or dynsym section
      */
-    while ((scn = elf_nextscn(elf, scn)) != NULL) {
-        GElf_Shdr shdr;
+    for (size_t i = 0; i < elf->ehdr.e_shnum; i++) {
+        Elf64_Shdr shdr;
 
-        if (gelf_getshdr(scn, &shdr) == NULL) {
-            _E("elf_nextscn: %s", elf_errmsg(elf_errno()));
+        if (!teu_getshdr(elf, i, &shdr)) {
             goto proc_name_end;
         }
 
         if (shdr.sh_type == SHT_DYNSYM || shdr.sh_type == SHT_SYMTAB) {
-            Elf_Data *data = NULL;
             int symbol_count;
 
-            if ((data = elf_getdata(scn, data)) == NULL) {
-                _E("elf_getdata: %s", elf_errmsg(elf_errno()));
-                goto proc_name_end;
-            }
+            void *data = teu_getsdata(elf, &shdr);
 
             symbol_count = shdr.sh_size / shdr.sh_entsize;
             for (i = 0; i < (size_t)symbol_count; ++i) {
-                GElf_Sym s;
+                Elf64_Sym s;
 
-                if (gelf_getsym(data, i, &s) == NULL) {
-                    _E("elf_getsym: %s",
-                            elf_errmsg(elf_errno()));
+                if (!teu_getsym(elf, &shdr, i, data, &s)) {
+                    _E("teu_getsym: %s", teu_errmsg(elf));
                     rc = -1;
                     goto proc_name_end;
                 }
@@ -459,10 +431,9 @@ static char *proc_name(int fd, char *image, size_t size, uint64_t load,
                  * exact match
                  */
                 if (addr >= s.st_value && addr < (s.st_value + s.st_size)) {
-                    str = elf_strptr(elf, shdr.sh_link, s.st_name);
+                    str = teu_strptr(elf, shdr.sh_link, s.st_name);
                     if (str == NULL) {
-                        _E("elf_strptr #1: %s",
-                                elf_errmsg(elf_errno()));
+                        _E("teu_strptr #1: %s", teu_errmsg(elf));
                         rc = -1;
                         goto proc_name_end;
                     }
@@ -489,16 +460,15 @@ static char *proc_name(int fd, char *image, size_t size, uint64_t load,
      * one of zero size
      */
     if (!rc && str == NULL) {
-        qsort(all.s_data, all.s_size, sizeof(GElf_Sym), sym_compar);
+        qsort(all.s_data, all.s_size, sizeof(Elf64_Sym), sym_compar);
         for (i = 0; i < (all.s_size-1); ++i) {
-            const GElf_Sym *cur = all.s_data + i;
-            const GElf_Sym *next = all.s_data + i + 1;
+            const Elf64_Sym *cur = all.s_data + i;
+            const Elf64_Sym *next = all.s_data + i + 1;
             if (cur->st_size == 0) {
                 if (cur->st_value <= addr && addr < next->st_value) {
-                    str = elf_strptr(elf, cur->st_shndx, cur->st_name);
+                    str = teu_strptr(elf, cur->st_shndx, cur->st_name);
                     if (str == NULL) {
-                        _E("elf_strptr #2: %s",
-                                elf_errmsg(elf_errno()));
+                        _E("teu_strptr #2: %s", teu_errmsg(elf));
                         rc = -1;
                         goto proc_name_end;
                     }
@@ -512,7 +482,8 @@ static char *proc_name(int fd, char *image, size_t size, uint64_t load,
 
 proc_name_end:
     free(all.s_data);
-    elf_end(elf);
+    teu_close(elf);
+    free(elf);
     return str;
 }
 
index efdf65a..186f447 100644 (file)
@@ -4,9 +4,8 @@ project(livedumper CXX)
 set(LIVEDUMPER_BIN "livedumper")
 
 find_package( Boost 1.58 COMPONENTS system REQUIRED)
-include_directories ( ${Boost_INCLUDE_DIR} )
+include_directories ( ${Boost_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/src )
 set(PREFIX ${CMAKE_INSTALL_PREFIX})
-add_definitions(-std=c++11)
 
 # add_executable(${LIVEDUMPER_BIN} main.cpp)
 
@@ -16,7 +15,7 @@ else()
        set(LOGGER_FILE clog.cpp)
 endif(DLOG)
 
-set(LIVEDUMPER_SRCS main.cpp ${LOGGER_FILE})
+set(LIVEDUMPER_SRCS main.cpp ${LOGGER_FILE} ${CMAKE_SOURCE_DIR}/src/shared/telf.c)
 add_executable(${LIVEDUMPER_BIN} ${LIVEDUMPER_SRCS})
 set_property(TARGET ${LIVEDUMPER_BIN} APPEND_STRING PROPERTY COMPILE_FLAGS "-fPIE ")
 target_link_libraries(${LIVEDUMPER_BIN} -lelf -lthread_db -pie)
index e9ae8dc..3c3b7d2 100644 (file)
 #include "log.hpp"
 #include "note.hpp"
 #include "program.hpp"
+#include "shared/telf.h"
 
 #include <fcntl.h>
-#include <gelf.h>
 #include <inttypes.h>
-#include <libelf.h>
 #include <limits.h>
 #include <link.h>
 #include <sys/procfs.h>
@@ -274,9 +273,7 @@ class Core {
        }
 
        SymData* AllocSymData(const std::string &lib, unsigned long start, typename T::Word type) {
-               elf_version(EV_CURRENT);
                auto sym_data = new SymData();
-               Elf_Scn *scn = nullptr;
 
                sym_data->start = start;
                sym_data->fd = open(lib.c_str(), O_RDONLY);
@@ -286,29 +283,20 @@ class Core {
                        return nullptr;
                }
 
-               sym_data->elf = elf_begin(sym_data->fd, ELF_C_READ, nullptr);
+               sym_data->elf = new Elf();
+               teu_begin(sym_data->fd, sym_data->elf);
 
-               while (1) {
-                       GElf_Shdr *shdr;
-                       scn = elf_nextscn(sym_data->elf, scn);
-
-                       if (!scn) {
-                               elf_end(sym_data->elf);
-                               close(sym_data->fd);
-                               delete sym_data;
-                               logger.log_info("no sym data for %s", lib.c_str());
-                               return nullptr;
-                       }
-
-                       shdr = gelf_getshdr(scn, &sym_data->shdr);
-                       if (shdr && sym_data->shdr.sh_type == type)
+               for (size_t i = 0; i < sym_data->elf->ehdr.e_shnum; i++) {
+                       if (teu_getshdr(sym_data->elf, i, &sym_data->shdr) &&
+                                        sym_data->shdr.sh_type == type)
                                break;
                }
 
-               sym_data->data = elf_getdata(scn, nullptr);
+               sym_data->data = teu_getsdata(sym_data->elf, &sym_data->shdr);
                if (sym_data->shdr.sh_entsize == 0) {
                        logger.log_info("sh_entsize is zero for %s", lib.c_str());
-                       elf_end(sym_data->elf);
+                       teu_close(sym_data->elf);
+                       delete sym_data->elf;
                        close(sym_data->fd);
                        delete sym_data;
                        return nullptr;
@@ -366,19 +354,17 @@ class Core {
        bool SymAddress(const char *sym_name, unsigned long *addr) {
                for (const auto &sd : m_symdata) {
                        for (int i = 0; i < sd->count; i++) {
-                               GElf_Sym sym;
-                               GElf_Sym *s;
+                               Elf64_Sym sym;
 
-                               s = gelf_getsym(sd->data, i, &sym);
-                               if (!s)
+                               if (!teu_getsym(sd->elf, &sd->shdr, i, sd->data, &sym))
                                        continue;
 
-                               const char *st = elf_strptr(sd->elf, sd->shdr.sh_link, s->st_name);
+                               const char *st = teu_strptr(sd->elf, sd->shdr.sh_link, sym.st_name);
 
                                if (strcmp(st, sym_name) != 0)
                                        continue;
 
-                               *addr = sd->start + s->st_value;
+                               *addr = sd->start + sym.st_value;
                                return true;
                        }
                }
index 135e56a..f7f0cb5 100644 (file)
@@ -18,7 +18,7 @@
 #ifndef HELPERS_HPP__
 #define HELPERS_HPP__
 
-#include <libelf.h>
+#include <elf.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 
@@ -26,6 +26,8 @@
 #include <string>
 #include <unistd.h>
 
+#include "shared/telf.h"
+
 #pragma pack(push, 1)
 
 struct Notefile32 {
@@ -66,7 +68,7 @@ struct SymData {
        unsigned long start;
        Elf *elf;
        Elf64_Shdr shdr;
-       Elf_Data *data;
+       void *data;
        int fd;
        int count;
        struct SymData *next;
index f8d5a7e..b29b566 100644 (file)
@@ -18,7 +18,6 @@
 #include "livedumper.hpp"
 #include "log.hpp"
 
-#include <libelf.h>
 #include <unistd.h>
 
 #include <boost/exception/diagnostic_information.hpp>