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."); }