Helper function to get the size of a GNU compressed zdebug section. Signed-off-by: Mark Wielaard <m...@redhat.com> --- libdw/ChangeLog | 4 ++ libdw/libdw.map | 5 ++ libdwelf/ChangeLog | 7 ++ libdwelf/Makefile.am | 4 +- libdwelf/dwelf_scn_gnu_compressed_size.c | 77 ++++++++++++++++++++++ libdwelf/libdwelf.h | 9 ++- tests/ChangeLog | 12 ++++ tests/Makefile.am | 10 ++- tests/dwelfgnucompressed.c | 104 +++++++++++++++++++++++++++++ tests/run-dwelfgnucompressed.sh | 108 +++++++++++++++++++++++++++++++ tests/testfile-zgnu32.bz2 | Bin 0 -> 780 bytes tests/testfile-zgnu32be.bz2 | Bin 0 -> 779 bytes tests/testfile-zgnu64.bz2 | Bin 0 -> 785 bytes tests/testfile-zgnu64be.bz2 | Bin 0 -> 795 bytes 14 files changed, 334 insertions(+), 6 deletions(-) create mode 100644 libdwelf/dwelf_scn_gnu_compressed_size.c create mode 100644 tests/dwelfgnucompressed.c create mode 100755 tests/run-dwelfgnucompressed.sh create mode 100755 tests/testfile-zgnu32.bz2 create mode 100755 tests/testfile-zgnu32be.bz2 create mode 100755 tests/testfile-zgnu64.bz2 create mode 100755 tests/testfile-zgnu64be.bz2
diff --git a/libdw/ChangeLog b/libdw/ChangeLog index f8b4793..dfe8333 100644 --- a/libdw/ChangeLog +++ b/libdw/ChangeLog @@ -1,3 +1,7 @@ +2015-10-28 Mark Wielaard <m...@redhat.com> + + * libdw.map (ELFUTILS_0.165): New. Add dwelf_scn_gnu_compressed_size. + 2015-12-02 Mark Wielaard <m...@redhat.com> * fde.c (intern_fde): Don't leak duplicate FDEs. diff --git a/libdw/libdw.map b/libdw/libdw.map index 1d4cbb0..1681b6b 100644 --- a/libdw/libdw.map +++ b/libdw/libdw.map @@ -322,3 +322,8 @@ ELFUTILS_0.161 { dwarf_macro_getparamcnt; dwarf_macro_param; } ELFUTILS_0.160; + +ELFUTILS_0.165 { + global: + dwelf_scn_gnu_compressed_size; +} ELFUTILS_0.161; diff --git a/libdwelf/ChangeLog b/libdwelf/ChangeLog index f182ecf..fe8af1b 100644 --- a/libdwelf/ChangeLog +++ b/libdwelf/ChangeLog @@ -1,3 +1,10 @@ +2015-10-28 Mark Wielaard <m...@redhat.com> + + * Makefile.am (libdwelf_a_SOURCES): Add + dwelf_scn_gnu_compressed_size.c. + * dwelf_scn_gnu_compressed_size.c: Likewise. + * libdwelf.h (dwelf_scn_gnu_compressed_size): New declaration. + 2015-10-14 Chih-Hung Hsieh <c...@google.com> * dwelf_elf_gnu_build_id.c (find_elf_build_id): Move nested function diff --git a/libdwelf/Makefile.am b/libdwelf/Makefile.am index cd4b7dd..4de4b2e 100644 --- a/libdwelf/Makefile.am +++ b/libdwelf/Makefile.am @@ -2,7 +2,7 @@ ## ## Process this file with automake to create Makefile.in ## -## Copyright (C) 2014 Red Hat, Inc. +## Copyright (C) 2014, 2015 Red Hat, Inc. ## This file is part of elfutils. ## ## This file is free software; you can redistribute it and/or modify @@ -40,7 +40,7 @@ pkginclude_HEADERS = libdwelf.h noinst_HEADERS = libdwelfP.h libdwelf_a_SOURCES = dwelf_elf_gnu_debuglink.c dwelf_dwarf_gnu_debugaltlink.c \ - dwelf_elf_gnu_build_id.c + dwelf_elf_gnu_build_id.c dwelf_scn_gnu_compressed_size.c libdwelf = $(libdw) diff --git a/libdwelf/dwelf_scn_gnu_compressed_size.c b/libdwelf/dwelf_scn_gnu_compressed_size.c new file mode 100644 index 0000000..d39b702 --- /dev/null +++ b/libdwelf/dwelf_scn_gnu_compressed_size.c @@ -0,0 +1,77 @@ +/* Return size of GNU compressed section. + Copyright (C) 2015 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 either + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at + your option) any later version + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at + your option) any later version + + or both in parallel, as here. + + 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 copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see <http://www.gnu.org/licenses/>. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include "libdwelfP.h" +#include "libelfP.h" + +ssize_t +dwelf_scn_gnu_compressed_size (Elf_Scn *scn) +{ + if (scn == NULL) + return -1; + + GElf_Shdr shdr; + if (gelf_getshdr (scn, &shdr) == NULL) + return -1; + + /* Allocated or no bits sections can never be compressed. */ + if ((shdr.sh_flags & SHF_ALLOC) != 0 + || shdr.sh_type == SHT_NULL + || shdr.sh_type == SHT_NOBITS) + return -1; + + Elf_Data *d = elf_rawdata (scn, NULL); + if (d == NULL) + return -1; + + if (d->d_size >= 4 + 8 + && memcmp (d->d_buf, "ZLIB", 4) == 0) + { + /* There is a 12-byte header of "ZLIB" followed by + an 8-byte big-endian size. There is only one type and + alignment isn't preserved separately. */ + uint64_t size; + memcpy (&size, d->d_buf + 4, sizeof size); + size = be64toh (size); + + /* One more sanity check, size should be bigger than original + data size plus some overhead (4 chars ZLIB + 8 bytes size + 6 + bytes zlib stream overhead + 5 bytes overhead max for one 16K + block) and should fit into a size_t. */ + if (size + 4 + 8 + 6 + 5 < d->d_size || size > SIZE_MAX) + return -1; + + return size; + } + + return -1; +} diff --git a/libdwelf/libdwelf.h b/libdwelf/libdwelf.h index e16dc0f..7f7f679 100644 --- a/libdwelf/libdwelf.h +++ b/libdwelf/libdwelf.h @@ -1,5 +1,5 @@ /* Interfaces for libdwelf. DWARF ELF Low-level Functions. - Copyright (C) 2014 Red Hat, Inc. + Copyright (C) 2014, 2015 Red Hat, Inc. This file is part of elfutils. This file is free software; you can redistribute it and/or modify @@ -65,6 +65,13 @@ extern ssize_t dwelf_dwarf_gnu_debugaltlink (Dwarf *dwarf, note. Returns -1 in case of malformed data or other errors. */ extern ssize_t dwelf_elf_gnu_build_id (Elf *elf, const void **build_idp); +/* Returns the size of the uncompressed data of a GNU compressed + section. The section name should start with .zdebug (but this + isn't checked by this function). If the section isn't compressed + (the section data doesn't start with ZLIB) -1 is returned. If an + error occured -1 is returned and elf_errno is set. */ +extern ssize_t dwelf_scn_gnu_compressed_size (Elf_Scn *scn); + #ifdef __cplusplus } #endif diff --git a/tests/ChangeLog b/tests/ChangeLog index cfef289..23e973e 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,15 @@ +2015-10-28 Mark Wielaard <m...@redhat.com> + + * dwelfgnucompressed.c: New file. + * run-dwelfgnucompressed.sh: New test. + * testfile-zgnu32.bz2: New testfile. + * testfile-zgnu64.bz2: Likewise. + * Makefile.am (check_PROGRAMS): Add dwelfgnucompressed. + (TESTS): Add run-dwelfgnucompressed.sh. + (EXTRA_DIST): Add run-dwelfgnucompressed.sh, testfile-zgnu32.bz2, + testfile-zgnu64.bz2, testfile-zgnu32be.bz2, testfile-zgnu64be.bz2. + (dwelfgnucompressed_LDADD): New variable. + 2015-12-31 Mark Wielaard <m...@redhat.com> * elfstrmerge.c (main): Warn about STT_SECTION symbol for shstrhndx. diff --git a/tests/Makefile.am b/tests/Makefile.am index 744f695..d9ec97f 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -52,7 +52,7 @@ check_PROGRAMS = arextract arsymtest newfile saridx scnnames sectiondump \ backtrace-data backtrace-dwarf debuglink debugaltlink \ buildid deleted deleted-lib.so aggregate_size vdsosyms \ getsrc_die strptr newdata elfstrtab dwfl-proc-attach \ - elfshphehdr elfstrmerge + elfshphehdr elfstrmerge dwelfgnucompressed asm_TESTS = asm-tst1 asm-tst2 asm-tst3 asm-tst4 asm-tst5 \ asm-tst6 asm-tst7 asm-tst8 asm-tst9 @@ -120,7 +120,7 @@ TESTS = run-arextract.sh run-arsymtest.sh newfile test-nlist \ run-readelf-dwz-multi.sh run-allfcts-multi.sh run-deleted.sh \ run-linkmap-cut.sh run-aggregate-size.sh vdsosyms run-readelf-A.sh \ run-getsrc-die.sh run-strptr.sh newdata elfstrtab dwfl-proc-attach \ - elfshphehdr run-lfs-symbols.sh + elfshphehdr run-lfs-symbols.sh run-dwelfgnucompressed.sh if !BIARCH export ELFUTILS_DISABLE_BIARCH = 1 @@ -304,7 +304,10 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \ testfile-x32-core.bz2 testfile-x32.bz2 \ backtrace.x32.core.bz2 backtrace.x32.exec.bz2 \ testfile-x32-s.bz2 testfile-x32-d.bz2 testfile-x32-debug.bz2 \ - run-lfs-symbols.sh lfs-symbols testfile-nolfs.bz2 + run-lfs-symbols.sh lfs-symbols testfile-nolfs.bz2 \ + testfile-zgnu32.bz2 testfile-zgnu64.bz2 \ + testfile-zgnu32be.bz2 testfile-zgnu64be.bz2 \ + run-dwelfgnucompressed.sh if USE_VALGRIND valgrind_cmd='valgrind -q --leak-check=full --error-exitcode=1' @@ -453,6 +456,7 @@ dwfl_proc_attach_LDADD = $(libdw) dwfl_proc_attach_LDFLAGS = -pthread $(AM_LDFLAGS) elfshphehdr_LDADD =$(libelf) elfstrmerge_LDADD = $(libebl) $(libelf) +dwelfgnucompressed_LDADD = $(libelf) $(libdw) if GCOV check: check-am coverage diff --git a/tests/dwelfgnucompressed.c b/tests/dwelfgnucompressed.c new file mode 100644 index 0000000..0132271 --- /dev/null +++ b/tests/dwelfgnucompressed.c @@ -0,0 +1,104 @@ +/* Copyright (C) 2015 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/>. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <assert.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <inttypes.h> + +#include ELFUTILS_HEADER(elf) +#include ELFUTILS_HEADER(dwelf) +#include <gelf.h> + +#include <stdio.h> +#include <unistd.h> +#include <string.h> + +int +main (int argc, char *argv[]) +{ + int result = 0; + int cnt; + + elf_version (EV_CURRENT); + + for (cnt = 1; cnt < argc; ++cnt) + { + int fd = open (argv[cnt], O_RDONLY); + + Elf *elf = elf_begin (fd, ELF_C_READ, NULL); + if (elf == NULL) + { + printf ("%s not usable %s\n", argv[cnt], elf_errmsg (-1)); + result = 1; + close (fd); + continue; + } + + size_t shdrstrndx; + if (elf_getshdrstrndx (elf, &shdrstrndx) == -1) + { + printf ("elf_getshdrstrnd failed %s\n", elf_errmsg (-1)); + result = 1; + close (fd); + continue; + } + + Elf_Scn *scn = NULL; + while ((scn = elf_nextscn (elf, scn)) != NULL) + { + int idx = elf_ndxscn (scn); + GElf_Shdr shdr; + if (gelf_getshdr (scn, &shdr) == NULL) + { + printf ("gelf_getshdr failed: %s\n", elf_errmsg (-1)); + result = 1; + break; + } + + const char *sname = elf_strptr (elf, shdrstrndx, shdr.sh_name); + if (sname == NULL) + { + printf ("couldn't get section name: %s\n", elf_errmsg (-1)); + result = 1; + break; + } + + if (strncmp(".zdebug", sname, strlen (".zdebug")) == 0) + { + ssize_t size; + if ((size = dwelf_scn_gnu_compressed_size (scn)) == -1) + { + printf ("dwelf_scn_gnu_compressed_size failed: %s\n", + elf_errmsg (-1)); + result = 1; + break; + } + printf ("section %d: GNU Compressed size: %zx\n", idx, size); + } + } + + elf_end (elf); + close (fd); + } + + return result; +} diff --git a/tests/run-dwelfgnucompressed.sh b/tests/run-dwelfgnucompressed.sh new file mode 100755 index 0000000..b93a56f --- /dev/null +++ b/tests/run-dwelfgnucompressed.sh @@ -0,0 +1,108 @@ +#! /bin/sh +# Copyright (C) 2015 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 + +# = funcs.s = +# .globl testfunc +# testfunc: +# nop +# ret +# .type testfunc, @function +# .size testfunc, .-testfunc +# +# .globl testfunc2 +# testfunc2: +# call testfunc +# nop +# nop +# ret +# .type testfunc2, @function +# .size testfunc2, .-testfunc2 +# +# .globl functest3 +# functest3: +# jmp local +# nop +# nop +# local: +# call testfunc2 +# ret +# .type functest3, @function +# .size functest3, .-functest3 + +# = start.s = +# .global _start +# _start: +# call functest3 +# nop +# nop +# nop +# nop +# nop +# nop +# nop +# nop +# nop +# nop +# nop +# nop +# nop +# nop +# nop +# nop +# ret +# .type _start, @function +# .size _start, .-_start + +# gas --compress-debug-sections=zlib-gnu -32 -g -o start.o start.s +# gas --compress-debug-sections=zlib-gnu -32 -g -o funcs.o funcs.s +# ld --compress-debug-sections=zlib-gnu -melf_i386 -g -o zgnu32 funcs.o start.o + +# gas --compress-debug-sections=zlib-gnu -64 -g -o start.o start.s +# gas --compress-debug-sections=zlib-gnu -64 -g -o funcs.o funcs.s +# ld --compress-debug-sections=zlib-gnu -g -o zgnu32 funcs.o start.o + +testfiles testfile-zgnu64 +testrun_compare ${abs_top_builddir}/tests/dwelfgnucompressed testfile-zgnu64 <<\EOF +section 2: GNU Compressed size: 60 +section 3: GNU Compressed size: aa +section 5: GNU Compressed size: 8d +EOF + +testfiles testfile-zgnu64be +testrun_compare ${abs_top_builddir}/tests/dwelfgnucompressed testfile-zgnu64be <<\EOF +section 3: GNU Compressed size: 60 +section 4: GNU Compressed size: 7e +section 6: GNU Compressed size: 8d +EOF + +testfiles testfile-zgnu32 +testrun_compare ${abs_top_builddir}/tests/dwelfgnucompressed testfile-zgnu32 <<\EOF +section 2: GNU Compressed size: 40 +section 3: GNU Compressed size: 9a +section 5: GNU Compressed size: 85 +EOF + +testfiles testfile-zgnu32be +testrun_compare ${abs_top_builddir}/tests/dwelfgnucompressed testfile-zgnu32be <<\EOF +section 3: GNU Compressed size: 40 +section 4: GNU Compressed size: 6e +section 6: GNU Compressed size: 85 +EOF + +exit 0 diff --git a/tests/testfile-zgnu32.bz2 b/tests/testfile-zgnu32.bz2 new file mode 100755 index 0000000000000000000000000000000000000000..9d622cad1739554cbf744ed471936a5b470a1148 GIT binary patch literal 780 zcmV+n1M~bsT4*^jL0KkKSrTWQ^8f*#fB*mY{V8v8d@c9vWp)4e|9$6Wcs(<4h;aTe z5FikJ=rF(n7&(9jrb#_2eiC|*LYQqS>6F@@ri}nJ(<9Vrw15E9)bfX^p`+A#gCVDq z4@u=brbdrVH8xQO69i<yOafq-ATR(4fC+#RrVzwnBSsN~(V!VJWCog4$RU$J(@Cai zJs<|AYB4Yb!enXcVlsLFj0vUyOaKX^0GJvns$}&v(9p@FLqKRW(U8P4XaE2MAPoS- zGz@?M27m#}asxKZGK?5R5Ji21Q5yEQp)t=CDGIUfz~cARS5HPYDIDn^z*Io^;ucCG zHtw5j1JVN%5M<aEaQzS(kf4#HkdcQ~U5_4t5gwNWlu%JfBnd+C+JOL;D8wQZF?0(h z0WOF@r3nv6KpG%Mlpc^!E8?J&1<>d*V&OQFa-<(wM2O-fvjV(_WuK~}L`}JT+6*v? z@PvLx6jkqXsEz0tj@aqIVi|>*F}7JmQeNKp2q8)VtOh|gNf!B(%@PR61Pg#*GZ0}Q zh?tN~AhiHqgPs-vA>?X*jD})!yxK9i7U!mx(?AX7^f8ha0Kr}l#gkYiY0&P?TsWqz zgPku?abrnHwn9;J$q4Hcd1g7jrm|~MR^X|eXh=RcYH!v?t21DCzSShq&|M!(*$p0# znI6VpOnc$iSR|^Dice_i$5>Moj2M!7vitt+OyG&}EO38S%?@!YnnO&6(ZVN{qyws| zGzk|UeDRR8U@$Om5aE9mVfe=ZFw!V7PrIK9WkqBMYXv@w1-v=R!XW5n=U7tC0tu{D z@51bza!6+ME|4m=1@H}vxWAo!+Znwvoc$Xaf;P37800QW!|ru3Jg58d#|dOd@igw6 z`IfS>^ZO3bs3pqHF+dyyj2?s!?G_Tazec-uIe9~Sndh~#cDxZWqrsIkBZnGB&e}OK zHlE)MBE?jULAULAI+1SNVLi0$3x5~em;RCdo^-MyT)<$CHOCUDGHPo>2rNs#@pmLs Kg$V&BdCxGFj#bD2 literal 0 HcmV?d00001 diff --git a/tests/testfile-zgnu32be.bz2 b/tests/testfile-zgnu32be.bz2 new file mode 100755 index 0000000000000000000000000000000000000000..c1dd589e49cee6f2381a4bb4afcda3101b917ee0 GIT binary patch literal 779 zcmV+m1N8htT4*^jL0KkKS-pkc)&K$cfB*mg|LcBleVc!89d-ZbpLO#=dXzUvV8UnW z7(gQnAvVAQJ)m1N15pV*PgBT&>J0z@000d%9-uS>)B{6601W^DdVteLnj1|Z)J-&+ z35kiCnrO%jng9SA00SU20000005miPfB=I4MhS@1CJ~UtFpMSuMiG$7rb9+XAke@} zObLk5fQ*?i2~9+rYI<oWr1XZGdW{ByH6Bm^H1!P)2Gl)AsP!}hLqKQ-fNAOjO$LAf zi~NQvzZOx`L-5fZuGQiciG@>%gU+i@V?2sWdGmsg8No#;A6Y=2oO=|o1p}vsAR+}~ ziUc4MFAiUXPSFAjyhK8rg*)yp-3C+a1+9FmN%EKqkik4xNt;#)=#2yx;O25+w{CEf zLk&R;1mploZ02Ud6Eih5z-ZG3a9M;+ku=;08bo2<NL{TjM-p2xUMU&uDq4AvGX(Ag zGT`QDpn4}Rz&v)5#W9p<GpI;xC1XH4zNj1Nk7^h?-Npv0eQ2$#$(ySxVqqwgIGUIB z&tjk=P?_kuOkbkqLuK313`Qmj2tBH?o-c~i<uQ?t>}3{BT%KJROM-y}tU*Z%3)X6b zft1<wb*e!DOt^caEE>?BWidCCo^;FfQed-NgyK3cx<P;AfK3NUo^AXvP^2O_b=8MR zYnaza#(xHRG+5gMb{@EA;=}0vcWGI%70g|^Z0DU^W~%}EO?rc^8@<T-Bggr1j(MEC z?=;W`=~7HL?)LD*UK=L{Q&I6I%S-hRe?kaLMoKtw0&FYt#3TjgB3#bMXUqUva;X+Z zMR)40BtsDYumi7gqMd?mjDzz-ZnOoE!QHut)zbu0a#n$3rfSkfkwK*j&!xYjwZ@Ps zmnsRE1b}D)Op4b9>G?9T1VPF0QBa_-04N}L>fq2iW#7DgZglWTY$oyQ<xP|6`#0Ze zUesmTelm^Y$B7U<hX?JV2*5FUKm^w-cy-ue1Kpzr7NZ6#R_d7K>x$EYWrR=hcO+AV J2@BX=?O^e0RDJ*e literal 0 HcmV?d00001 diff --git a/tests/testfile-zgnu64.bz2 b/tests/testfile-zgnu64.bz2 new file mode 100755 index 0000000000000000000000000000000000000000..1bc2c0906a4f2404d2df2b6e8aa6e096665ae2ba GIT binary patch literal 785 zcmV+s1Md7nT4*^jL0KkKSz)bY&;S9*|NsAg{cnDGdPCoQOgR7N-|)9?bS8IDd`9o2 z7zTBCrZ&I=8-Zrb6eJT(rlFdeWc3XXQ%w(1p`g$PjWjfApfU{r4Kf;Or>M{X05r+9 zG|B29WMVX6O&JCOG-;s084Ltq6C+GaOh$~1AkmP(CYS&d6A(2|Q$Y<iG}A*Nrhw2g zG&BGjXwVG+0MGyc003wJ001OXMwHJ&hMOcFlhpLo&<&}kK+wnlHlP|BXwVt~pc)MT z0000B9Rr$@2_y;e9?^JK@+lRwy39}0Bo#9AK4d}dW1Dv`6m~*9j{iwEDa>xjg)bd_ zUdu<RxT+JHCa@~!;F5@Abq0j5FLm)OzKZ8fD4Syd0abQaw>eg+DPevzr7;bpn;Th1 zsW1Y}X<fT%hAY9r!mzfjhsfs<VmnFZ1l$UmLhj?;3KKA-6pW3!*1S1d!A1`H07Sxz zGqVT<cT8*Q&c3SOsU)*OS_<i-AMGDQb!i&Ep_5YyOC6&XhgqVY!Ub`ZIIt*>d&0Vk zbEm&G2DtWbB8?LmmNPp(n>dMQD*7a#I6UVB8<{ZlAaTx&AJ>QmVwM^25)Mp{<kGvS z#~|**b7PfIwnve1AXl%Dg2zG#bxUsQIZjDb;rdl9*FjW~kbo5frXVaujV=gNsA})C zw9az0jD#@str2VCht9cq(<4YydvVe94Y3@ciZBcZ3;<{K6@lsM3apwOKcp1;-Y7&^ z*b*;$uOCz;{p<M*My=!U-Y#sp;UPyPa}q>`^kC)#xfr(3)Zb{d#KWOL89@ojL5W^u z8jxfbHicM{3;_da7Nanl<N3(Jb0C?3PzC@gRP{DwgQ|X}>UO7*2zC>Aglp#qA*#rP zr35q4TDw?1pr<H+d(Nkm{f1ld0t4t?il)m1ug$6Z2FaC)M2<gFUX=ng816Q2H@K*n zR7a_46XY26m0)=3?c6jRn$ztB3`FV)L1KDIql=OU45bk<Fr~~RZ6P+snE2O-ngEH~ PKjQ94rwS4bHLRKdHyTwY literal 0 HcmV?d00001 diff --git a/tests/testfile-zgnu64be.bz2 b/tests/testfile-zgnu64be.bz2 new file mode 100755 index 0000000000000000000000000000000000000000..390c9c90bd3c54e364e1378aff44680732e8b1e6 GIT binary patch literal 795 zcmV+$1LXWdT4*^jL0KkKS%F8Zh5!N}fB*mg{{4RKd`jPcK|KHG-+9VjQXY3fU|LL$ zP!uyxem1}YCj((fXpx{v=*dT@c|&S#K-z!?L8j6?pbym#NIgcFjXgo>Jx@uA>SP)o zNYUvuZBHcdNE)VzrqZ6K!iJ5hkQx90X{LsN0000014BbV00000JwyzQMvMugAiyS# zG#DcxfQ$lUX^Dx5(UF82G8hEY00LrS1d5ucsfo1&(9z{I8&EPDJwwuZngG*410yDy zG#UWOp`#!&0LTCU4PykM3cNbpgog2<O`hzUS=gszB1KD}fdoKw;2jfxv`S4-!tmxw znTIczHdI|}!UY-&XmA688vhbE6P163(tEkUb;EGO?m7Sk1_2F@ssaMZ)ljDk;F{1B z^Q@>F5frr&iJ(o5wjoPkB1R=pA&F~Pi}8tJFhwSSq{J%mfnv<SGohoHciw}i)Ri{6 zA!;UbU?AfCD&)KARDn5@RisEZ*`^T%2OFN8qT>n^iQf2e<k3MCVHNvV5-67j%&kxg z;fRf)wAsFJnNtjwMmZTQ-^l=3G1xd8*Tx`HF0SLA!E>lrkTdz3s<+C%qbNabP>SLx zPpq}p44MHTX9*zz7J6-;v&Rh8w#hB-%Gn8n>!{5GHF#AqQ}tw5&$kW~C~e*{_@tQ> zW0B9B%#B)9M=+X!1oX`+s+qYZuCPkq2{+gem+sC<R<vy-d1Ky_FDxt^cGJI^nzFJH z?G#WmlpECmpmz*`TJJnJ#WUQ~{9sY&892s(LX+wxaQL-QhwOO3y7`R4i$y|CeIirn z;0+}9FiT*6wi2N9#CQdkZthz!m_eeOATLZSw^amOvORJt5pbLnHc5~i<c;>)l_Oga z<dp?D0@SntKpG%<0yKX6hFUDPBr}1c22|$`g!+HYE15rO8fNqtc2cd&tB%V1vg?eE zZCrSZj7>`Jg-mKc>s6_JV-ELiYR!FkurjXhcr-b*r(3iB+0nUW%*de&=_p~pjDE&3 ZzTJchqgKZVGDMmFF64@Ep&<f~R}5;vWhDRr literal 0 HcmV?d00001 -- 2.5.0