summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/AddressSpace.hpp14
-rw-r--r--src/UnwindCursor.hpp5
2 files changed, 11 insertions, 8 deletions
diff --git a/src/AddressSpace.hpp b/src/AddressSpace.hpp
index 6c13408..908c898 100644
--- a/src/AddressSpace.hpp
+++ b/src/AddressSpace.hpp
@@ -32,6 +32,13 @@
#endif
#endif
+#if defined(_LIBUNWIND_ARM_EHABI)
+struct EHABIIndexEntry {
+ uint32_t functionOffset;
+ uint32_t data;
+};
+#endif
+
#ifdef __APPLE__
#include <mach-o/getsect.h>
namespace libunwind {
@@ -462,12 +469,13 @@ inline bool LocalAddressSpace::findUnwindSections(pint_t targetAddr,
(void)targetAddr;
(void)info;
return true;
-#elif defined(_LIBUNWIND_ARM_EHABI) && defined(__BIONIC__) && \
- (__ANDROID_API__ < 21)
+#elif defined(_LIBUNWIND_ARM_EHABI) && defined(__BIONIC__)
+ // For ARM EHABI, Bionic didn't implement dl_iterate_phdr until API 21. After
+ // API 21, dl_iterate_phdr exists, but dl_unwind_find_exidx is much faster.
int length = 0;
info.arm_section =
(uintptr_t)dl_unwind_find_exidx((_Unwind_Ptr)targetAddr, &length);
- info.arm_section_length = (uintptr_t)length;
+ info.arm_section_length = (uintptr_t)length * sizeof(EHABIIndexEntry);
if (info.arm_section && info.arm_section_length)
return true;
#elif defined(_LIBUNWIND_ARM_EHABI) || defined(_LIBUNWIND_SUPPORT_DWARF_UNWIND)
diff --git a/src/UnwindCursor.hpp b/src/UnwindCursor.hpp
index 488c317..b4d44e1 100644
--- a/src/UnwindCursor.hpp
+++ b/src/UnwindCursor.hpp
@@ -1222,11 +1222,6 @@ template <typename A, typename R> bool UnwindCursor<A, R>::isSignalFrame() {
#endif // defined(_LIBUNWIND_SUPPORT_SEH_UNWIND)
#if defined(_LIBUNWIND_ARM_EHABI)
-struct EHABIIndexEntry {
- uint32_t functionOffset;
- uint32_t data;
-};
-
template<typename A>
struct EHABISectionIterator {
typedef EHABISectionIterator _Self;