.debug_frame is useful independent from the other .debug sections. Add a simplified variant of the addrcfi testcase dwarfcfi. dwarfcfi only uses dwarf_frame calls and no dwfl helpers.
Signed-off-by: Mark Wielaard <m...@klomp.org> --- libdw/ChangeLog | 5 + libdw/dwarf_begin_elf.c | 3 +- tests/ChangeLog | 17 ++++ tests/Makefile.am | 8 +- tests/dwarfcfi.c | 175 +++++++++++++++++++++++++++++++++++ tests/run-dwarfcfi.sh | 133 ++++++++++++++++++++++++++ tests/testfile11-debugframe.bz2 | Bin 0 -> 2202 bytes tests/testfile12-debugframe.bz2 | Bin 0 -> 1385 bytes tests/testfileaarch64-debugframe.bz2 | Bin 0 -> 1820 bytes tests/testfilearm-debugframe.bz2 | Bin 0 -> 1987 bytes tests/testfileppc32-debugframe.bz2 | Bin 0 -> 1526 bytes tests/testfileppc64-debugframe.bz2 | Bin 0 -> 1555 bytes 12 files changed, 339 insertions(+), 2 deletions(-) create mode 100644 tests/dwarfcfi.c create mode 100755 tests/run-dwarfcfi.sh create mode 100644 tests/testfile11-debugframe.bz2 create mode 100644 tests/testfile12-debugframe.bz2 create mode 100755 tests/testfileaarch64-debugframe.bz2 create mode 100755 tests/testfilearm-debugframe.bz2 create mode 100755 tests/testfileppc32-debugframe.bz2 create mode 100755 tests/testfileppc64-debugframe.bz2 diff --git a/libdw/ChangeLog b/libdw/ChangeLog index c7e39c6..97f4f19 100644 --- a/libdw/ChangeLog +++ b/libdw/ChangeLog @@ -1,3 +1,8 @@ +2018-06-27 Mark Wielaard <m...@klomp.org> + + * dwarf_begin_elf.c (check_section): Allow a single .debug_frame + section. + 2018-06-25 Mark Wielaard <m...@klomp.org> * Makefile.am (libdw_a_SOURCES): Add dwarf_next_lines.c. diff --git a/libdw/dwarf_begin_elf.c b/libdw/dwarf_begin_elf.c index e1542c7..184a6dc 100644 --- a/libdw/dwarf_begin_elf.c +++ b/libdw/dwarf_begin_elf.c @@ -209,7 +209,8 @@ valid_p (Dwarf *result) Require at least one section that can be read "standalone". */ if (likely (result != NULL) && unlikely (result->sectiondata[IDX_debug_info] == NULL - && result->sectiondata[IDX_debug_line] == NULL)) + && result->sectiondata[IDX_debug_line] == NULL + && result->sectiondata[IDX_debug_frame] == NULL)) { Dwarf_Sig8_Hash_free (&result->sig8_hash); __libdw_seterrno (DWARF_E_NO_DWARF); diff --git a/tests/ChangeLog b/tests/ChangeLog index 256edec..1e03f6b 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,20 @@ +2018-06-27 Mark Wielaard <m...@klomp.org> + + * dwarf_cfi.c: New file. + * run-dwarfcfi.sh: New test. + * testfile11-debugframe.bz2: New testfile. + * testfile12-debugframe.bz2: Likewise. + * testfileaarch64-debugframe.bz2: Likewise. + * testfilearm-debugframe.bz2: Likewise. + * testfileppc32-debugframe.bz2: Likewise. + * testfileppc64-debugframe.bz2: Likewise. + * Makefile.am (check_PROGRAMS): Add dwarfcfi. + (TESTS): Add run-dwarfcfi.sh. + (EXTRA_DIST): Add run-dwarfcfi.sh, testfile11-debugframe.bz2, + testfile12-debugframe.bz2, testfileaarch64-debugframe.bz2, + testfilearm-debugframe.bz2, testfileppc32-debugframe.bz2 and + testfileppc64-debugframe.bz2. + 2018-06-25 Mark Wielaard <m...@klomp.org> * next-files.c: New file. diff --git a/tests/Makefile.am b/tests/Makefile.am index 7b29fd8..47e5555 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -46,6 +46,7 @@ check_PROGRAMS = arextract arsymtest newfile saridx scnnames sectiondump \ dwfl-bug-addr-overflow arls dwfl-bug-fd-leak \ dwfl-addr-sect dwfl-bug-report early-offscn \ dwfl-bug-getmodules dwarf-getmacros dwarf-ranges addrcfi \ + dwarfcfi \ test-flag-nobits dwarf-getstring rerequest_tag \ alldts typeiter typeiter2 low_high_pc \ test-elf_cntl_gelf_getshdr dwflsyms dwfllines \ @@ -95,6 +96,7 @@ TESTS = run-arextract.sh run-arsymtest.sh run-ar.sh newfile test-nlist \ run-ranlib-test2.sh run-ranlib-test3.sh run-ranlib-test4.sh \ run-addrscopes.sh run-strings-test.sh run-funcscopes.sh \ run-find-prologues.sh run-allregs.sh run-addrcfi.sh \ + run-dwarfcfi.sh \ run-nm-self.sh run-readelf-self.sh run-readelf-info-plus.sh \ run-readelf-const-values.sh \ run-varlocs-self.sh run-exprlocs-self.sh \ @@ -205,7 +207,10 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \ run-addrscopes.sh run-strings-test.sh run-funcscopes.sh \ run-nm-self.sh run-readelf-self.sh run-readelf-info-plus.sh \ run-readelf-const-values.sh testfile-const-values.debug.bz2 \ - run-addrcfi.sh \ + run-addrcfi.sh run-dwarfcfi.sh \ + testfile11-debugframe.bz2 testfile12-debugframe.bz2 \ + testfileaarch64-debugframe.bz2 testfilearm-debugframe.bz2 \ + testfileppc32-debugframe.bz2 testfileppc64-debugframe.bz2 \ run-varlocs-self.sh run-exprlocs-self.sh \ run-find-prologues.sh run-allregs.sh run-native-test.sh \ run-addrname-test.sh run-dwfl-bug-offline-rel.sh \ @@ -506,6 +511,7 @@ dwarf_getmacros_LDADD = $(libdw) dwarf_ranges_LDADD = $(libdw) dwarf_getstring_LDADD = $(libdw) addrcfi_LDADD = $(libdw) $(libebl) $(libelf) $(argp_LDADD) -ldl +dwarfcfi_LDADD = $(libdw) $(libelf) test_flag_nobits_LDADD = $(libelf) rerequest_tag_LDADD = $(libdw) alldts_LDADD = $(libdw) $(libelf) diff --git a/tests/dwarfcfi.c b/tests/dwarfcfi.c new file mode 100644 index 0000000..db4a36f --- /dev/null +++ b/tests/dwarfcfi.c @@ -0,0 +1,175 @@ +/* Test program for DWARF (.debug_frame) CFI handling. + Copyright (C) 2009-2010, 2013, 2015, 2018 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + elfutils is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#include <config.h> +#include <assert.h> +#include <inttypes.h> +#include <error.h> +#include ELFUTILS_HEADER(dw) +#include <dwarf.h> +#include <argp.h> +#include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <locale.h> +#include <stdlib.h> +#include <string.h> + +#include "../libdw/known-dwarf.h" + +static const char * +op_name (unsigned int code) +{ + static const char *const known[] = + { +#define DWARF_ONE_KNOWN_DW_OP(NAME, CODE) [CODE] = #NAME, + DWARF_ALL_KNOWN_DW_OP +#undef DWARF_ONE_KNOWN_DW_OP + }; + + if (likely (code < sizeof (known) / sizeof (known[0]))) + return known[code]; + + return NULL; +} + +static void +print_detail (int result, const Dwarf_Op *ops, size_t nops) +{ + if (result < 0) + printf ("indeterminate (%s)\n", dwarf_errmsg (-1)); + else if (nops == 0) + printf ("%s\n", ops == NULL ? "same_value" : "undefined"); + else + { + printf ("%s expression:", result == 0 ? "location" : "value"); + for (size_t i = 0; i < nops; ++i) + { + printf (" %s", op_name(ops[i].atom)); + if (ops[i].number2 == 0) + { + if (ops[i].atom == DW_OP_addr) + printf ("(%#" PRIx64 ")", ops[i].number); + else if (ops[i].number != 0) + printf ("(%" PRId64 ")", ops[i].number); + } + else + printf ("(%" PRId64 ",%" PRId64 ")", + ops[i].number, ops[i].number2); + } + puts (""); + } +} + +static int +handle_address (Dwarf_CFI *cfi, GElf_Addr pc) +{ + Dwarf_Frame *frame; + int result = dwarf_cfi_addrframe (cfi, pc, &frame); + if (result != 0) + { + printf ("dwarf_cfi_addrframe: %s\n", dwarf_errmsg (-1)); + return 1; + } + + Dwarf_Addr start = pc; + Dwarf_Addr end = pc; + bool signalp; + int ra_regno = dwarf_frame_info (frame, &start, &end, &signalp); + + printf ("%#" PRIx64 " => [%#" PRIx64 ", %#" PRIx64 "):\n", + pc, start, end); + + if (ra_regno < 0) + printf ("\treturn address register unavailable (%s)\n", + dwarf_errmsg (-1)); + else + printf ("\treturn address in reg%u%s\n", + ra_regno, signalp ? " (signal frame)" : ""); + + // Point cfa_ops to dummy to match print_detail expectations. + // (nops == 0 && cfa_ops != NULL => "undefined") + Dwarf_Op dummy; + Dwarf_Op *cfa_ops = &dummy; + size_t cfa_nops; + result = dwarf_frame_cfa (frame, &cfa_ops, &cfa_nops); + + printf ("\tCFA "); + print_detail (result, cfa_ops, cfa_nops); + + // Print the location of the first 10 (DWARF nr) registers + for (int r = 0; r < 10; r++) + { + Dwarf_Op ops_mem[3]; + Dwarf_Op *ops; + size_t nops; + printf ("\treg%d: ", r); + int reg_result = dwarf_frame_register (frame, r, ops_mem, &ops, &nops); + print_detail (reg_result, ops, nops); + result |= reg_result; + } + + free (frame); + return result; +} + +int +main (int argc, char *argv[]) +{ + if (argc <= 2) + error (EXIT_FAILURE, 0, "need file name argument and addresses"); + + int fd = open (argv[1], O_RDONLY); + if (fd == -1) + error (EXIT_FAILURE, errno, "cannot open input file `%s'", argv[1]); + + elf_version (EV_CURRENT); + + Elf *elf = elf_begin (fd, ELF_C_READ, NULL); + if (elf == NULL) + error (EXIT_FAILURE, 0, "cannot create ELF descriptor: %s", + elf_errmsg (-1)); + + Dwarf *dwarf = dwarf_begin_elf (elf, DWARF_C_READ, NULL); + if (dwarf == NULL) + error (EXIT_FAILURE, 0, "cannot create DWARF descriptor: %s", + dwarf_errmsg (-1)); + + Dwarf_CFI *cfi = dwarf_getcfi (dwarf); + if (cfi == NULL) + error (EXIT_FAILURE, 0, "cannot get DWARF CFI from .dwarf_frame: %s", + dwarf_errmsg (-1)); + + int result = 0; + int args = 2; + do + { + char *endp; + uintmax_t addr = strtoumax (argv[args], &endp, 0); + if (endp != argv[args]) + result |= handle_address (cfi, addr); + else + result = 1; + } + while (args++ < argc - 1); + + dwarf_end (dwarf); + elf_end (elf); + + return result; +} diff --git a/tests/run-dwarfcfi.sh b/tests/run-dwarfcfi.sh new file mode 100755 index 0000000..98fa171 --- /dev/null +++ b/tests/run-dwarfcfi.sh @@ -0,0 +1,133 @@ +#! /bin/sh +# Test for dwarf_getcfi. +# Copyright (C) 2018 Red Hat, Inc. +# This file is part of elfutils. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# elfutils is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +. $srcdir/test-subr.sh + +# Test files come from run-addrcfi with all sections stripped except +# the .debug_frame. +# for i in <testfiles> +# eu-strip -f $i-debugframe $i +# eu-strip -g --remove-comment --keep-section=.debug_frame $i-debugframe +# done +testfiles testfile11-debugframe testfile12-debugframe +testfiles testfileaarch64-debugframe +testfiles testfilearm-debugframe +testfiles testfileppc32-debugframe +testfiles testfileppc64-debugframe + +testfiles testfile11-debugframe +testrun_compare ${abs_builddir}/dwarfcfi testfile11-debugframe 0x080489b8 <<\EOF +0x80489b8 => [0x80489b8, 0x80489b9): + return address in reg8 + CFA location expression: bregx(4,4) + reg0: undefined + reg1: undefined + reg2: undefined + reg3: same_value + reg4: location expression: call_frame_cfa stack_value + reg5: same_value + reg6: same_value + reg7: same_value + reg8: location expression: call_frame_cfa plus_uconst(-4) + reg9: undefined +EOF + +testfiles testfile12-debugframe +testrun_compare ${abs_builddir}/dwarfcfi testfile12-debugframe 0x00000000000009d0 <<\EOF +0x9d0 => [0x9d0, 0x9d1): + return address in reg16 + CFA location expression: bregx(7,8) + reg0: same_value + reg1: undefined + reg2: undefined + reg3: undefined + reg4: undefined + reg5: undefined + reg6: same_value + reg7: location expression: call_frame_cfa stack_value + reg8: undefined + reg9: undefined +EOF + +testfiles testfileppc32-debugframe +testrun_compare ${abs_builddir}/dwarfcfi testfileppc32-debugframe 0x100004c0 <<\EOF +0x100004c0 => [0x100004c0, 0x100004d0): + return address in reg65 + CFA location expression: bregx(1) + reg0: undefined + reg1: location expression: call_frame_cfa stack_value + reg2: same_value + reg3: undefined + reg4: undefined + reg5: undefined + reg6: undefined + reg7: undefined + reg8: undefined + reg9: undefined +EOF + +testfiles testfileppc64-debugframe +testrun_compare ${abs_builddir}/dwarfcfi testfileppc64-debugframe 0x00000000100005b0 <<\EOF +0x100005b0 => [0x100005b0, 0x100005d0): + return address in reg65 + CFA location expression: bregx(1) + reg0: undefined + reg1: location expression: call_frame_cfa stack_value + reg2: same_value + reg3: undefined + reg4: undefined + reg5: undefined + reg6: undefined + reg7: undefined + reg8: undefined + reg9: undefined +EOF + +testfiles testfilearm-debugframe +testrun_compare ${abs_builddir}/dwarfcfi testfilearm-debugframe 0x00008510 <<\EOF +0x8510 => [0x8510, 0x8524): + return address in reg14 + CFA location expression: bregx(13) + reg0: undefined + reg1: undefined + reg2: undefined + reg3: undefined + reg4: same_value + reg5: same_value + reg6: same_value + reg7: same_value + reg8: same_value + reg9: undefined +EOF + +testfiles testfileaarch64-debugframe +testrun_compare ${abs_builddir}/dwarfcfi testfileaarch64-debugframe 0x400550 <<\EOF +0x400550 => [0x400550, 0x400568): + return address in reg30 + CFA location expression: bregx(31) + reg0: undefined + reg1: undefined + reg2: undefined + reg3: undefined + reg4: undefined + reg5: undefined + reg6: undefined + reg7: undefined + reg8: undefined + reg9: undefined +EOF diff --git a/tests/testfile11-debugframe.bz2 b/tests/testfile11-debugframe.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..5c07d16a02b3ae653c61901320c7550a40e7c0dd GIT binary patch literal 2202 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 Of>#|(ODW1Rvg1E{G29ve literal 0 HcmV?d00001 diff --git a/tests/testfile12-debugframe.bz2 b/tests/testfile12-debugframe.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b8cc19c3cbad5e38f03dee6f7c1ab2b27013f86c GIT binary patch literal 1385 zcmV-v1(y0kT4*^jL0KkKS!U5OzyJn0fB*mg|NPMF|40A#{%ZgC-*C%7M|DC(V$5(5 z(nJFQa{$l;`xb<x9<CYyp`wDCG-$*!Wc4tb0LTCUGynh^XwWnb15BC&K*-UfKm?%z z0WxGEJcU0~QTm~^03N2AJwN~&Gynhq20#D+9#d%qg%e1gp-h=Jpu`$IPfbjW^+&1d zU?H^tG|<U}(8S56ni^yVO*9PvWDsCYFq&dwXvu&k0GbR0(*Oj?fB+GKF)<hf(8Mxm z!78cyRW$W9$N&uh0MKX+G8zB?$PEJ!$Ob?F0001bpaxvRtr$E9jiQAhR}3j5cA#0Z z&MGZS739t9uW8Y1N%pH2KRbfR1aq@KL%SD^8rS8W_t3=?5FJ~irhIXyHhs-$(Fn&e zWbCWO@_$vw4V>6NHcn>s$pY0_(9Ts=aJ>W&)f7lyX4*+Fz#{E}S`At+(^XUZT3Bn+ zRS};7B@)_UL<xQWnX5QQ>`E26QQ`@#M6Xq~PDFM64{)+rJnP=>@aguPjP38AtrH?3 zK$)0sVbhc;LWl*38oi{53`r!|GDtKwHX#}#5(Pxq(*_MQ;9~Y(quVqYZ5Wt^8W0Vj zNwf<ji8k0Jxsf)JjxvsjB_aTA2y6#*5|Roqk;D!(<Bdko3ds@|;Nmujj0B)12aO0Y zp{q__StPk;0ieSlin|$l?4_&GpKo~AEGBr01rCCHTd8A$3_<Fmq(qfJ(Ip=%qiIsj zTqe%ON{p&#nzY3a4;oW}V`PMEsGUwXQ6D=)>oN^C#>d6%Q)XKXfGU`D<j_=U`$guF zp`S@7!Q^QYxBp?8nhSs@1^@>pkRWJ+GXkUeG+3t>wmy`tH_zkzd;I=gEg=xdg5v}Q z36T*nG6HsddSY5BWL{O`67M`rV-3|%muE%>T*{z-oBbyyEO%|$t<&GU+dGrYcC7|g zt5(&|X(Go5#VNXa93S?GU3J&p&97+Cb<TFRuS(aZ*_`D7?KFV;TJvu7opEN>%2fKY zyvo|r`|*NY4Riqfwe+AH9O11-n7h(On?=eI7Y4=XF$Jtnvj{pi5+=uvMo=ntC`H1^ zEUcin3~umX6M^)e0I(OYm?fXwJTUP{J3i!8X;jJ#z&l{hsMGyJmKW!<v96l1?ZY5F z1p)%n?2t4MAVERq2n)e@C?-HaKybib6oqxx6oKx6vityHqNsa19PDs7?(|j)XPb0? z4>N~?gPr!BM;IFwoCZRZZ^{QHLC;|J-|A4-LzjTi<*l8B#Q%6QNi|~&xHw26<%*p6 z2GsK71he8*6u$!H7Fvhej(+N`d6Il#kr9-rjc31d(uqRSasYvgzAkj599qt9w@)%L zw`4B_#qThF6;C1QZ%>qrno;CVrd-3)#GKt^=91p&!MWI?i#H`LF{Q^SIPbrz1Hgn5 z(8L(v_K)JDDmrrOMZ^^-Lbo)bBGr0|7ZXF=agLcbiHk?ZIn8=qufM-!^sH}TR~~6K z;P8@Er_r8y5rW2(a;C%=VzC2#o~cC@JSjG)M|6_j+8=4FAR8UMA^qGFjvpVN2m-Fz zl0!lY*<{GBu3^tn9zH{X^%vqaZX`;E)~qPa42=3^tx#D&Fie&M%TjV=u#_f)$B~)E z7Y1<LBU)Xtri!s6-O=pjeAlg`)}&J=G~zNfQ$)hSV3<9!*fL#!gt7*`q=Rdfh|^&F zwjGnhWDIy^ytpXIrnID0MLDd>jOESLry`ZrOW6-UJffj~87o)(OjLPvRN0bPzF_KI rF~lPXLQ_6bSrMUO6px9;Oc4Z{Ws%T93Y7&R|BJaIoG3^$Xqeytx1x0M literal 0 HcmV?d00001 diff --git a/tests/testfileaarch64-debugframe.bz2 b/tests/testfileaarch64-debugframe.bz2 new file mode 100755 index 0000000000000000000000000000000000000000..e77494a10fc2ed99f50190a67441d8af2549796a GIT binary patch literal 1820 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 E4|6&ovH$=8 literal 0 HcmV?d00001 diff --git a/tests/testfilearm-debugframe.bz2 b/tests/testfilearm-debugframe.bz2 new file mode 100755 index 0000000000000000000000000000000000000000..51ce2d3711bb1f6f8153b0f35aca57ca2b15929c GIT binary patch literal 1987 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 V0mV4AK*BTrF64@Ep&?L8kigc0X!-yE literal 0 HcmV?d00001 diff --git a/tests/testfileppc32-debugframe.bz2 b/tests/testfileppc32-debugframe.bz2 new file mode 100755 index 0000000000000000000000000000000000000000..b6ae4ea6710f0ba322e513a0f2e168e18dcd4817 GIT binary patch literal 1526 zcmV<S1qu2>T4*^jL0KkKStB;t!vF?rfB*mg|NrDyedPc5|78F7-|Xgq+(hL;2m^FL zba!e-^=;4vfl6Ro29p2=VX2WCnFREiC$%(Uo<@Nf2pR^OWMuU{CWoZRWb}Y!8U}%o zXvvy^rc9ob6CfoJ2x>N_K{ZX3@}8%t+McKCBhq@9gCGC^Gz~NW00E|e0000Q07<B! zCQ<+cLqO5#s4@TsnE(Om000^Q00w{n9-sq2)6yW*5u*{NO)_CHOieK{3<MaOVlWdE z0RS{$1YnH}hD;+MX`?_vrXxlpOqyiEV3?X>Vi*W9G{j&gCISFxzzD$_84Q?4K+{Hn ztMZ}q8w;0}I{y#J@1adM2g1%~oUTjeVZ(=|uK}v~s7a>8)a^`Y@;7bCl~q<H)>gr; zuds!@-q^&l!EUIbMgLj^5!nh#grq5c<$%b!kdOis97iJ+Rd13&ffHt65p_<4p`Uk^ zw(8s}(3q2MrOtBPtjT<=2<-+X6z5>ax#U<$2mmrbVwa?Yw{zdiB2x%Okpu!Nmu6PA z6E3)-81p)6A|r$q617Au_|VhIvrN<8N(&YG9-wuho#6nW<2&+=a1KGl=3+L0(l$m< zO+W-wjU2y*`{P50MoyMV#`_jG^J2pCZ`O|I(`vFP43UcNj1oGZ%N-?{AOHzXszY60 zzKxt-igh@a_9xAUa$Cs5Yr=JvzQcdUW3{?iHEh4McKf%{r3^4+wi<D|Stoo*0SuMb z2O@VF$O|%w71!KJk0Dj!F@=jUQ|8aOi+c{+3QG|rPoGZ9jM_qV(ycNmtb`yc^(jCB z638J2NB|m1Nft@qa5rHhfDa^^mr1AzaBY=ZX<%~9fK^ddQmCq0R+Q7>Eyb*8qZkI+ zEm8rij(a)XwL)r)37J$u1Q8(+KoOEK1_2a;$glxsMM{xj7{mpMB*<10C~OiEkyI87 z0%EBlQAJ3w7E4LL?u-G9LqYyUj$*I<r<%On?F7BixX@|5<gYkD1Z^Q0<PaQ7$1o~& zZCnj~+fcRa<Sz~mZYkg?RPa7NYw28A0&vjKFzl2_n<kma@{~$ZFhJd~q$QyRgf@3l zS{8=RLM!uT(Q_rlHi#LLuL3C|$!vgAq|SU`Ltz0y13grwWX>2=fOZH5hC@k)NE1nb z3K%58l5WiO8DU09Wa}k4Bq@f_-?|LW8yjksRaI2IYcb|Mm))1S`gW1^vfoO4befup zgrYP3YNvAeR1o|tX<HX6NfB>aN0?~mzWcuO`Md6Xt!y=ayoqMisH3U6@+%1@C{8a< zh+ek6&Bhu6=1PK)y|3fAt-d?W&+oj#bu5`MWP%bv0|eXCEi%-*p)%ie@GOwi#<tnD z46;Dxbv8rGZEQSq?@@yq^cJlUyEz0YQ4?La=vLBDtrA(lS3z{iZPI@6rVNlBciGOl zamz9=Q*?h3NEORB;Xm-iw`d|W46Tx)s;HyQA;t{5vpIt0TJ-JBFsxV7+L--FI22Z2 zdvd;KFs*O{cq%IQWH`rIGf`8fGL?6#riO8R4+cxNF=Yt4N*Hua(Ay~cc6G+{<zaBB zWEUB>MF`%~f<Y0o+!4e?!j|I{%#At7Wn+~!up`FDlC2()w3AE>m6;nVp2kw9lvKRv z7(_27k|Z@Ro1?3YDimoI9)v~ZNmN$t{+*Qyv{6*d>yT<ZO4>E5-HQ_<lS_Fu*i#A? zO;u55YN28yZINlQp3TwW%`6~lj@HUfGeY&$ys?satimX)w2OhjlpZ~*L?1%zhI~Yc zxH4iZG7^Rt*<LCZp<)#X=G?U+z)B1liCI#Va#S)mGA(gDgQf+@Q&LmFIl55CuJ+=> z#Re+@W+IsL;sOQiLQ|n|<Z)9PjRq9BaS4>-ZdhsUZ*#Gk%vJa6lJSVexS)T#1n0ZM zb5&K%JchT%;xq^lSKNXArEB9_2Mv5K&Gf8lOS+Q>eZ8X`O#wx0rsl6>p8Xr6Fx{~B cT(BIxx&p+L0i<BidE@>r<ce^iAVzJohA^bG+5i9m literal 0 HcmV?d00001 diff --git a/tests/testfileppc64-debugframe.bz2 b/tests/testfileppc64-debugframe.bz2 new file mode 100755 index 0000000000000000000000000000000000000000..85c80ac66266fda4ad25211c81f6207a43824db8 GIT binary patch literal 1555 zcmV+u2JHDlT4*^jL0KkKS>j8gSO5oc|NsC0|M$)7{M3K<{__9--*Ld;O;q4aP(kfY zGYv*^;7ia2dI9E*-PEh4WyL8C2{cAVr=wKyqGcL-VNW7yrh_JpsffY=15FwY01X-q z8Z^^JPf!31jDTo{rkNQ-DWvqCrXy--8UPIgKmY&$05k!h0000000L7&fi*PsGHEhR zGf>fqrj0bv(-TcG4H{uGWCoZ+K+&Tih-k>f4H`7l0X;+*1T<o344PpwX^;VgXwv|g z0$~P*K*Y!c005YoFcSeZ2^2vT-lS>isp$aF14f3LX`!G10009+KmY&@4F-S!0BF^k zsZ-`cMJlCQv0hfJX}+<{WcO2$-dn6Ml2+F&Oy?jZlD`Q6Iba;f3<66NIiV*K!#|`M zeit(`BUhiNJ&QEQTsTwhXD%JfjCdyfv?NM>taoC1UTyhtl91NHV<sg~WCa5tB0Am` zy2|mn=Lm(2mT)&yRc8HwhQJYKD41<Bu@R#ncLyGhPHP}$V#}>7RYJ-YN9kWK5-K!( zWtu6N5pc~%C22jCIZZ+lytHWPo8g!(D$c0WmXW1VmZ;HVs#|uF<gN(1s48Pozlll2 zOD*ezp0Jv<^i#dlA$mkaLi+8{Dag4Duyr!7&|*TQ$pgGV2!+lI>LLJ!+{i_@qm0Xs zGy|<pT~&mB+ZuCtOK6C6xQGA)&6DKN%+C1RJ=WCJuga6r(fj<qf4g7Iq6AYkkOD5P z#RU)q2+p+xx~77itSXdFtu18*ZE0S8C6xj>uW-~@B!<!(Nwk5n0N8;srqV++%%Ukc zKtL!$2zO2i>#^vd)<Q3W2cS|^@eUy9A_UCY!vQD&Gze@P5Zh=&7?T*mfjbn#K^6#U zfX0R~gG^!ww2;B1C_Q^gD6}93(i=e7ayAem@9Dz#zQ%THaGK7~^(wt8@S*3$YO|oy z!Gn4-4(DYUGs<xD-HL|vNeO<s4ISB1HA0lED0a?tnUyNOD;!f{nS&z(7(qh_U5<*y zLI>}KDbBA?-_muy-i>2w_t)5R1hodLB3a?di6T2xBL+c;*F+;>V&&cN{9g(}prQa2 zS3nw9(m-G(-i`FbAxpSRjv&5<Z?h@M1f4nzbPZipNG4%Kf=LrJEJ&Q}Wlhael&Vpo zG|~&|P!#h*u+maAg)>PM<%tInffhxj2m}n%=D7Io49R^&P(Whz+_4Nz^pNYR^SHp3 z307$Uc-cDG|6;#4@HCBNs(U%y%iIrEGMI|P0I@J-rGbb4Q82@_nWk!<uV3f&rnGhc zc#gt*Eq$Nz?g&-(*_|98#zO#uCIZZh3>YK^=@ro>hq3D1JTXi@+dK;BpuL>KqL*ic z>FtWhJX#@AiKfGLY<C5}Pg7@Rgx9W7u{9bbVGQ-=$=~uNsp$4&$EzsIw*;Ar6U0Op zUM;-nG-WV_?(i!vCDBR-G+HKv4ubx+V*?Z^aZ+GV(yAlP5^Kem-NfZ%F?^|E&6#8; z?DnSd?5xUwG-`L~OWG=a33f*u)xl&_yKHv(jy2^b?ndcPJd~O%%W5XMnb=E&KUoqs zcJ_2Cw~$64c1q-;xfRu<EJZjG!CfLkabZ=Bkk05J&{LmzO^g!HPiaB7rsBKmyI!j0 z-s+&aHthBsX;LP|7;tc5Q)QCct^>iWG{O*QH;G&t^uWZ-@MpR)SjB{-hw*?kh09Jd z1Vda%KnmZvrz$ECbIi=8Q^qWW#74DW3X(iWA!Zjs<{&~-4Hsbr)$PEGgNR$Ia*JNN z2gmK9#W@9X62oFBD1=rSl;JbjjRWM45kM?Lkv)L?7&)P^p4x#}ga}Lti>_|8YG^6K zf`AhTn4yI5t8<c82uW}f1O>4QFC9Ds7M1brU08smAfd}xMlB8o3XF$h%Wg0d(pd1& z4qbqfnZ^WOE90x)gQ+c(rm#^c>WG$3|GzBOpkRm?TtdRH<z~S5sMO(L$h1X&jpux& zA*(GTQ9r92OU=U28+9v`Xpu|8Z0$NW&U!^P2N{T)l6Rm$2{9!MAi{s*?ntK!5*$f% FO8{wgzsLXp literal 0 HcmV?d00001 -- 1.8.3.1