Add support for Linux memory mapping stream and remove ELF header usage
when checking exploitability rating. Linux minidumps do not support MD_MEMORY_INFO_LIST_STREAM, meaning the processor cannot retrieve its memory mappings. However, it has its own stream, MD_LINUX_MAPS, which contains memory mappings specific to Linux (it contains the contents of /proc/self/maps). This CL allows the minidump to gather information from the memory mappings for Linux minidumps. In addition, exploitability rating for Linux dumps now use memory mappings instead of checking the ELF headers of binaries. The basis for the change is that checking the ELF headers requires the minidumps to store the memory from the ELF headers, while the memory mapping data is already present, meaning the size of a minidump will be unchanged. As a result, of removing ELF header analysis, two unit tests have been removed. Arguably, the cases that those unit tests check do not merit a high exploitability rating and do not warrant a solid conclusion that was given earlier. R=ivanpe@chromium.org Review URL: https://codereview.chromium.org/1251593007 git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@1476 4c0a9323-5329-0410-9bdc-e9ce6186880e
This commit is contained in:
Родитель
4959c18e98
Коммит
2997f45907
34
Makefile.am
34
Makefile.am
|
@ -174,6 +174,7 @@ src_libbreakpad_a_SOURCES = \
|
|||
src/google_breakpad/processor/minidump_processor.h \
|
||||
src/google_breakpad/processor/process_result.h \
|
||||
src/google_breakpad/processor/process_state.h \
|
||||
src/google_breakpad/processor/proc_maps_linux.h \
|
||||
src/google_breakpad/processor/source_line_resolver_base.h \
|
||||
src/google_breakpad/processor/source_line_resolver_interface.h \
|
||||
src/google_breakpad/processor/stack_frame.h \
|
||||
|
@ -226,6 +227,7 @@ src_libbreakpad_a_SOURCES = \
|
|||
src/processor/postfix_evaluator-inl.h \
|
||||
src/processor/postfix_evaluator.h \
|
||||
src/processor/process_state.cc \
|
||||
src/processor/proc_maps_linux.cc \
|
||||
src/processor/range_map-inl.h \
|
||||
src/processor/range_map.h \
|
||||
src/processor/simple_serializer-inl.h \
|
||||
|
@ -345,6 +347,7 @@ check_PROGRAMS += \
|
|||
src/processor/static_range_map_unittest \
|
||||
src/processor/pathname_stripper_unittest \
|
||||
src/processor/postfix_evaluator_unittest \
|
||||
src/processor/proc_maps_linux_unittest \
|
||||
src/processor/range_map_unittest \
|
||||
src/processor/stackwalker_amd64_unittest \
|
||||
src/processor/stackwalker_arm_unittest \
|
||||
|
@ -435,7 +438,8 @@ src_client_linux_linux_client_unittest_shlib_SOURCES = \
|
|||
src/processor/dump_object.cc \
|
||||
src/processor/logging.cc \
|
||||
src/processor/minidump.cc \
|
||||
src/processor/pathname_stripper.cc
|
||||
src/processor/pathname_stripper.cc \
|
||||
src/processor/proc_maps_linux.cc
|
||||
if ANDROID_HOST
|
||||
src_client_linux_linux_client_unittest_shlib_SOURCES += \
|
||||
src/common/android/breakpad_getcontext.S
|
||||
|
@ -710,6 +714,7 @@ src_processor_exploitability_unittest_LDADD = \
|
|||
src/processor/logging.o \
|
||||
src/processor/minidump.o \
|
||||
src/processor/pathname_stripper.o \
|
||||
src/processor/proc_maps_linux.o \
|
||||
src/processor/simple_symbol_supplier.o \
|
||||
src/processor/source_line_resolver_base.o \
|
||||
src/processor/stack_frame_cpu.o \
|
||||
|
@ -818,7 +823,7 @@ src_processor_microdump_processor_unittest_LDADD = \
|
|||
src/processor/stackwalker_sparc.o \
|
||||
src/processor/stackwalker_x86.o \
|
||||
src/processor/tokenize.o \
|
||||
$(PTHREAD_CFLAGS) $(PTHREAD_LIBS)
|
||||
$(PTHREAD_CFLAGS) $(PTHREAD_LIBS)
|
||||
|
||||
src_processor_minidump_processor_unittest_SOURCES = \
|
||||
src/processor/minidump_processor_unittest.cc \
|
||||
|
@ -846,6 +851,7 @@ src_processor_minidump_processor_unittest_LDADD = \
|
|||
src/processor/minidump.o \
|
||||
src/processor/pathname_stripper.o \
|
||||
src/processor/process_state.o \
|
||||
src/processor/proc_maps_linux.o \
|
||||
src/processor/source_line_resolver_base.o \
|
||||
src/processor/stack_frame_cpu.o \
|
||||
src/processor/stack_frame_symbolizer.o \
|
||||
|
@ -884,6 +890,25 @@ src_processor_minidump_unittest_LDADD = \
|
|||
src/processor/logging.o \
|
||||
src/processor/minidump.o \
|
||||
src/processor/pathname_stripper.o \
|
||||
src/processor/proc_maps_linux.o \
|
||||
$(PTHREAD_CFLAGS) $(PTHREAD_LIBS)
|
||||
|
||||
src_processor_proc_maps_linux_unittest_SOURCES = \
|
||||
src/processor/proc_maps_linux.cc \
|
||||
src/processor/proc_maps_linux_unittest.cc \
|
||||
src/testing/gtest/src/gtest-all.cc \
|
||||
src/testing/gtest/src/gtest_main.cc \
|
||||
src/testing/src/gmock-all.cc
|
||||
src_processor_proc_maps_linux_unittest_CPPFLAGS = \
|
||||
-I$(top_srcdir)/src \
|
||||
-I$(top_srcdir)/src/testing/include \
|
||||
-I$(top_srcdir)/src/testing/gtest/include \
|
||||
-I$(top_srcdir)/src/testing/gtest \
|
||||
-I$(top_srcdir)/src/testing
|
||||
src_processor_proc_maps_linux_unittest_LDADD = \
|
||||
src/processor/logging.o \
|
||||
src/processor/pathname_stripper.o \
|
||||
src/third_party/libdisasm/libdisasm.a \
|
||||
$(PTHREAD_CFLAGS) $(PTHREAD_LIBS)
|
||||
|
||||
src_processor_static_address_map_unittest_SOURCES = \
|
||||
|
@ -979,6 +1004,7 @@ src_processor_stackwalker_selftest_LDADD = \
|
|||
src/processor/logging.o \
|
||||
src/processor/minidump.o \
|
||||
src/processor/pathname_stripper.o \
|
||||
src/processor/proc_maps_linux.o \
|
||||
src/processor/source_line_resolver_base.o \
|
||||
src/processor/stack_frame_cpu.o \
|
||||
src/processor/stack_frame_symbolizer.o \
|
||||
|
@ -1135,7 +1161,8 @@ src_processor_minidump_dump_LDADD = \
|
|||
src/processor/dump_object.o \
|
||||
src/processor/logging.o \
|
||||
src/processor/minidump.o \
|
||||
src/processor/pathname_stripper.o
|
||||
src/processor/pathname_stripper.o \
|
||||
src/processor/proc_maps_linux.o
|
||||
|
||||
src_processor_microdump_stackwalk_SOURCES = \
|
||||
src/processor/microdump_stackwalk.cc
|
||||
|
@ -1190,6 +1217,7 @@ src_processor_minidump_stackwalk_LDADD = \
|
|||
src/processor/minidump_processor.o \
|
||||
src/processor/pathname_stripper.o \
|
||||
src/processor/process_state.o \
|
||||
src/processor/proc_maps_linux.o \
|
||||
src/processor/simple_symbol_supplier.o \
|
||||
src/processor/source_line_resolver_base.o \
|
||||
src/processor/stack_frame_cpu.o \
|
||||
|
|
194
Makefile.in
194
Makefile.in
|
@ -179,6 +179,7 @@ check_PROGRAMS = $(am__EXEEXT_4) $(am__EXEEXT_5) $(am__EXEEXT_6) \
|
|||
@DISABLE_PROCESSOR_FALSE@ src/processor/static_range_map_unittest \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper_unittest \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/postfix_evaluator_unittest \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux_unittest \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/range_map_unittest \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64_unittest \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm_unittest \
|
||||
|
@ -353,6 +354,7 @@ am__src_libbreakpad_a_SOURCES_DIST = \
|
|||
src/google_breakpad/processor/minidump_processor.h \
|
||||
src/google_breakpad/processor/process_result.h \
|
||||
src/google_breakpad/processor/process_state.h \
|
||||
src/google_breakpad/processor/proc_maps_linux.h \
|
||||
src/google_breakpad/processor/source_line_resolver_base.h \
|
||||
src/google_breakpad/processor/source_line_resolver_interface.h \
|
||||
src/google_breakpad/processor/stack_frame.h \
|
||||
|
@ -395,7 +397,8 @@ am__src_libbreakpad_a_SOURCES_DIST = \
|
|||
src/processor/pathname_stripper.h \
|
||||
src/processor/postfix_evaluator-inl.h \
|
||||
src/processor/postfix_evaluator.h \
|
||||
src/processor/process_state.cc src/processor/range_map-inl.h \
|
||||
src/processor/process_state.cc \
|
||||
src/processor/proc_maps_linux.cc src/processor/range_map-inl.h \
|
||||
src/processor/range_map.h \
|
||||
src/processor/simple_serializer-inl.h \
|
||||
src/processor/simple_serializer.h \
|
||||
|
@ -458,6 +461,7 @@ am__src_libbreakpad_a_SOURCES_DIST = \
|
|||
@DISABLE_PROCESSOR_FALSE@ src/processor/module_serializer.$(OBJEXT) \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.$(OBJEXT) \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/process_state.$(OBJEXT) \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux.$(OBJEXT) \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.$(OBJEXT) \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.$(OBJEXT) \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_cpu.$(OBJEXT) \
|
||||
|
@ -548,6 +552,7 @@ src_third_party_libdisasm_libdisasm_a_OBJECTS = \
|
|||
@DISABLE_PROCESSOR_FALSE@ src/processor/static_range_map_unittest$(EXEEXT) \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper_unittest$(EXEEXT) \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/postfix_evaluator_unittest$(EXEEXT) \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux_unittest$(EXEEXT) \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/range_map_unittest$(EXEEXT) \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64_unittest$(EXEEXT) \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm_unittest$(EXEEXT) \
|
||||
|
@ -589,6 +594,7 @@ am__src_client_linux_linux_client_unittest_shlib_SOURCES_DIST = \
|
|||
src/processor/dump_context.cc src/processor/dump_object.cc \
|
||||
src/processor/logging.cc src/processor/minidump.cc \
|
||||
src/processor/pathname_stripper.cc \
|
||||
src/processor/proc_maps_linux.cc \
|
||||
src/common/android/breakpad_getcontext.S \
|
||||
src/client/linux/microdump_writer/microdump_writer_unittest.cc \
|
||||
src/common/android/breakpad_getcontext_unittest.cc
|
||||
|
@ -618,6 +624,7 @@ am__src_client_linux_linux_client_unittest_shlib_SOURCES_DIST = \
|
|||
@LINUX_HOST_TRUE@ src/processor/src_client_linux_linux_client_unittest_shlib-logging.$(OBJEXT) \
|
||||
@LINUX_HOST_TRUE@ src/processor/src_client_linux_linux_client_unittest_shlib-minidump.$(OBJEXT) \
|
||||
@LINUX_HOST_TRUE@ src/processor/src_client_linux_linux_client_unittest_shlib-pathname_stripper.$(OBJEXT) \
|
||||
@LINUX_HOST_TRUE@ src/processor/src_client_linux_linux_client_unittest_shlib-proc_maps_linux.$(OBJEXT) \
|
||||
@LINUX_HOST_TRUE@ $(am__objects_2) \
|
||||
@LINUX_HOST_TRUE@ src/client/linux/microdump_writer/src_client_linux_linux_client_unittest_shlib-microdump_writer_unittest.$(OBJEXT) \
|
||||
@LINUX_HOST_TRUE@ $(am__objects_3)
|
||||
|
@ -851,6 +858,7 @@ src_processor_exploitability_unittest_OBJECTS = \
|
|||
@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_cpu.o \
|
||||
|
@ -987,7 +995,8 @@ src_processor_minidump_dump_OBJECTS = \
|
|||
@DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux.o
|
||||
am__src_processor_minidump_processor_unittest_SOURCES_DIST = \
|
||||
src/processor/minidump_processor_unittest.cc \
|
||||
src/testing/gtest/src/gtest-all.cc \
|
||||
|
@ -1013,6 +1022,7 @@ src_processor_minidump_processor_unittest_OBJECTS = \
|
|||
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/process_state.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_cpu.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_symbolizer.o \
|
||||
|
@ -1053,6 +1063,7 @@ src_processor_minidump_stackwalk_OBJECTS = \
|
|||
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_processor.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/process_state.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_cpu.o \
|
||||
|
@ -1093,6 +1104,7 @@ src_processor_minidump_unittest_OBJECTS = \
|
|||
@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \
|
||||
@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1)
|
||||
am__src_processor_pathname_stripper_unittest_SOURCES_DIST = \
|
||||
|
@ -1114,6 +1126,25 @@ src_processor_postfix_evaluator_unittest_OBJECTS = \
|
|||
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \
|
||||
@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1)
|
||||
am__src_processor_proc_maps_linux_unittest_SOURCES_DIST = \
|
||||
src/processor/proc_maps_linux.cc \
|
||||
src/processor/proc_maps_linux_unittest.cc \
|
||||
src/testing/gtest/src/gtest-all.cc \
|
||||
src/testing/gtest/src/gtest_main.cc \
|
||||
src/testing/src/gmock-all.cc
|
||||
@DISABLE_PROCESSOR_FALSE@am_src_processor_proc_maps_linux_unittest_OBJECTS = src/processor/src_processor_proc_maps_linux_unittest-proc_maps_linux.$(OBJEXT) \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/src_processor_proc_maps_linux_unittest-proc_maps_linux_unittest.$(OBJEXT) \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/testing/gtest/src/src_processor_proc_maps_linux_unittest-gtest-all.$(OBJEXT) \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/testing/gtest/src/src_processor_proc_maps_linux_unittest-gtest_main.$(OBJEXT) \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/testing/src/src_processor_proc_maps_linux_unittest-gmock-all.$(OBJEXT)
|
||||
src_processor_proc_maps_linux_unittest_OBJECTS = \
|
||||
$(am_src_processor_proc_maps_linux_unittest_OBJECTS)
|
||||
@DISABLE_PROCESSOR_FALSE@src_processor_proc_maps_linux_unittest_DEPENDENCIES = \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/libdisasm.a \
|
||||
@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \
|
||||
@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1)
|
||||
am__src_processor_range_map_unittest_SOURCES_DIST = \
|
||||
src/processor/range_map_unittest.cc
|
||||
@DISABLE_PROCESSOR_FALSE@am_src_processor_range_map_unittest_OBJECTS = src/processor/range_map_unittest.$(OBJEXT)
|
||||
|
@ -1225,6 +1256,7 @@ src_processor_stackwalker_selftest_OBJECTS = \
|
|||
@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_cpu.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_symbolizer.o \
|
||||
|
@ -1491,6 +1523,7 @@ SOURCES = $(src_client_linux_libbreakpad_client_a_SOURCES) \
|
|||
$(src_processor_minidump_unittest_SOURCES) \
|
||||
$(src_processor_pathname_stripper_unittest_SOURCES) \
|
||||
$(src_processor_postfix_evaluator_unittest_SOURCES) \
|
||||
$(src_processor_proc_maps_linux_unittest_SOURCES) \
|
||||
$(src_processor_range_map_unittest_SOURCES) \
|
||||
$(src_processor_stackwalker_address_list_unittest_SOURCES) \
|
||||
$(src_processor_stackwalker_amd64_unittest_SOURCES) \
|
||||
|
@ -1536,6 +1569,7 @@ DIST_SOURCES = \
|
|||
$(am__src_processor_minidump_unittest_SOURCES_DIST) \
|
||||
$(am__src_processor_pathname_stripper_unittest_SOURCES_DIST) \
|
||||
$(am__src_processor_postfix_evaluator_unittest_SOURCES_DIST) \
|
||||
$(am__src_processor_proc_maps_linux_unittest_SOURCES_DIST) \
|
||||
$(am__src_processor_range_map_unittest_SOURCES_DIST) \
|
||||
$(am__src_processor_stackwalker_address_list_unittest_SOURCES_DIST) \
|
||||
$(am__src_processor_stackwalker_amd64_unittest_SOURCES_DIST) \
|
||||
|
@ -1974,6 +2008,7 @@ lib_LIBRARIES = $(am__append_5) $(am__append_8)
|
|||
@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/minidump_processor.h \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/process_result.h \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/process_state.h \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/proc_maps_linux.h \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/source_line_resolver_base.h \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/source_line_resolver_interface.h \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/stack_frame.h \
|
||||
|
@ -2026,6 +2061,7 @@ lib_LIBRARIES = $(am__append_5) $(am__append_8)
|
|||
@DISABLE_PROCESSOR_FALSE@ src/processor/postfix_evaluator-inl.h \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/postfix_evaluator.h \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/process_state.cc \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux.cc \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/range_map-inl.h \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/range_map.h \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/simple_serializer-inl.h \
|
||||
|
@ -2149,6 +2185,7 @@ TESTS = $(check_PROGRAMS) $(check_SCRIPTS)
|
|||
@LINUX_HOST_TRUE@ src/processor/logging.cc \
|
||||
@LINUX_HOST_TRUE@ src/processor/minidump.cc \
|
||||
@LINUX_HOST_TRUE@ src/processor/pathname_stripper.cc \
|
||||
@LINUX_HOST_TRUE@ src/processor/proc_maps_linux.cc \
|
||||
@LINUX_HOST_TRUE@ $(am__append_18) \
|
||||
@LINUX_HOST_TRUE@ src/client/linux/microdump_writer/microdump_writer_unittest.cc \
|
||||
@LINUX_HOST_TRUE@ $(am__append_19)
|
||||
|
@ -2415,6 +2452,7 @@ TESTS = $(check_PROGRAMS) $(check_SCRIPTS)
|
|||
@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_cpu.o \
|
||||
|
@ -2531,7 +2569,7 @@ TESTS = $(check_PROGRAMS) $(check_SCRIPTS)
|
|||
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_sparc.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS)
|
||||
@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS)
|
||||
|
||||
@DISABLE_PROCESSOR_FALSE@src_processor_minidump_processor_unittest_SOURCES = \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_processor_unittest.cc \
|
||||
|
@ -2561,6 +2599,7 @@ TESTS = $(check_PROGRAMS) $(check_SCRIPTS)
|
|||
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/process_state.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_cpu.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_symbolizer.o \
|
||||
|
@ -2601,6 +2640,27 @@ TESTS = $(check_PROGRAMS) $(check_SCRIPTS)
|
|||
@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS)
|
||||
|
||||
@DISABLE_PROCESSOR_FALSE@src_processor_proc_maps_linux_unittest_SOURCES = \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux.cc \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux_unittest.cc \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/testing/gtest/src/gtest-all.cc \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/testing/gtest/src/gtest_main.cc \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/testing/src/gmock-all.cc
|
||||
|
||||
@DISABLE_PROCESSOR_FALSE@src_processor_proc_maps_linux_unittest_CPPFLAGS = \
|
||||
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src \
|
||||
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/include \
|
||||
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
|
||||
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest \
|
||||
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing
|
||||
|
||||
@DISABLE_PROCESSOR_FALSE@src_processor_proc_maps_linux_unittest_LDADD = \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/libdisasm.a \
|
||||
@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS)
|
||||
|
||||
@DISABLE_PROCESSOR_FALSE@src_processor_static_address_map_unittest_SOURCES = \
|
||||
|
@ -2708,6 +2768,7 @@ TESTS = $(check_PROGRAMS) $(check_SCRIPTS)
|
|||
@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_cpu.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_symbolizer.o \
|
||||
|
@ -2876,7 +2937,8 @@ TESTS = $(check_PROGRAMS) $(check_SCRIPTS)
|
|||
@DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux.o
|
||||
|
||||
@DISABLE_PROCESSOR_FALSE@src_processor_microdump_stackwalk_SOURCES = \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/microdump_stackwalk.cc
|
||||
|
@ -2933,6 +2995,7 @@ TESTS = $(check_PROGRAMS) $(check_SCRIPTS)
|
|||
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_processor.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/process_state.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \
|
||||
@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_cpu.o \
|
||||
|
@ -3372,6 +3435,9 @@ src/processor/pathname_stripper.$(OBJEXT): \
|
|||
src/processor/$(DEPDIR)/$(am__dirstamp)
|
||||
src/processor/process_state.$(OBJEXT): src/processor/$(am__dirstamp) \
|
||||
src/processor/$(DEPDIR)/$(am__dirstamp)
|
||||
src/processor/proc_maps_linux.$(OBJEXT): \
|
||||
src/processor/$(am__dirstamp) \
|
||||
src/processor/$(DEPDIR)/$(am__dirstamp)
|
||||
src/processor/simple_symbol_supplier.$(OBJEXT): \
|
||||
src/processor/$(am__dirstamp) \
|
||||
src/processor/$(DEPDIR)/$(am__dirstamp)
|
||||
|
@ -3627,6 +3693,9 @@ src/processor/src_client_linux_linux_client_unittest_shlib-minidump.$(OBJEXT):
|
|||
src/processor/src_client_linux_linux_client_unittest_shlib-pathname_stripper.$(OBJEXT): \
|
||||
src/processor/$(am__dirstamp) \
|
||||
src/processor/$(DEPDIR)/$(am__dirstamp)
|
||||
src/processor/src_client_linux_linux_client_unittest_shlib-proc_maps_linux.$(OBJEXT): \
|
||||
src/processor/$(am__dirstamp) \
|
||||
src/processor/$(DEPDIR)/$(am__dirstamp)
|
||||
src/common/android/src_client_linux_linux_client_unittest_shlib-breakpad_getcontext.$(OBJEXT): \
|
||||
src/common/android/$(am__dirstamp) \
|
||||
src/common/android/$(DEPDIR)/$(am__dirstamp)
|
||||
|
@ -4010,6 +4079,25 @@ src/processor/postfix_evaluator_unittest.$(OBJEXT): \
|
|||
src/processor/postfix_evaluator_unittest$(EXEEXT): $(src_processor_postfix_evaluator_unittest_OBJECTS) $(src_processor_postfix_evaluator_unittest_DEPENDENCIES) $(EXTRA_src_processor_postfix_evaluator_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
|
||||
@rm -f src/processor/postfix_evaluator_unittest$(EXEEXT)
|
||||
$(AM_V_CXXLD)$(CXXLINK) $(src_processor_postfix_evaluator_unittest_OBJECTS) $(src_processor_postfix_evaluator_unittest_LDADD) $(LIBS)
|
||||
src/processor/src_processor_proc_maps_linux_unittest-proc_maps_linux.$(OBJEXT): \
|
||||
src/processor/$(am__dirstamp) \
|
||||
src/processor/$(DEPDIR)/$(am__dirstamp)
|
||||
src/processor/src_processor_proc_maps_linux_unittest-proc_maps_linux_unittest.$(OBJEXT): \
|
||||
src/processor/$(am__dirstamp) \
|
||||
src/processor/$(DEPDIR)/$(am__dirstamp)
|
||||
src/testing/gtest/src/src_processor_proc_maps_linux_unittest-gtest-all.$(OBJEXT): \
|
||||
src/testing/gtest/src/$(am__dirstamp) \
|
||||
src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
|
||||
src/testing/gtest/src/src_processor_proc_maps_linux_unittest-gtest_main.$(OBJEXT): \
|
||||
src/testing/gtest/src/$(am__dirstamp) \
|
||||
src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
|
||||
src/testing/src/src_processor_proc_maps_linux_unittest-gmock-all.$(OBJEXT): \
|
||||
src/testing/src/$(am__dirstamp) \
|
||||
src/testing/src/$(DEPDIR)/$(am__dirstamp)
|
||||
|
||||
src/processor/proc_maps_linux_unittest$(EXEEXT): $(src_processor_proc_maps_linux_unittest_OBJECTS) $(src_processor_proc_maps_linux_unittest_DEPENDENCIES) $(EXTRA_src_processor_proc_maps_linux_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
|
||||
@rm -f src/processor/proc_maps_linux_unittest$(EXEEXT)
|
||||
$(AM_V_CXXLD)$(CXXLINK) $(src_processor_proc_maps_linux_unittest_OBJECTS) $(src_processor_proc_maps_linux_unittest_LDADD) $(LIBS)
|
||||
src/processor/range_map_unittest.$(OBJEXT): \
|
||||
src/processor/$(am__dirstamp) \
|
||||
src/processor/$(DEPDIR)/$(am__dirstamp)
|
||||
|
@ -4493,6 +4581,7 @@ distclean-compile:
|
|||
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/pathname_stripper.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/pathname_stripper_unittest.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/postfix_evaluator_unittest.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/proc_maps_linux.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/process_state.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/range_map_unittest.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/simple_symbol_supplier.Po@am__quote@
|
||||
|
@ -4503,6 +4592,7 @@ distclean-compile:
|
|||
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_client_linux_linux_client_unittest_shlib-logging.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_client_linux_linux_client_unittest_shlib-minidump.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_client_linux_linux_client_unittest_shlib-pathname_stripper.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_client_linux_linux_client_unittest_shlib-proc_maps_linux.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_basic_source_line_resolver_unittest-basic_source_line_resolver_unittest.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_binarystream_unittest-binarystream_unittest.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_cfi_frame_info_unittest-cfi_frame_info_unittest.Po@am__quote@
|
||||
|
@ -4514,6 +4604,8 @@ distclean-compile:
|
|||
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_minidump_processor_unittest-minidump_processor_unittest.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_minidump_unittest-minidump_unittest.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_minidump_unittest-synth_minidump.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_proc_maps_linux_unittest-proc_maps_linux.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_proc_maps_linux_unittest-proc_maps_linux_unittest.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_stackwalker_address_list_unittest-stackwalker_address_list_unittest.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_stackwalker_amd64_unittest-stackwalker_amd64_unittest.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_stackwalker_arm64_unittest-stackwalker_arm64_unittest.Po@am__quote@
|
||||
|
@ -4561,6 +4653,8 @@ distclean-compile:
|
|||
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_minidump_processor_unittest-gtest-all.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_minidump_unittest-gtest-all.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_minidump_unittest-gtest_main.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_proc_maps_linux_unittest-gtest-all.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_proc_maps_linux_unittest-gtest_main.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_stackwalker_address_list_unittest-gtest-all.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_stackwalker_address_list_unittest-gtest_main.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_stackwalker_amd64_unittest-gtest-all.Po@am__quote@
|
||||
|
@ -4594,6 +4688,7 @@ distclean-compile:
|
|||
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_microdump_processor_unittest-gmock-all.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_minidump_processor_unittest-gmock-all.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_minidump_unittest-gmock-all.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_proc_maps_linux_unittest-gmock-all.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_stackwalker_address_list_unittest-gmock-all.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_stackwalker_amd64_unittest-gmock-all.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_stackwalker_arm64_unittest-gmock-all.Po@am__quote@
|
||||
|
@ -5025,6 +5120,20 @@ src/processor/src_client_linux_linux_client_unittest_shlib-pathname_stripper.obj
|
|||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/src_client_linux_linux_client_unittest_shlib-pathname_stripper.obj `if test -f 'src/processor/pathname_stripper.cc'; then $(CYGPATH_W) 'src/processor/pathname_stripper.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/pathname_stripper.cc'; fi`
|
||||
|
||||
src/processor/src_client_linux_linux_client_unittest_shlib-proc_maps_linux.o: src/processor/proc_maps_linux.cc
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/src_client_linux_linux_client_unittest_shlib-proc_maps_linux.o -MD -MP -MF src/processor/$(DEPDIR)/src_client_linux_linux_client_unittest_shlib-proc_maps_linux.Tpo -c -o src/processor/src_client_linux_linux_client_unittest_shlib-proc_maps_linux.o `test -f 'src/processor/proc_maps_linux.cc' || echo '$(srcdir)/'`src/processor/proc_maps_linux.cc
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/src_client_linux_linux_client_unittest_shlib-proc_maps_linux.Tpo src/processor/$(DEPDIR)/src_client_linux_linux_client_unittest_shlib-proc_maps_linux.Po
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/proc_maps_linux.cc' object='src/processor/src_client_linux_linux_client_unittest_shlib-proc_maps_linux.o' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/src_client_linux_linux_client_unittest_shlib-proc_maps_linux.o `test -f 'src/processor/proc_maps_linux.cc' || echo '$(srcdir)/'`src/processor/proc_maps_linux.cc
|
||||
|
||||
src/processor/src_client_linux_linux_client_unittest_shlib-proc_maps_linux.obj: src/processor/proc_maps_linux.cc
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/src_client_linux_linux_client_unittest_shlib-proc_maps_linux.obj -MD -MP -MF src/processor/$(DEPDIR)/src_client_linux_linux_client_unittest_shlib-proc_maps_linux.Tpo -c -o src/processor/src_client_linux_linux_client_unittest_shlib-proc_maps_linux.obj `if test -f 'src/processor/proc_maps_linux.cc'; then $(CYGPATH_W) 'src/processor/proc_maps_linux.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/proc_maps_linux.cc'; fi`
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/src_client_linux_linux_client_unittest_shlib-proc_maps_linux.Tpo src/processor/$(DEPDIR)/src_client_linux_linux_client_unittest_shlib-proc_maps_linux.Po
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/proc_maps_linux.cc' object='src/processor/src_client_linux_linux_client_unittest_shlib-proc_maps_linux.obj' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/src_client_linux_linux_client_unittest_shlib-proc_maps_linux.obj `if test -f 'src/processor/proc_maps_linux.cc'; then $(CYGPATH_W) 'src/processor/proc_maps_linux.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/proc_maps_linux.cc'; fi`
|
||||
|
||||
src/client/linux/microdump_writer/src_client_linux_linux_client_unittest_shlib-microdump_writer_unittest.o: src/client/linux/microdump_writer/microdump_writer_unittest.cc
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/client/linux/microdump_writer/src_client_linux_linux_client_unittest_shlib-microdump_writer_unittest.o -MD -MP -MF src/client/linux/microdump_writer/$(DEPDIR)/src_client_linux_linux_client_unittest_shlib-microdump_writer_unittest.Tpo -c -o src/client/linux/microdump_writer/src_client_linux_linux_client_unittest_shlib-microdump_writer_unittest.o `test -f 'src/client/linux/microdump_writer/microdump_writer_unittest.cc' || echo '$(srcdir)/'`src/client/linux/microdump_writer/microdump_writer_unittest.cc
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/client/linux/microdump_writer/$(DEPDIR)/src_client_linux_linux_client_unittest_shlib-microdump_writer_unittest.Tpo src/client/linux/microdump_writer/$(DEPDIR)/src_client_linux_linux_client_unittest_shlib-microdump_writer_unittest.Po
|
||||
|
@ -6285,6 +6394,76 @@ src/testing/src/src_processor_minidump_unittest-gmock-all.obj: src/testing/src/g
|
|||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_minidump_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/src/src_processor_minidump_unittest-gmock-all.obj `if test -f 'src/testing/src/gmock-all.cc'; then $(CYGPATH_W) 'src/testing/src/gmock-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/src/gmock-all.cc'; fi`
|
||||
|
||||
src/processor/src_processor_proc_maps_linux_unittest-proc_maps_linux.o: src/processor/proc_maps_linux.cc
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_proc_maps_linux_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/src_processor_proc_maps_linux_unittest-proc_maps_linux.o -MD -MP -MF src/processor/$(DEPDIR)/src_processor_proc_maps_linux_unittest-proc_maps_linux.Tpo -c -o src/processor/src_processor_proc_maps_linux_unittest-proc_maps_linux.o `test -f 'src/processor/proc_maps_linux.cc' || echo '$(srcdir)/'`src/processor/proc_maps_linux.cc
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/src_processor_proc_maps_linux_unittest-proc_maps_linux.Tpo src/processor/$(DEPDIR)/src_processor_proc_maps_linux_unittest-proc_maps_linux.Po
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/proc_maps_linux.cc' object='src/processor/src_processor_proc_maps_linux_unittest-proc_maps_linux.o' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_proc_maps_linux_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/src_processor_proc_maps_linux_unittest-proc_maps_linux.o `test -f 'src/processor/proc_maps_linux.cc' || echo '$(srcdir)/'`src/processor/proc_maps_linux.cc
|
||||
|
||||
src/processor/src_processor_proc_maps_linux_unittest-proc_maps_linux.obj: src/processor/proc_maps_linux.cc
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_proc_maps_linux_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/src_processor_proc_maps_linux_unittest-proc_maps_linux.obj -MD -MP -MF src/processor/$(DEPDIR)/src_processor_proc_maps_linux_unittest-proc_maps_linux.Tpo -c -o src/processor/src_processor_proc_maps_linux_unittest-proc_maps_linux.obj `if test -f 'src/processor/proc_maps_linux.cc'; then $(CYGPATH_W) 'src/processor/proc_maps_linux.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/proc_maps_linux.cc'; fi`
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/src_processor_proc_maps_linux_unittest-proc_maps_linux.Tpo src/processor/$(DEPDIR)/src_processor_proc_maps_linux_unittest-proc_maps_linux.Po
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/proc_maps_linux.cc' object='src/processor/src_processor_proc_maps_linux_unittest-proc_maps_linux.obj' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_proc_maps_linux_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/src_processor_proc_maps_linux_unittest-proc_maps_linux.obj `if test -f 'src/processor/proc_maps_linux.cc'; then $(CYGPATH_W) 'src/processor/proc_maps_linux.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/proc_maps_linux.cc'; fi`
|
||||
|
||||
src/processor/src_processor_proc_maps_linux_unittest-proc_maps_linux_unittest.o: src/processor/proc_maps_linux_unittest.cc
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_proc_maps_linux_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/src_processor_proc_maps_linux_unittest-proc_maps_linux_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/src_processor_proc_maps_linux_unittest-proc_maps_linux_unittest.Tpo -c -o src/processor/src_processor_proc_maps_linux_unittest-proc_maps_linux_unittest.o `test -f 'src/processor/proc_maps_linux_unittest.cc' || echo '$(srcdir)/'`src/processor/proc_maps_linux_unittest.cc
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/src_processor_proc_maps_linux_unittest-proc_maps_linux_unittest.Tpo src/processor/$(DEPDIR)/src_processor_proc_maps_linux_unittest-proc_maps_linux_unittest.Po
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/proc_maps_linux_unittest.cc' object='src/processor/src_processor_proc_maps_linux_unittest-proc_maps_linux_unittest.o' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_proc_maps_linux_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/src_processor_proc_maps_linux_unittest-proc_maps_linux_unittest.o `test -f 'src/processor/proc_maps_linux_unittest.cc' || echo '$(srcdir)/'`src/processor/proc_maps_linux_unittest.cc
|
||||
|
||||
src/processor/src_processor_proc_maps_linux_unittest-proc_maps_linux_unittest.obj: src/processor/proc_maps_linux_unittest.cc
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_proc_maps_linux_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/src_processor_proc_maps_linux_unittest-proc_maps_linux_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/src_processor_proc_maps_linux_unittest-proc_maps_linux_unittest.Tpo -c -o src/processor/src_processor_proc_maps_linux_unittest-proc_maps_linux_unittest.obj `if test -f 'src/processor/proc_maps_linux_unittest.cc'; then $(CYGPATH_W) 'src/processor/proc_maps_linux_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/proc_maps_linux_unittest.cc'; fi`
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/src_processor_proc_maps_linux_unittest-proc_maps_linux_unittest.Tpo src/processor/$(DEPDIR)/src_processor_proc_maps_linux_unittest-proc_maps_linux_unittest.Po
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/proc_maps_linux_unittest.cc' object='src/processor/src_processor_proc_maps_linux_unittest-proc_maps_linux_unittest.obj' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_proc_maps_linux_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/src_processor_proc_maps_linux_unittest-proc_maps_linux_unittest.obj `if test -f 'src/processor/proc_maps_linux_unittest.cc'; then $(CYGPATH_W) 'src/processor/proc_maps_linux_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/proc_maps_linux_unittest.cc'; fi`
|
||||
|
||||
src/testing/gtest/src/src_processor_proc_maps_linux_unittest-gtest-all.o: src/testing/gtest/src/gtest-all.cc
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_proc_maps_linux_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/gtest/src/src_processor_proc_maps_linux_unittest-gtest-all.o -MD -MP -MF src/testing/gtest/src/$(DEPDIR)/src_processor_proc_maps_linux_unittest-gtest-all.Tpo -c -o src/testing/gtest/src/src_processor_proc_maps_linux_unittest-gtest-all.o `test -f 'src/testing/gtest/src/gtest-all.cc' || echo '$(srcdir)/'`src/testing/gtest/src/gtest-all.cc
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/testing/gtest/src/$(DEPDIR)/src_processor_proc_maps_linux_unittest-gtest-all.Tpo src/testing/gtest/src/$(DEPDIR)/src_processor_proc_maps_linux_unittest-gtest-all.Po
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/testing/gtest/src/gtest-all.cc' object='src/testing/gtest/src/src_processor_proc_maps_linux_unittest-gtest-all.o' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_proc_maps_linux_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/gtest/src/src_processor_proc_maps_linux_unittest-gtest-all.o `test -f 'src/testing/gtest/src/gtest-all.cc' || echo '$(srcdir)/'`src/testing/gtest/src/gtest-all.cc
|
||||
|
||||
src/testing/gtest/src/src_processor_proc_maps_linux_unittest-gtest-all.obj: src/testing/gtest/src/gtest-all.cc
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_proc_maps_linux_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/gtest/src/src_processor_proc_maps_linux_unittest-gtest-all.obj -MD -MP -MF src/testing/gtest/src/$(DEPDIR)/src_processor_proc_maps_linux_unittest-gtest-all.Tpo -c -o src/testing/gtest/src/src_processor_proc_maps_linux_unittest-gtest-all.obj `if test -f 'src/testing/gtest/src/gtest-all.cc'; then $(CYGPATH_W) 'src/testing/gtest/src/gtest-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/gtest/src/gtest-all.cc'; fi`
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/testing/gtest/src/$(DEPDIR)/src_processor_proc_maps_linux_unittest-gtest-all.Tpo src/testing/gtest/src/$(DEPDIR)/src_processor_proc_maps_linux_unittest-gtest-all.Po
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/testing/gtest/src/gtest-all.cc' object='src/testing/gtest/src/src_processor_proc_maps_linux_unittest-gtest-all.obj' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_proc_maps_linux_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/gtest/src/src_processor_proc_maps_linux_unittest-gtest-all.obj `if test -f 'src/testing/gtest/src/gtest-all.cc'; then $(CYGPATH_W) 'src/testing/gtest/src/gtest-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/gtest/src/gtest-all.cc'; fi`
|
||||
|
||||
src/testing/gtest/src/src_processor_proc_maps_linux_unittest-gtest_main.o: src/testing/gtest/src/gtest_main.cc
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_proc_maps_linux_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/gtest/src/src_processor_proc_maps_linux_unittest-gtest_main.o -MD -MP -MF src/testing/gtest/src/$(DEPDIR)/src_processor_proc_maps_linux_unittest-gtest_main.Tpo -c -o src/testing/gtest/src/src_processor_proc_maps_linux_unittest-gtest_main.o `test -f 'src/testing/gtest/src/gtest_main.cc' || echo '$(srcdir)/'`src/testing/gtest/src/gtest_main.cc
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/testing/gtest/src/$(DEPDIR)/src_processor_proc_maps_linux_unittest-gtest_main.Tpo src/testing/gtest/src/$(DEPDIR)/src_processor_proc_maps_linux_unittest-gtest_main.Po
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/testing/gtest/src/gtest_main.cc' object='src/testing/gtest/src/src_processor_proc_maps_linux_unittest-gtest_main.o' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_proc_maps_linux_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/gtest/src/src_processor_proc_maps_linux_unittest-gtest_main.o `test -f 'src/testing/gtest/src/gtest_main.cc' || echo '$(srcdir)/'`src/testing/gtest/src/gtest_main.cc
|
||||
|
||||
src/testing/gtest/src/src_processor_proc_maps_linux_unittest-gtest_main.obj: src/testing/gtest/src/gtest_main.cc
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_proc_maps_linux_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/gtest/src/src_processor_proc_maps_linux_unittest-gtest_main.obj -MD -MP -MF src/testing/gtest/src/$(DEPDIR)/src_processor_proc_maps_linux_unittest-gtest_main.Tpo -c -o src/testing/gtest/src/src_processor_proc_maps_linux_unittest-gtest_main.obj `if test -f 'src/testing/gtest/src/gtest_main.cc'; then $(CYGPATH_W) 'src/testing/gtest/src/gtest_main.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/gtest/src/gtest_main.cc'; fi`
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/testing/gtest/src/$(DEPDIR)/src_processor_proc_maps_linux_unittest-gtest_main.Tpo src/testing/gtest/src/$(DEPDIR)/src_processor_proc_maps_linux_unittest-gtest_main.Po
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/testing/gtest/src/gtest_main.cc' object='src/testing/gtest/src/src_processor_proc_maps_linux_unittest-gtest_main.obj' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_proc_maps_linux_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/gtest/src/src_processor_proc_maps_linux_unittest-gtest_main.obj `if test -f 'src/testing/gtest/src/gtest_main.cc'; then $(CYGPATH_W) 'src/testing/gtest/src/gtest_main.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/gtest/src/gtest_main.cc'; fi`
|
||||
|
||||
src/testing/src/src_processor_proc_maps_linux_unittest-gmock-all.o: src/testing/src/gmock-all.cc
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_proc_maps_linux_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/src/src_processor_proc_maps_linux_unittest-gmock-all.o -MD -MP -MF src/testing/src/$(DEPDIR)/src_processor_proc_maps_linux_unittest-gmock-all.Tpo -c -o src/testing/src/src_processor_proc_maps_linux_unittest-gmock-all.o `test -f 'src/testing/src/gmock-all.cc' || echo '$(srcdir)/'`src/testing/src/gmock-all.cc
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/testing/src/$(DEPDIR)/src_processor_proc_maps_linux_unittest-gmock-all.Tpo src/testing/src/$(DEPDIR)/src_processor_proc_maps_linux_unittest-gmock-all.Po
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/testing/src/gmock-all.cc' object='src/testing/src/src_processor_proc_maps_linux_unittest-gmock-all.o' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_proc_maps_linux_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/src/src_processor_proc_maps_linux_unittest-gmock-all.o `test -f 'src/testing/src/gmock-all.cc' || echo '$(srcdir)/'`src/testing/src/gmock-all.cc
|
||||
|
||||
src/testing/src/src_processor_proc_maps_linux_unittest-gmock-all.obj: src/testing/src/gmock-all.cc
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_proc_maps_linux_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/src/src_processor_proc_maps_linux_unittest-gmock-all.obj -MD -MP -MF src/testing/src/$(DEPDIR)/src_processor_proc_maps_linux_unittest-gmock-all.Tpo -c -o src/testing/src/src_processor_proc_maps_linux_unittest-gmock-all.obj `if test -f 'src/testing/src/gmock-all.cc'; then $(CYGPATH_W) 'src/testing/src/gmock-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/src/gmock-all.cc'; fi`
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/testing/src/$(DEPDIR)/src_processor_proc_maps_linux_unittest-gmock-all.Tpo src/testing/src/$(DEPDIR)/src_processor_proc_maps_linux_unittest-gmock-all.Po
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/testing/src/gmock-all.cc' object='src/testing/src/src_processor_proc_maps_linux_unittest-gmock-all.obj' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_proc_maps_linux_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/src/src_processor_proc_maps_linux_unittest-gmock-all.obj `if test -f 'src/testing/src/gmock-all.cc'; then $(CYGPATH_W) 'src/testing/src/gmock-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/src/gmock-all.cc'; fi`
|
||||
|
||||
src/common/src_processor_stackwalker_address_list_unittest-test_assembler.o: src/common/test_assembler.cc
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_address_list_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/src_processor_stackwalker_address_list_unittest-test_assembler.o -MD -MP -MF src/common/$(DEPDIR)/src_processor_stackwalker_address_list_unittest-test_assembler.Tpo -c -o src/common/src_processor_stackwalker_address_list_unittest-test_assembler.o `test -f 'src/common/test_assembler.cc' || echo '$(srcdir)/'`src/common/test_assembler.cc
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/src_processor_stackwalker_address_list_unittest-test_assembler.Tpo src/common/$(DEPDIR)/src_processor_stackwalker_address_list_unittest-test_assembler.Po
|
||||
|
@ -7556,6 +7735,13 @@ src/processor/postfix_evaluator_unittest.log: src/processor/postfix_evaluator_un
|
|||
--log-file $$b.log --trs-file $$b.trs \
|
||||
$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
|
||||
"$$tst" $(AM_TESTS_FD_REDIRECT)
|
||||
src/processor/proc_maps_linux_unittest.log: src/processor/proc_maps_linux_unittest$(EXEEXT)
|
||||
@p='src/processor/proc_maps_linux_unittest$(EXEEXT)'; \
|
||||
b='src/processor/proc_maps_linux_unittest'; \
|
||||
$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
|
||||
--log-file $$b.log --trs-file $$b.trs \
|
||||
$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
|
||||
"$$tst" $(AM_TESTS_FD_REDIRECT)
|
||||
src/processor/range_map_unittest.log: src/processor/range_map_unittest$(EXEEXT)
|
||||
@p='src/processor/range_map_unittest$(EXEEXT)'; \
|
||||
b='src/processor/range_map_unittest'; \
|
||||
|
|
|
@ -88,12 +88,14 @@
|
|||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "common/basictypes.h"
|
||||
#include "common/using_std_string.h"
|
||||
#include "google_breakpad/processor/code_module.h"
|
||||
#include "google_breakpad/processor/code_modules.h"
|
||||
#include "google_breakpad/processor/dump_context.h"
|
||||
#include "google_breakpad/processor/dump_object.h"
|
||||
#include "google_breakpad/processor/memory_region.h"
|
||||
#include "google_breakpad/processor/proc_maps_linux.h"
|
||||
|
||||
|
||||
namespace google_breakpad {
|
||||
|
@ -808,7 +810,7 @@ class MinidumpMemoryInfo : public MinidumpObject {
|
|||
// These objects are managed by MinidumpMemoryInfoList.
|
||||
friend class MinidumpMemoryInfoList;
|
||||
|
||||
explicit MinidumpMemoryInfo(Minidump* minidump);
|
||||
explicit MinidumpMemoryInfo(Minidump* minidump_);
|
||||
|
||||
// This works like MinidumpStream::Read, but is driven by
|
||||
// MinidumpMemoryInfoList. No size checking is done, because
|
||||
|
@ -841,7 +843,7 @@ class MinidumpMemoryInfoList : public MinidumpStream {
|
|||
|
||||
static const uint32_t kStreamType = MD_MEMORY_INFO_LIST_STREAM;
|
||||
|
||||
explicit MinidumpMemoryInfoList(Minidump* minidump);
|
||||
explicit MinidumpMemoryInfoList(Minidump* minidump_);
|
||||
|
||||
bool Read(uint32_t expected_size);
|
||||
|
||||
|
@ -852,6 +854,100 @@ class MinidumpMemoryInfoList : public MinidumpStream {
|
|||
uint32_t info_count_;
|
||||
};
|
||||
|
||||
// MinidumpLinuxMaps wraps information about a single mapped memory region
|
||||
// from /proc/self/maps.
|
||||
class MinidumpLinuxMaps : public MinidumpObject {
|
||||
public:
|
||||
// The memory address of the base of the mapped region.
|
||||
uint64_t GetBase() const { return valid_ ? region_.start : 0; }
|
||||
// The size of the mapped region.
|
||||
uint64_t GetSize() const { return valid_ ? region_.end - region_.start : 0; }
|
||||
|
||||
// The permissions of the mapped region.
|
||||
bool IsReadable() const {
|
||||
return valid_ ? region_.permissions & MappedMemoryRegion::READ : false;
|
||||
}
|
||||
bool IsWriteable() const {
|
||||
return valid_ ? region_.permissions & MappedMemoryRegion::WRITE : false;
|
||||
}
|
||||
bool IsExecutable() const {
|
||||
return valid_ ? region_.permissions & MappedMemoryRegion::EXECUTE : false;
|
||||
}
|
||||
bool IsPrivate() const {
|
||||
return valid_ ? region_.permissions & MappedMemoryRegion::PRIVATE : false;
|
||||
}
|
||||
|
||||
// The offset of the mapped region.
|
||||
uint64_t GetOffset() const { return valid_ ? region_.offset : 0; }
|
||||
|
||||
// The major device number.
|
||||
uint8_t GetMajorDevice() const { return valid_ ? region_.major_device : 0; }
|
||||
// The minor device number.
|
||||
uint8_t GetMinorDevice() const { return valid_ ? region_.minor_device : 0; }
|
||||
|
||||
// The inode of the mapped region.
|
||||
uint64_t GetInode() const { return valid_ ? region_.inode : 0; }
|
||||
|
||||
// The pathname of the mapped region.
|
||||
const string GetPathname() const { return valid_ ? region_.path : ""; }
|
||||
|
||||
// Print the contents of this mapping.
|
||||
void Print();
|
||||
|
||||
private:
|
||||
// These objects are managed by MinidumpLinuxMapsList.
|
||||
friend class MinidumpLinuxMapsList;
|
||||
|
||||
// This caller owns the pointer.
|
||||
explicit MinidumpLinuxMaps(Minidump *minidump);
|
||||
|
||||
// Read data about a single mapping from /proc/self/maps and load the data
|
||||
// into this object. The input vector is in the same format as a line from
|
||||
// /proc/self/maps.
|
||||
|
||||
// The memory region struct that this class wraps.
|
||||
MappedMemoryRegion region_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(MinidumpLinuxMaps);
|
||||
};
|
||||
|
||||
// MinidumpLinuxMapsList corresponds to the Linux-exclusive MD_LINUX_MAPS
|
||||
// stream, which contains the contents of /prod/self/maps, which contains
|
||||
// the mapped memory regions and their access permissions.
|
||||
class MinidumpLinuxMapsList : public MinidumpStream {
|
||||
public:
|
||||
virtual ~MinidumpLinuxMapsList();
|
||||
|
||||
// Get mapping at the given memory address. The caller owns the pointer.
|
||||
const MinidumpLinuxMaps *GetLinuxMapsForAddress(uint64_t address) const;
|
||||
// Get mapping at the given index. The caller owns the pointer.
|
||||
const MinidumpLinuxMaps *GetLinuxMapsAtIndex(unsigned int index) const;
|
||||
|
||||
// Print the contents of /proc/self/maps to stdout.
|
||||
void Print();
|
||||
|
||||
private:
|
||||
friend class Minidump;
|
||||
|
||||
typedef vector<MinidumpLinuxMaps *> MinidumpLinuxMappings;
|
||||
|
||||
static const uint32_t kStreamType = MD_LINUX_MAPS;
|
||||
|
||||
// The caller owns the pointer.
|
||||
explicit MinidumpLinuxMapsList(Minidump *minidump);
|
||||
|
||||
// Read and load the contents of the process mapping data.
|
||||
// The stream should have data in the form of /proc/self/maps.
|
||||
// This method returns whether the stream was read successfully.
|
||||
bool Read(uint32_t expected_size);
|
||||
|
||||
// The list of individual mappings.
|
||||
MinidumpLinuxMappings *maps_;
|
||||
// The number of mappings.
|
||||
uint32_t maps_count_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(MinidumpLinuxMapsList);
|
||||
};
|
||||
|
||||
// Minidump is the user's interface to a minidump file. It wraps MDRawHeader
|
||||
// and provides access to the minidump's top-level stream directory.
|
||||
|
@ -912,6 +1008,9 @@ class Minidump {
|
|||
virtual MinidumpBreakpadInfo* GetBreakpadInfo();
|
||||
virtual MinidumpMemoryInfoList* GetMemoryInfoList();
|
||||
|
||||
// The next method also calls GetStream, but is exclusive for Linux dumps.
|
||||
virtual MinidumpLinuxMapsList *GetLinuxMapsList();
|
||||
|
||||
// The next set of methods are provided for users who wish to access
|
||||
// data in minidump files directly, while leveraging the rest of
|
||||
// this class and related classes to handle the basic minidump
|
||||
|
|
|
@ -0,0 +1,57 @@
|
|||
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef BASE_DEBUG_PROC_MAPS_LINUX_H_
|
||||
#define BASE_DEBUG_PROC_MAPS_LINUX_H_
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "common/using_std_string.h"
|
||||
#include "google_breakpad/common/breakpad_types.h"
|
||||
|
||||
namespace google_breakpad {
|
||||
|
||||
// Describes a region of mapped memory and the path of the file mapped.
|
||||
struct MappedMemoryRegion {
|
||||
enum Permission {
|
||||
READ = 1 << 0,
|
||||
WRITE = 1 << 1,
|
||||
EXECUTE = 1 << 2,
|
||||
PRIVATE = 1 << 3, // If set, region is private, otherwise it is shared.
|
||||
};
|
||||
|
||||
// The address range [start,end) of mapped memory.
|
||||
uintptr_t start;
|
||||
uintptr_t end;
|
||||
|
||||
// Byte offset into |path| of the range mapped into memory.
|
||||
uint64_t offset;
|
||||
|
||||
// Bitmask of read/write/execute/private/shared permissions.
|
||||
uint8_t permissions;
|
||||
|
||||
// Major and minor devices.
|
||||
uint8_t major_device;
|
||||
uint8_t minor_device;
|
||||
|
||||
// Value of the inode.
|
||||
uint64_t inode;
|
||||
|
||||
// Name of the file mapped into memory.
|
||||
//
|
||||
// NOTE: path names aren't guaranteed to point at valid files. For example,
|
||||
// "[heap]" and "[stack]" are used to represent the location of the process'
|
||||
// heap and stack, respectively.
|
||||
string path;
|
||||
};
|
||||
|
||||
// Parses /proc/<pid>/maps input data and stores in |regions|. Returns true
|
||||
// and updates |regions| if and only if all of |input| was successfully parsed.
|
||||
bool ParseProcMaps(const std::string& input,
|
||||
std::vector<MappedMemoryRegion>* regions);
|
||||
|
||||
} // namespace google_breakpad
|
||||
|
||||
#endif // BASE_DEBUG_PROC_MAPS_LINUX_H_
|
|
@ -36,8 +36,6 @@
|
|||
|
||||
#include "processor/exploitability_linux.h"
|
||||
|
||||
#include <elf.h>
|
||||
|
||||
#include "google_breakpad/common/minidump_exception_linux.h"
|
||||
#include "google_breakpad/processor/call_stack.h"
|
||||
#include "google_breakpad/processor/process_state.h"
|
||||
|
@ -111,10 +109,6 @@ ExploitabilityRating ExploitabilityLinux::CheckPlatformExploitability() {
|
|||
return EXPLOITABILITY_ERR_PROCESSING;
|
||||
}
|
||||
|
||||
if (this->ArchitectureType() == UNSUPPORTED_ARCHITECTURE) {
|
||||
BPLOG(INFO) << "Unsupported architecture.";
|
||||
return EXPLOITABILITY_ERR_PROCESSING;
|
||||
}
|
||||
// Getting the instruction pointer.
|
||||
if (!context->GetInstructionPointer(&instruction_ptr)) {
|
||||
BPLOG(INFO) << "Failed to retrieve instruction pointer.";
|
||||
|
@ -131,151 +125,17 @@ ExploitabilityRating ExploitabilityLinux::CheckPlatformExploitability() {
|
|||
return EXPLOITABILITY_INTERESTING;
|
||||
}
|
||||
|
||||
LinuxArchitectureType ExploitabilityLinux::ArchitectureType() {
|
||||
// GetContextCPU() should have already been successfully called before
|
||||
// calling this method. Thus there should be a raw exception stream for
|
||||
// the minidump.
|
||||
MinidumpException *exception = dump_->GetException();
|
||||
const DumpContext *dump_context =
|
||||
exception ?
|
||||
exception->GetContext() : NULL;
|
||||
if (dump_context == NULL) {
|
||||
BPLOG(INFO) << "No raw dump context.";
|
||||
return UNSUPPORTED_ARCHITECTURE;
|
||||
}
|
||||
|
||||
// Check the architecture type.
|
||||
switch (dump_context->GetContextCPU()) {
|
||||
case MD_CONTEXT_ARM:
|
||||
case MD_CONTEXT_X86:
|
||||
return LINUX_32_BIT;
|
||||
case MD_CONTEXT_ARM64:
|
||||
case MD_CONTEXT_AMD64:
|
||||
return LINUX_64_BIT;
|
||||
default:
|
||||
// This should not happen. The four architectures above should be
|
||||
// the only Linux architectures.
|
||||
BPLOG(INFO) << "Unsupported architecture.";
|
||||
return UNSUPPORTED_ARCHITECTURE;
|
||||
}
|
||||
}
|
||||
|
||||
bool ExploitabilityLinux::InstructionPointerInCode(uint64_t instruction_ptr) {
|
||||
// Get memory mapping. Most minidumps will not contain a memory
|
||||
// mapping, so processing will commonly resort to checking modules.
|
||||
MinidumpMemoryInfoList *mem_info_list = dump_->GetMemoryInfoList();
|
||||
const MinidumpMemoryInfo *mem_info =
|
||||
mem_info_list ?
|
||||
mem_info_list->GetMemoryInfoForAddress(instruction_ptr) : NULL;
|
||||
|
||||
// Check if the memory mapping at the instruction pointer is executable.
|
||||
// If there is no memory mapping, processing will use modules as reference.
|
||||
if (mem_info != NULL) {
|
||||
return mem_info->IsExecutable();
|
||||
}
|
||||
|
||||
// If the memory mapping retrieval fails, check the modules
|
||||
// to see if the instruction pointer is inside a module.
|
||||
MinidumpModuleList *minidump_module_list = dump_->GetModuleList();
|
||||
const MinidumpModule *minidump_module =
|
||||
minidump_module_list ?
|
||||
minidump_module_list->GetModuleForAddress(instruction_ptr) : NULL;
|
||||
|
||||
// If the instruction pointer isn't in a module, return false.
|
||||
if (minidump_module == NULL) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Get ELF header data from the instruction pointer's module.
|
||||
const uint64_t base_address = minidump_module->base_address();
|
||||
MinidumpMemoryList *memory_list = dump_->GetMemoryList();
|
||||
MinidumpMemoryRegion *memory_region =
|
||||
memory_list ?
|
||||
memory_list->GetMemoryRegionForAddress(base_address) : NULL;
|
||||
|
||||
// The minidump does not have the correct memory region.
|
||||
// This returns true because even though there is no memory data available,
|
||||
// the evidence so far suggests that the instruction pointer is not at a
|
||||
// bad location.
|
||||
if (memory_region == NULL) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Examine ELF headers. Depending on the architecture, the size of the
|
||||
// ELF headers can differ.
|
||||
LinuxArchitectureType architecture = this->ArchitectureType();
|
||||
if (architecture == LINUX_32_BIT) {
|
||||
// Check if the ELF header is within the memory region and if the
|
||||
// instruction pointer lies within the ELF header.
|
||||
if (memory_region->GetSize() < sizeof(Elf32_Ehdr) ||
|
||||
instruction_ptr < base_address + sizeof(Elf32_Ehdr)) {
|
||||
return false;
|
||||
}
|
||||
// Load 32-bit ELF header.
|
||||
Elf32_Ehdr header;
|
||||
this->LoadElfHeader(memory_region, base_address, &header);
|
||||
// Check if the program header table is within the memory region, and
|
||||
// validate that the program header entry size is correct.
|
||||
if (header.e_phentsize != sizeof(Elf32_Phdr) ||
|
||||
memory_region->GetSize() <
|
||||
header.e_phoff +
|
||||
((uint64_t) header.e_phentsize * (uint64_t) header.e_phnum)) {
|
||||
return false;
|
||||
}
|
||||
// Load 32-bit Program Header Table.
|
||||
scoped_array<Elf32_Phdr> program_headers(new Elf32_Phdr[header.e_phnum]);
|
||||
this->LoadElfHeaderTable(memory_region,
|
||||
base_address + header.e_phoff,
|
||||
header.e_phnum,
|
||||
program_headers.get());
|
||||
// Find correct program header that corresponds to the instruction pointer.
|
||||
for (int i = 0; i < header.e_phnum; i++) {
|
||||
const Elf32_Phdr& program_header = program_headers[i];
|
||||
// Check if instruction pointer lies within this program header's region.
|
||||
if (instruction_ptr >= program_header.p_vaddr &&
|
||||
instruction_ptr < program_header.p_vaddr + program_header.p_memsz) {
|
||||
// Return whether this program header region is executable.
|
||||
return program_header.p_flags & PF_X;
|
||||
}
|
||||
}
|
||||
} else if (architecture == LINUX_64_BIT) {
|
||||
// Check if the ELF header is within the memory region and if the
|
||||
// instruction pointer lies within the ELF header.
|
||||
if (memory_region->GetSize() < sizeof(Elf64_Ehdr) ||
|
||||
instruction_ptr < base_address + sizeof(Elf64_Ehdr)) {
|
||||
return false;
|
||||
}
|
||||
// Load 64-bit ELF header.
|
||||
Elf64_Ehdr header;
|
||||
this->LoadElfHeader(memory_region, base_address, &header);
|
||||
// Check if the program header table is within the memory region, and
|
||||
// validate that the program header entry size is correct.
|
||||
if (header.e_phentsize != sizeof(Elf64_Phdr) ||
|
||||
memory_region->GetSize() <
|
||||
header.e_phoff +
|
||||
((uint64_t) header.e_phentsize * (uint64_t) header.e_phnum)) {
|
||||
return false;
|
||||
}
|
||||
// Load 64-bit Program Header Table.
|
||||
scoped_array<Elf64_Phdr> program_headers(new Elf64_Phdr[header.e_phnum]);
|
||||
this->LoadElfHeaderTable(memory_region,
|
||||
base_address + header.e_phoff,
|
||||
header.e_phnum,
|
||||
program_headers.get());
|
||||
// Find correct program header that corresponds to the instruction pointer.
|
||||
for (int i = 0; i < header.e_phnum; i++) {
|
||||
const Elf64_Phdr& program_header = program_headers[i];
|
||||
// Check if instruction pointer lies within this program header's region.
|
||||
if (instruction_ptr >= program_header.p_vaddr &&
|
||||
instruction_ptr < program_header.p_vaddr + program_header.p_memsz) {
|
||||
// Return whether this program header region is executable.
|
||||
return program_header.p_flags & PF_X;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// The instruction pointer was not in an area identified by the ELF headers.
|
||||
return false;
|
||||
// Get Linux memory mapping from /proc/self/maps. Checking whether the
|
||||
// region the instruction pointer is in has executable permission can tell
|
||||
// whether it is in a valid code region. If there is no mapping for the
|
||||
// instruction pointer, it is indicative that the instruction pointer is
|
||||
// not within a module, which implies that it is outside a valid area.
|
||||
MinidumpLinuxMapsList *linux_maps_list = dump_->GetLinuxMapsList();
|
||||
const MinidumpLinuxMaps *linux_maps =
|
||||
linux_maps_list ?
|
||||
linux_maps_list->GetLinuxMapsForAddress(instruction_ptr) : NULL;
|
||||
return linux_maps ? linux_maps->IsExecutable() : false;
|
||||
}
|
||||
|
||||
bool ExploitabilityLinux::BenignCrashTrigger(const MDRawExceptionStream
|
||||
|
|
|
@ -43,17 +43,6 @@
|
|||
|
||||
namespace google_breakpad {
|
||||
|
||||
enum LinuxArchitectureType {
|
||||
// A 32-bit Linux architecture.
|
||||
LINUX_32_BIT,
|
||||
|
||||
// A 64-bit Linux architecture.
|
||||
LINUX_64_BIT,
|
||||
|
||||
// Some other architecture that is not Linux.
|
||||
UNSUPPORTED_ARCHITECTURE
|
||||
};
|
||||
|
||||
class ExploitabilityLinux : public Exploitability {
|
||||
public:
|
||||
ExploitabilityLinux(Minidump *dump,
|
||||
|
@ -69,46 +58,6 @@ class ExploitabilityLinux : public Exploitability {
|
|||
// This method checks the exception that triggered the creation of the
|
||||
// minidump and reports whether the exception suggests no exploitability.
|
||||
bool BenignCrashTrigger(const MDRawExceptionStream *raw_exception_stream);
|
||||
|
||||
// Checks if the minidump architecture is 32-bit or 64-bit.
|
||||
LinuxArchitectureType ArchitectureType();
|
||||
|
||||
// Loads ELF header data of the module present in the given memory
|
||||
// region into the scoped pointer.
|
||||
// This method takes a scoped pointer in which the ELF header data is
|
||||
// loaded, the memory region containing the ELF header, and the base
|
||||
// address of the ELF header.
|
||||
template<typename T>
|
||||
void LoadElfHeader(MinidumpMemoryRegion *memory,
|
||||
uint64_t base_address,
|
||||
T *header) {
|
||||
for (size_t i = 0; i < sizeof(T); i++) {
|
||||
uint8_t my_byte = 0;
|
||||
memory->GetMemoryAtAddress(base_address + i, &my_byte);
|
||||
*(reinterpret_cast<char *>(header) + i) = my_byte;
|
||||
}
|
||||
}
|
||||
|
||||
// Loads the Program Header Table of the module present in the given
|
||||
// memory region into the scoped array.
|
||||
// This method takes a scoped array in which the header table data is
|
||||
// loaded, the memory region containing the table, the base address of
|
||||
// the program header table, and the number of entries in the table.
|
||||
template<typename T>
|
||||
void LoadElfHeaderTable(MinidumpMemoryRegion *memory,
|
||||
uint64_t base_address,
|
||||
uint16_t e_phnum,
|
||||
T table[]) {
|
||||
uint64_t offset = 0;
|
||||
for (size_t i = 0; i < e_phnum; i++) {
|
||||
T *entry = &table[i];
|
||||
for (size_t j = 0; j < sizeof(T); j++) {
|
||||
uint8_t my_byte = 0;
|
||||
memory->GetMemoryAtAddress(base_address + offset++, &my_byte);
|
||||
*(reinterpret_cast<char *>(entry) + j) = my_byte;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace google_breakpad
|
||||
|
|
|
@ -119,14 +119,10 @@ TEST(ExploitabilityTest, TestLinuxEngine) {
|
|||
ExploitabilityFor("linux_null_dereference.dmp"));
|
||||
ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
|
||||
ExploitabilityFor("linux_jmp_to_0.dmp"));
|
||||
ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
|
||||
ExploitabilityFor("linux_inside_elf_header.dmp"));
|
||||
ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
|
||||
ExploitabilityFor("linux_outside_module.dmp"));
|
||||
ASSERT_EQ(google_breakpad::EXPLOITABILITY_NONE,
|
||||
ExploitabilityFor("linux_raise_sigabrt.dmp"));
|
||||
ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
|
||||
ExploitabilityFor("linux_in_module_outside_executable_part.dmp"));
|
||||
ASSERT_EQ(google_breakpad::EXPLOITABILITY_INTERESTING,
|
||||
ExploitabilityFor("linux_inside_module_exe_region1.dmp"));
|
||||
ASSERT_EQ(google_breakpad::EXPLOITABILITY_INTERESTING,
|
||||
|
|
|
@ -55,6 +55,7 @@
|
|||
#include <iostream>
|
||||
#include <limits>
|
||||
#include <map>
|
||||
#include <sstream>
|
||||
#include <vector>
|
||||
|
||||
#include "processor/range_map-inl.h"
|
||||
|
@ -71,6 +72,7 @@ namespace google_breakpad {
|
|||
using std::istream;
|
||||
using std::ifstream;
|
||||
using std::numeric_limits;
|
||||
using std::stringstream;
|
||||
using std::vector;
|
||||
|
||||
// Returns true iff |context_size| matches exactly one of the sizes of the
|
||||
|
@ -3972,6 +3974,142 @@ void MinidumpMemoryInfoList::Print() {
|
|||
}
|
||||
}
|
||||
|
||||
//
|
||||
// MinidumpLinuxMaps
|
||||
//
|
||||
|
||||
MinidumpLinuxMaps::MinidumpLinuxMaps(Minidump *minidump)
|
||||
: MinidumpObject(minidump) {
|
||||
}
|
||||
|
||||
void MinidumpLinuxMaps::Print() {
|
||||
if (!valid_) {
|
||||
BPLOG(ERROR) << "MinidumpLinuxMaps cannot print invalid data";
|
||||
return;
|
||||
}
|
||||
std::cout << GetPathname() << std::endl;
|
||||
}
|
||||
|
||||
//
|
||||
// MinidumpLinuxMapsList
|
||||
//
|
||||
|
||||
MinidumpLinuxMapsList::MinidumpLinuxMapsList(Minidump *minidump)
|
||||
: MinidumpStream(minidump),
|
||||
maps_(NULL),
|
||||
maps_count_(0) {
|
||||
}
|
||||
|
||||
MinidumpLinuxMapsList::~MinidumpLinuxMapsList() {
|
||||
for (unsigned int i = 0; i < maps_->size(); i++) {
|
||||
delete (*maps_)[i];
|
||||
}
|
||||
delete maps_;
|
||||
}
|
||||
|
||||
const MinidumpLinuxMaps *MinidumpLinuxMapsList::GetLinuxMapsForAddress(
|
||||
uint64_t address) const {
|
||||
if (!valid_) {
|
||||
BPLOG(ERROR) << "Invalid MinidumpLinuxMapsList for GetLinuxMapsForAddress";
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Search every memory mapping.
|
||||
for (unsigned int index = 0; index < maps_count_; index++) {
|
||||
// Check if address is within bounds of the current memory region.
|
||||
if ((*maps_)[index]->GetBase() <= address &&
|
||||
(*maps_)[index]->GetBase() + (*maps_)[index]->GetSize() > address) {
|
||||
return (*maps_)[index];
|
||||
}
|
||||
}
|
||||
|
||||
// No mapping encloses the memory address.
|
||||
BPLOG(ERROR) << "MinidumpLinuxMapsList has no mapping at "
|
||||
<< HexString(address);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const MinidumpLinuxMaps *MinidumpLinuxMapsList::GetLinuxMapsAtIndex(
|
||||
unsigned int index) const {
|
||||
if (!valid_) {
|
||||
BPLOG(ERROR) << "Invalid MinidumpLinuxMapsList for GetLinuxMapsAtIndex";
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Index out of bounds.
|
||||
if (index >= maps_count_) {
|
||||
BPLOG(ERROR) << "MinidumpLinuxMapsList index of out range: "
|
||||
<< index
|
||||
<< "/"
|
||||
<< maps_count_;
|
||||
return NULL;
|
||||
}
|
||||
return (*maps_)[index];
|
||||
}
|
||||
|
||||
bool MinidumpLinuxMapsList::Read(uint32_t expected_size) {
|
||||
// Invalidate cached data.
|
||||
delete maps_;
|
||||
maps_ = NULL;
|
||||
maps_count_ = 0;
|
||||
|
||||
valid_ = false;
|
||||
|
||||
// Load and check expected stream length.
|
||||
uint32_t length = 0;
|
||||
if (!minidump_->SeekToStreamType(MD_LINUX_MAPS, &length)) {
|
||||
BPLOG(ERROR) << "MinidumpLinuxMapsList stream type not found";
|
||||
return false;
|
||||
}
|
||||
if (expected_size != length) {
|
||||
BPLOG(ERROR) << "MinidumpLinuxMapsList size mismatch: "
|
||||
<< expected_size
|
||||
<< " != "
|
||||
<< length;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Create a vector to read stream data. The vector needs to have
|
||||
// at least enough capacity to read all the data.
|
||||
vector<char> mapping_bytes(length);
|
||||
if (!minidump_->ReadBytes(&mapping_bytes[0], length)) {
|
||||
BPLOG(ERROR) << "MinidumpLinuxMapsList failed to read bytes";
|
||||
return false;
|
||||
}
|
||||
string map_string(mapping_bytes.begin(), mapping_bytes.end());
|
||||
vector<MappedMemoryRegion> all_regions;
|
||||
|
||||
// Parse string into mapping data.
|
||||
if (!ParseProcMaps(map_string, &all_regions)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
scoped_ptr<MinidumpLinuxMappings> maps(new MinidumpLinuxMappings());
|
||||
|
||||
// Push mapping data into wrapper classes.
|
||||
for (size_t i = 0; i < all_regions.size(); i++) {
|
||||
scoped_ptr<MinidumpLinuxMaps> ele(new MinidumpLinuxMaps(minidump_));
|
||||
ele->region_ = all_regions[i];
|
||||
ele->valid_ = true;
|
||||
maps->push_back(ele.release());
|
||||
}
|
||||
|
||||
// Set instance variables.
|
||||
maps_ = maps.release();
|
||||
maps_count_ = maps_->size();
|
||||
valid_ = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
void MinidumpLinuxMapsList::Print() {
|
||||
if (!valid_) {
|
||||
BPLOG(ERROR) << "MinidumpLinuxMapsList cannot print valid data";
|
||||
return;
|
||||
}
|
||||
for (size_t i = 0; i < maps_->size(); i++) {
|
||||
(*maps_)[i]->Print();
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Minidump
|
||||
|
@ -4292,6 +4430,11 @@ MinidumpMemoryInfoList* Minidump::GetMemoryInfoList() {
|
|||
return GetStream(&memory_info_list);
|
||||
}
|
||||
|
||||
MinidumpLinuxMapsList *Minidump::GetLinuxMapsList() {
|
||||
MinidumpLinuxMapsList *linux_maps_list;
|
||||
return GetStream(&linux_maps_list);
|
||||
}
|
||||
|
||||
static const char* get_stream_name(uint32_t stream_type) {
|
||||
switch (stream_type) {
|
||||
case MD_UNUSED_STREAM:
|
||||
|
|
|
@ -0,0 +1,103 @@
|
|||
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#include "google_breakpad/processor/proc_maps_linux.h"
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#if defined(OS_LINUX) || defined(OS_ANDROID)
|
||||
#include <inttypes.h>
|
||||
#endif
|
||||
|
||||
#include "processor/logging.h"
|
||||
|
||||
#if defined(OS_ANDROID) && !defined(__LP64__)
|
||||
// In 32-bit mode, Bionic's inttypes.h defines PRI/SCNxPTR as an
|
||||
// unsigned long int, which is incompatible with Bionic's stdint.h
|
||||
// defining uintptr_t as an unsigned int:
|
||||
// https://code.google.com/p/android/issues/detail?id=57218
|
||||
#undef SCNxPTR
|
||||
#define SCNxPTR "x"
|
||||
#endif
|
||||
|
||||
namespace google_breakpad {
|
||||
|
||||
bool ParseProcMaps(const std::string& input,
|
||||
std::vector<MappedMemoryRegion>* regions_out) {
|
||||
std::vector<MappedMemoryRegion> regions;
|
||||
|
||||
// This isn't async safe nor terribly efficient, but it doesn't need to be at
|
||||
// this point in time.
|
||||
|
||||
// Split the string by newlines.
|
||||
std::vector<std::string> lines;
|
||||
std::string line = "";
|
||||
for (size_t i = 0; i < input.size(); i++) {
|
||||
if (input[i] != '\n' && input[i] != '\r') {
|
||||
line.push_back(input[i]);
|
||||
} else if (line.size() > 0) {
|
||||
lines.push_back(line);
|
||||
line.clear();
|
||||
}
|
||||
}
|
||||
if (line.size() > 0) {
|
||||
BPLOG(ERROR) << "Input doesn't end in newline";
|
||||
return false;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < lines.size(); ++i) {
|
||||
MappedMemoryRegion region;
|
||||
const char* line = lines[i].c_str();
|
||||
char permissions[5] = {'\0'}; // Ensure NUL-terminated string.
|
||||
int path_index = 0;
|
||||
|
||||
// Sample format from man 5 proc:
|
||||
//
|
||||
// address perms offset dev inode pathname
|
||||
// 08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpm
|
||||
//
|
||||
// The final %n term captures the offset in the input string, which is used
|
||||
// to determine the path name. It *does not* increment the return value.
|
||||
// Refer to man 3 sscanf for details.
|
||||
if (sscanf(line, "%" SCNxPTR "-%" SCNxPTR " %4c %lx %hhx:%hhx %ld %n",
|
||||
®ion.start, ®ion.end, permissions, ®ion.offset,
|
||||
®ion.major_device, ®ion.minor_device, ®ion.inode,
|
||||
&path_index) < 7) {
|
||||
BPLOG(ERROR) << "sscanf failed for line: " << line;
|
||||
return false;
|
||||
}
|
||||
|
||||
region.permissions = 0;
|
||||
|
||||
if (permissions[0] == 'r')
|
||||
region.permissions |= MappedMemoryRegion::READ;
|
||||
else if (permissions[0] != '-')
|
||||
return false;
|
||||
|
||||
if (permissions[1] == 'w')
|
||||
region.permissions |= MappedMemoryRegion::WRITE;
|
||||
else if (permissions[1] != '-')
|
||||
return false;
|
||||
|
||||
if (permissions[2] == 'x')
|
||||
region.permissions |= MappedMemoryRegion::EXECUTE;
|
||||
else if (permissions[2] != '-')
|
||||
return false;
|
||||
|
||||
if (permissions[3] == 'p')
|
||||
region.permissions |= MappedMemoryRegion::PRIVATE;
|
||||
else if (permissions[3] != 's' && permissions[3] != 'S') // Shared memory.
|
||||
return false;
|
||||
|
||||
// Pushing then assigning saves us a string copy.
|
||||
regions.push_back(region);
|
||||
regions.back().path.assign(line + path_index);
|
||||
}
|
||||
|
||||
regions_out->swap(regions);
|
||||
return true;
|
||||
}
|
||||
|
||||
} // namespace google_breakpad
|
|
@ -0,0 +1,250 @@
|
|||
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#include "breakpad_googletest_includes.h"
|
||||
#include "google_breakpad/processor/proc_maps_linux.h"
|
||||
|
||||
namespace {
|
||||
|
||||
TEST(ProcMapsTest, Empty) {
|
||||
std::vector<google_breakpad::MappedMemoryRegion> regions;
|
||||
EXPECT_TRUE(ParseProcMaps("", ®ions));
|
||||
EXPECT_EQ(0u, regions.size());
|
||||
}
|
||||
|
||||
TEST(ProcMapsTest, NoSpaces) {
|
||||
static const char kNoSpaces[] =
|
||||
"00400000-0040b000 r-xp 00002200 fc:00 794418 /bin/cat\n";
|
||||
|
||||
std::vector<google_breakpad::MappedMemoryRegion> regions;
|
||||
ASSERT_TRUE(ParseProcMaps(kNoSpaces, ®ions));
|
||||
ASSERT_EQ(1u, regions.size());
|
||||
|
||||
EXPECT_EQ(0x00400000u, regions[0].start);
|
||||
EXPECT_EQ(0x0040b000u, regions[0].end);
|
||||
EXPECT_EQ(0x00002200u, regions[0].offset);
|
||||
EXPECT_EQ("/bin/cat", regions[0].path);
|
||||
}
|
||||
|
||||
TEST(ProcMapsTest, Spaces) {
|
||||
static const char kSpaces[] =
|
||||
"00400000-0040b000 r-xp 00002200 fc:00 794418 /bin/space cat\n";
|
||||
|
||||
std::vector<google_breakpad::MappedMemoryRegion> regions;
|
||||
ASSERT_TRUE(ParseProcMaps(kSpaces, ®ions));
|
||||
ASSERT_EQ(1u, regions.size());
|
||||
|
||||
EXPECT_EQ(0x00400000u, regions[0].start);
|
||||
EXPECT_EQ(0x0040b000u, regions[0].end);
|
||||
EXPECT_EQ(0x00002200u, regions[0].offset);
|
||||
EXPECT_EQ("/bin/space cat", regions[0].path);
|
||||
}
|
||||
|
||||
TEST(ProcMapsTest, NoNewline) {
|
||||
static const char kNoSpaces[] =
|
||||
"00400000-0040b000 r-xp 00002200 fc:00 794418 /bin/cat";
|
||||
|
||||
std::vector<google_breakpad::MappedMemoryRegion> regions;
|
||||
ASSERT_FALSE(ParseProcMaps(kNoSpaces, ®ions));
|
||||
}
|
||||
|
||||
TEST(ProcMapsTest, NoPath) {
|
||||
static const char kNoPath[] =
|
||||
"00400000-0040b000 rw-p 00000000 00:00 0 \n";
|
||||
|
||||
std::vector<google_breakpad::MappedMemoryRegion> regions;
|
||||
ASSERT_TRUE(ParseProcMaps(kNoPath, ®ions));
|
||||
ASSERT_EQ(1u, regions.size());
|
||||
|
||||
EXPECT_EQ(0x00400000u, regions[0].start);
|
||||
EXPECT_EQ(0x0040b000u, regions[0].end);
|
||||
EXPECT_EQ(0x00000000u, regions[0].offset);
|
||||
EXPECT_EQ("", regions[0].path);
|
||||
}
|
||||
|
||||
TEST(ProcMapsTest, Heap) {
|
||||
static const char kHeap[] =
|
||||
"022ac000-022cd000 rw-p 00000000 00:00 0 [heap]\n";
|
||||
|
||||
std::vector<google_breakpad::MappedMemoryRegion> regions;
|
||||
ASSERT_TRUE(ParseProcMaps(kHeap, ®ions));
|
||||
ASSERT_EQ(1u, regions.size());
|
||||
|
||||
EXPECT_EQ(0x022ac000u, regions[0].start);
|
||||
EXPECT_EQ(0x022cd000u, regions[0].end);
|
||||
EXPECT_EQ(0x00000000u, regions[0].offset);
|
||||
EXPECT_EQ("[heap]", regions[0].path);
|
||||
}
|
||||
|
||||
#if defined(ARCH_CPU_32_BITS)
|
||||
TEST(ProcMapsTest, Stack32) {
|
||||
static const char kStack[] =
|
||||
"beb04000-beb25000 rw-p 00000000 00:00 0 [stack]\n";
|
||||
|
||||
std::vector<google_breakpad::MappedMemoryRegion> regions;
|
||||
ASSERT_TRUE(ParseProcMaps(kStack, ®ions));
|
||||
ASSERT_EQ(1u, regions.size());
|
||||
|
||||
EXPECT_EQ(0xbeb04000u, regions[0].start);
|
||||
EXPECT_EQ(0xbeb25000u, regions[0].end);
|
||||
EXPECT_EQ(0x00000000u, regions[0].offset);
|
||||
EXPECT_EQ("[stack]", regions[0].path);
|
||||
}
|
||||
#elif defined(ARCH_CPU_64_BITS)
|
||||
TEST(ProcMapsTest, Stack64) {
|
||||
static const char kStack[] =
|
||||
"7fff69c5b000-7fff69c7d000 rw-p 00000000 00:00 0 [stack]\n";
|
||||
|
||||
std::vector<google_breakpad::MappedMemoryRegion> regions;
|
||||
ASSERT_TRUE(ParseProcMaps(kStack, ®ions));
|
||||
ASSERT_EQ(1u, regions.size());
|
||||
|
||||
EXPECT_EQ(0x7fff69c5b000u, regions[0].start);
|
||||
EXPECT_EQ(0x7fff69c7d000u, regions[0].end);
|
||||
EXPECT_EQ(0x00000000u, regions[0].offset);
|
||||
EXPECT_EQ("[stack]", regions[0].path);
|
||||
}
|
||||
#endif
|
||||
|
||||
TEST(ProcMapsTest, Multiple) {
|
||||
static const char kMultiple[] =
|
||||
"00400000-0040b000 r-xp 00000000 fc:00 794418 /bin/cat\n"
|
||||
"0060a000-0060b000 r--p 0000a000 fc:00 794418 /bin/cat\n"
|
||||
"0060b000-0060c000 rw-p 0000b000 fc:00 794418 /bin/cat\n";
|
||||
|
||||
std::vector<google_breakpad::MappedMemoryRegion> regions;
|
||||
ASSERT_TRUE(ParseProcMaps(kMultiple, ®ions));
|
||||
ASSERT_EQ(3u, regions.size());
|
||||
|
||||
EXPECT_EQ(0x00400000u, regions[0].start);
|
||||
EXPECT_EQ(0x0040b000u, regions[0].end);
|
||||
EXPECT_EQ(0x00000000u, regions[0].offset);
|
||||
EXPECT_EQ("/bin/cat", regions[0].path);
|
||||
|
||||
EXPECT_EQ(0x0060a000u, regions[1].start);
|
||||
EXPECT_EQ(0x0060b000u, regions[1].end);
|
||||
EXPECT_EQ(0x0000a000u, regions[1].offset);
|
||||
EXPECT_EQ("/bin/cat", regions[1].path);
|
||||
|
||||
EXPECT_EQ(0x0060b000u, regions[2].start);
|
||||
EXPECT_EQ(0x0060c000u, regions[2].end);
|
||||
EXPECT_EQ(0x0000b000u, regions[2].offset);
|
||||
EXPECT_EQ("/bin/cat", regions[2].path);
|
||||
}
|
||||
|
||||
TEST(ProcMapsTest, Permissions) {
|
||||
static struct {
|
||||
const char* input;
|
||||
uint8_t permissions;
|
||||
} kTestCases[] = {
|
||||
{"00400000-0040b000 ---s 00000000 fc:00 794418 /bin/cat\n", 0},
|
||||
{"00400000-0040b000 ---S 00000000 fc:00 794418 /bin/cat\n", 0},
|
||||
{"00400000-0040b000 r--s 00000000 fc:00 794418 /bin/cat\n",
|
||||
google_breakpad::MappedMemoryRegion::READ},
|
||||
{"00400000-0040b000 -w-s 00000000 fc:00 794418 /bin/cat\n",
|
||||
google_breakpad::MappedMemoryRegion::WRITE},
|
||||
{"00400000-0040b000 --xs 00000000 fc:00 794418 /bin/cat\n",
|
||||
google_breakpad::MappedMemoryRegion::EXECUTE},
|
||||
{"00400000-0040b000 rwxs 00000000 fc:00 794418 /bin/cat\n",
|
||||
google_breakpad::MappedMemoryRegion::READ
|
||||
| google_breakpad::MappedMemoryRegion::WRITE
|
||||
| google_breakpad::MappedMemoryRegion::EXECUTE},
|
||||
{"00400000-0040b000 ---p 00000000 fc:00 794418 /bin/cat\n",
|
||||
google_breakpad::MappedMemoryRegion::PRIVATE},
|
||||
{"00400000-0040b000 r--p 00000000 fc:00 794418 /bin/cat\n",
|
||||
google_breakpad::MappedMemoryRegion::READ
|
||||
| google_breakpad::MappedMemoryRegion::PRIVATE},
|
||||
{"00400000-0040b000 -w-p 00000000 fc:00 794418 /bin/cat\n",
|
||||
google_breakpad::MappedMemoryRegion::WRITE
|
||||
| google_breakpad::MappedMemoryRegion::PRIVATE},
|
||||
{"00400000-0040b000 --xp 00000000 fc:00 794418 /bin/cat\n",
|
||||
google_breakpad::MappedMemoryRegion::EXECUTE
|
||||
| google_breakpad::MappedMemoryRegion::PRIVATE},
|
||||
{"00400000-0040b000 rwxp 00000000 fc:00 794418 /bin/cat\n",
|
||||
google_breakpad::MappedMemoryRegion::READ
|
||||
| google_breakpad::MappedMemoryRegion::WRITE
|
||||
| google_breakpad::MappedMemoryRegion::EXECUTE
|
||||
| google_breakpad::MappedMemoryRegion::PRIVATE},
|
||||
};
|
||||
|
||||
for (size_t i = 0; i < sizeof(kTestCases) / sizeof(kTestCases[0]); ++i) {
|
||||
std::vector<google_breakpad::MappedMemoryRegion> regions;
|
||||
EXPECT_TRUE(ParseProcMaps(kTestCases[i].input, ®ions));
|
||||
EXPECT_EQ(1u, regions.size());
|
||||
if (regions.empty())
|
||||
continue;
|
||||
EXPECT_EQ(kTestCases[i].permissions, regions[0].permissions);
|
||||
}
|
||||
}
|
||||
|
||||
TEST(ProcMapsTest, MissingFields) {
|
||||
static const char* kTestCases[] = {
|
||||
"00400000\n", // Missing end + beyond.
|
||||
"00400000-0040b000\n", // Missing perms + beyond.
|
||||
"00400000-0040b000 r-xp\n", // Missing offset + beyond.
|
||||
"00400000-0040b000 r-xp 00000000\n", // Missing device + beyond.
|
||||
"00400000-0040b000 r-xp 00000000 fc:00\n", // Missing inode + beyond.
|
||||
"00400000-0040b000 00000000 fc:00 794418 /bin/cat\n", // Missing perms.
|
||||
"00400000-0040b000 r-xp fc:00 794418 /bin/cat\n", // Missing offset.
|
||||
"00400000-0040b000 r-xp 00000000 fc:00 /bin/cat\n", // Missing inode.
|
||||
"00400000 r-xp 00000000 fc:00 794418 /bin/cat\n", // Missing end.
|
||||
"-0040b000 r-xp 00000000 fc:00 794418 /bin/cat\n", // Missing start.
|
||||
"00400000-0040b000 r-xp 00000000 794418 /bin/cat\n", // Missing device.
|
||||
};
|
||||
|
||||
for (size_t i = 0; i < sizeof(kTestCases) / sizeof(kTestCases[0]); ++i) {
|
||||
std::vector<google_breakpad::MappedMemoryRegion> regions;
|
||||
EXPECT_FALSE(ParseProcMaps(kTestCases[i], ®ions));
|
||||
}
|
||||
}
|
||||
|
||||
TEST(ProcMapsTest, InvalidInput) {
|
||||
static const char* kTestCases[] = {
|
||||
"thisisal-0040b000 rwxp 00000000 fc:00 794418 /bin/cat\n",
|
||||
"0040000d-linvalid rwxp 00000000 fc:00 794418 /bin/cat\n",
|
||||
"00400000-0040b000 inpu 00000000 fc:00 794418 /bin/cat\n",
|
||||
"00400000-0040b000 rwxp tforproc fc:00 794418 /bin/cat\n",
|
||||
"00400000-0040b000 rwxp 00000000 ma:ps 794418 /bin/cat\n",
|
||||
"00400000-0040b000 rwxp 00000000 fc:00 parse! /bin/cat\n",
|
||||
};
|
||||
|
||||
for (size_t i = 0; i < sizeof(kTestCases) / sizeof(kTestCases[0]); ++i) {
|
||||
std::vector<google_breakpad::MappedMemoryRegion> regions;
|
||||
EXPECT_FALSE(ParseProcMaps(kTestCases[i], ®ions));
|
||||
}
|
||||
}
|
||||
|
||||
TEST(ProcMapsTest, ParseProcMapsEmptyString) {
|
||||
std::vector<google_breakpad::MappedMemoryRegion> regions;
|
||||
EXPECT_TRUE(ParseProcMaps("", ®ions));
|
||||
EXPECT_EQ(0ULL, regions.size());
|
||||
}
|
||||
|
||||
// Testing a couple of remotely possible weird things in the input:
|
||||
// - Line ending with \r\n or \n\r.
|
||||
// - File name contains quotes.
|
||||
// - File name has whitespaces.
|
||||
TEST(ProcMapsTest, ParseProcMapsWeirdCorrectInput) {
|
||||
std::vector<google_breakpad::MappedMemoryRegion> regions;
|
||||
const std::string kContents =
|
||||
"00400000-0040b000 r-xp 00000000 fc:00 2106562 "
|
||||
" /bin/cat\r\n"
|
||||
"7f53b7dad000-7f53b7f62000 r-xp 00000000 fc:00 263011 "
|
||||
" /lib/x86_64-linux-gnu/libc-2.15.so\n\r"
|
||||
"7f53b816d000-7f53b818f000 r-xp 00000000 fc:00 264284 "
|
||||
" /lib/x86_64-linux-gnu/ld-2.15.so\n"
|
||||
"7fff9c7ff000-7fff9c800000 r-xp 00000000 00:00 0 "
|
||||
" \"vd so\"\n"
|
||||
"ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 "
|
||||
" [vsys call]\n";
|
||||
EXPECT_TRUE(ParseProcMaps(kContents, ®ions));
|
||||
EXPECT_EQ(5ULL, regions.size());
|
||||
EXPECT_EQ("/bin/cat", regions[0].path);
|
||||
EXPECT_EQ("/lib/x86_64-linux-gnu/libc-2.15.so", regions[1].path);
|
||||
EXPECT_EQ("/lib/x86_64-linux-gnu/ld-2.15.so", regions[2].path);
|
||||
EXPECT_EQ("\"vd so\"", regions[3].path);
|
||||
EXPECT_EQ("[vsys call]", regions[4].path);
|
||||
}
|
||||
|
||||
} // namespace
|
Двоичный файл не отображается.
Двоичный файл не отображается.
Загрузка…
Ссылка в новой задаче