Index: src/AddressSpace.hpp
===================================================================
--- src/AddressSpace.hpp
+++ src/AddressSpace.hpp
@@ -221,6 +221,10 @@
const uint8_t *p = (uint8_t *)addr;
pint_t result;
+ if (encoding == DW_EH_PE_omit) {
+ return (pint_t)NULL;
+ }
+
// first get value
switch (encoding & 0x0F) {
case DW_EH_PE_ptr:
Index: src/EHHeaderParser.hpp
===================================================================
--- src/EHHeaderParser.hpp
+++ src/EHHeaderParser.hpp
@@ -103,6 +103,9 @@
EHHeaderParser::EHHeaderInfo hdrInfo;
EHHeaderParser::decodeEHHdr(addressSpace, ehHdrStart, ehHdrEnd, hdrInfo);
+ if (hdrInfo.fde_count == 0)
+ return false;
+
size_t tableEntrySize = getTableEntrySize(hdrInfo.table_enc);
pint_t tableEntry;
@@ -136,6 +139,10 @@
template
size_t EHHeaderParser::getTableEntrySize(uint8_t tableEnc) {
+ if (tableEnc == DW_EH_PE_omit) {
+ return 0;
+ }
+
switch (tableEnc & 0x0f) {
case DW_EH_PE_sdata2:
case DW_EH_PE_udata2:
@@ -149,8 +156,6 @@
case DW_EH_PE_sleb128:
case DW_EH_PE_uleb128:
_LIBUNWIND_ABORT("Can't binary search on variable length encoded data.");
- case DW_EH_PE_omit:
- return 0;
default:
_LIBUNWIND_ABORT("Unknown DWARF encoding for search table.");
}