| |
| |
| #include "../src/config.h" |
|
|
| |
|
|
| #if defined(_LIBUNWIND_USE_DL_ITERATE_PHDR) && \ |
| defined(_LIBUNWIND_USE_FRAME_HEADER_CACHE) |
|
|
| #include <link.h> |
| #include <stdio.h> |
|
|
| |
| |
| #include "../src/AddressSpace.hpp" |
|
|
| #define kBaseAddr 0xFFF000 |
| #define kTextSegmentLength 0xFF |
|
|
| using namespace libunwind; |
|
|
| int main() { |
| FrameHeaderCache FHC; |
| struct dl_phdr_info PInfo; |
| memset(&PInfo, 0, sizeof(PInfo)); |
| |
| |
| |
| PInfo.dlpi_adds = 6; |
| PInfo.dlpi_subs = 7; |
|
|
| UnwindInfoSections UIS; |
| UIS.dso_base = kBaseAddr; |
| UIS.text_segment_length = kTextSegmentLength; |
| dl_iterate_cb_data CBData; |
| |
| CBData.addressSpace = nullptr; |
| CBData.sects = &UIS; |
| CBData.targetAddr = kBaseAddr + 1; |
|
|
| |
| if (FHC.find(&PInfo, 0, &CBData)) |
| abort(); |
| FHC.add(&UIS); |
| |
| if (!FHC.find(&PInfo, 0, &CBData)) |
| abort(); |
| |
| PInfo.dlpi_adds++; |
| if (FHC.find(&PInfo, 0, &CBData)) |
| abort(); |
|
|
| FHC.add(&UIS); |
| CBData.targetAddr = kBaseAddr - 1; |
| |
| if (FHC.find(&PInfo, 0, &CBData)) |
| abort(); |
| |
| for (int i = 0; i < 9; i++) { |
| UIS.dso_base = kBaseAddr + (kTextSegmentLength * i); |
| FHC.add(&UIS); |
| } |
| CBData.targetAddr = kBaseAddr; |
| |
| if (FHC.find(&PInfo, 0, &CBData)) |
| abort(); |
| return 0; |
| } |
|
|
| #else |
| int main() { return 0;} |
| #endif |
|
|