From b747dc2226265459f7ba470c8e0d3c03820b4a5d Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Thu, 18 Sep 2014 18:27:03 +0200 Subject: [PATCH] Support note NT_FILE for locating files. Martin Milata: ------------------------------------------------------------------------------ RFE: dwfl_core_file_report: use NT_FILE core note if the link_map chain is broken https://bugzilla.redhat.com/show_bug.cgi?id=1129777 The dwfl_core_file_report function follows dynamic linker's link_map chain in order to determine the shared libraries used by the executable. As this data structure is located in writable memory it can be overwritten by garbage, which is sometimes the case. https://github.com/abrt/satyr/issues/127#issuecomment-46957546 Since version 3.7 (commit 2aa362c49), Linux kernel adds NT_FILE note to core files which contains the files mapped by the process, including shared libraries. ------------------------------------------------------------------------------ dwfl_core_file_report now tries to fall back on NT_FILE if the link_map chain is broken. elfutils would already find the appropriate binary file from /usr/lib/debug/.build-id/ symbolic links. But those symbolic links do not have to be present on the system while NT_FILE still points to the correct binaries. Filenames from the note NT_FILE are used only if link_map filenames failed to locate matching binaries. tests/test-core.core.bz2 had to have its NT_FILE disabled as run-unstrip-n.sh otherwise FAILs: FAIL: 0x7f67f2aaf000+0x202000 - . - /home/jkratoch/redhat/elfutils-libregr/test-core-lib.so PASS: 0x7f67f2aaf000+0x202000 - . - test-core-lib.so As test-core-lib.so is found in link_map but it is not present on the disk elfutils now chooses the more reliable filename from NT_FILE (although that filename is also not found on the disk). Updating the expected text would be also sufficient. libdwfl/ 2014-09-18 Jan Kratochvil Support NT_FILE for locating files. * core-file.c (dwfl_core_file_report): New variables note_file and note_file_size, set them and pass them to dwfl_segment_report_module. * dwfl_segment_report_module.c: Include common.h and fcntl.h. (buf_has_data, buf_read_ulong, handle_file_note): New functions. (invalid_elf): New function from code of dwfl_segment_report_module. (dwfl_segment_report_module): Add parameters note_file and note_file_size. New variables elf and fd, clean them up in finish. Move some code to invalid_elf. Call handle_file_note, if it found a name verify the file by invalid_elf. Protect elf and fd against cleanup by finish if we found the file for new Dwfl_Module. * libdwflP.h (dwfl_segment_report_module): Add parameters note_file and note_file_size. tests/ 2014-09-18 Jan Kratochvil Support NT_FILE for locating files. * Makefile.am (TESTS): Add run-linkmap-cut.sh. (EXTRA_DIST): Add run-linkmap-cut.sh, linkmap-cut-lib.so.bz2, linkmap-cut.bz2 and linkmap-cut.core.bz2 . * linkmap-cut-lib.so.bz2: New file. * linkmap-cut.bz2: New file. * linkmap-cut.core.bz2: New file. * run-linkmap-cut.sh: New file. * test-core.core.bz2: Disable its NT_FILE note. Signed-off-by: Jan Kratochvil --- libdwfl/ChangeLog | 16 ++ libdwfl/core-file.c | 19 ++- libdwfl/dwfl_segment_report_module.c | 217 +++++++++++++++++++++++---- libdwfl/libdwflP.h | 2 + tests/ChangeLog | 12 ++ tests/Makefile.am | 6 +- tests/linkmap-cut-lib.so.bz2 | Bin 0 -> 2151 bytes tests/linkmap-cut.bz2 | Bin 0 -> 2633 bytes tests/linkmap-cut.core.bz2 | Bin 0 -> 21343 bytes tests/run-linkmap-cut.sh | 27 ++++ tests/test-core.core.bz2 | Bin 14165 -> 14205 bytes 11 files changed, 263 insertions(+), 36 deletions(-) create mode 100644 tests/linkmap-cut-lib.so.bz2 create mode 100644 tests/linkmap-cut.bz2 create mode 100644 tests/linkmap-cut.core.bz2 create mode 100755 tests/run-linkmap-cut.sh diff --git a/libdwfl/ChangeLog b/libdwfl/ChangeLog index bfbc1f77f..99963f8de 100644 --- a/libdwfl/ChangeLog +++ b/libdwfl/ChangeLog @@ -1,3 +1,19 @@ +2014-09-18 Jan Kratochvil + + Support NT_FILE for locating files. + * core-file.c (dwfl_core_file_report): New variables note_file and + note_file_size, set them and pass them to dwfl_segment_report_module. + * dwfl_segment_report_module.c: Include common.h and fcntl.h. + (buf_has_data, buf_read_ulong, handle_file_note): New functions. + (invalid_elf): New function from code of dwfl_segment_report_module. + (dwfl_segment_report_module): Add parameters note_file and + note_file_size. New variables elf and fd, clean them up in finish. + Move some code to invalid_elf. Call handle_file_note, if it found + a name verify the file by invalid_elf. Protect elf and fd against + cleanup by finish if we found the file for new Dwfl_Module. + * libdwflP.h (dwfl_segment_report_module): Add parameters note_file and + note_file_size. + 2014-09-18 Jan Kratochvil * dwfl_build_id_find_elf.c (dwfl_build_id_find_elf): Use IS_EXECUTABLE. diff --git a/libdwfl/core-file.c b/libdwfl/core-file.c index 4ce63c4e6..50031aed6 100644 --- a/libdwfl/core-file.c +++ b/libdwfl/core-file.c @@ -451,7 +451,9 @@ dwfl_core_file_report (Dwfl *dwfl, Elf *elf, const char *executable) /* Next, we should follow the chain from DT_DEBUG. */ const void *auxv = NULL; + const void *note_file = NULL; size_t auxv_size = 0; + size_t note_file_size = 0; if (likely (notes_phdr.p_type == PT_NOTE)) { /* PT_NOTE -> NT_AUXV -> AT_PHDR -> PT_DYNAMIC -> DT_DEBUG */ @@ -468,13 +470,19 @@ dwfl_core_file_report (Dwfl *dwfl, Elf *elf, const char *executable) size_t desc_pos; while ((pos = gelf_getnote (notes, pos, &nhdr, &name_pos, &desc_pos)) > 0) - if (nhdr.n_type == NT_AUXV - && nhdr.n_namesz == sizeof "CORE" + if (nhdr.n_namesz == sizeof "CORE" && !memcmp (notes->d_buf + name_pos, "CORE", sizeof "CORE")) { - auxv = notes->d_buf + desc_pos; - auxv_size = nhdr.n_descsz; - break; + if (nhdr.n_type == NT_AUXV) + { + auxv = notes->d_buf + desc_pos; + auxv_size = nhdr.n_descsz; + } + if (nhdr.n_type == NT_FILE) + { + note_file = notes->d_buf + desc_pos; + note_file_size = nhdr.n_descsz; + } } } } @@ -498,6 +506,7 @@ dwfl_core_file_report (Dwfl *dwfl, Elf *elf, const char *executable) int seg = dwfl_segment_report_module (dwfl, ndx, NULL, &dwfl_elf_phdr_memory_callback, elf, core_file_read_eagerly, elf, + note_file, note_file_size, &r_debug_info); if (unlikely (seg < 0)) { diff --git a/libdwfl/dwfl_segment_report_module.c b/libdwfl/dwfl_segment_report_module.c index 3393b0873..3822e3235 100644 --- a/libdwfl/dwfl_segment_report_module.c +++ b/libdwfl/dwfl_segment_report_module.c @@ -30,6 +30,7 @@ #include "../libelf/libelfP.h" /* For NOTE_ALIGN. */ #undef _ #include "libdwflP.h" +#include "common.h" #include #include @@ -38,6 +39,7 @@ #include #include #include +#include /* A good size for the initial read from memory, if it's not too costly. @@ -79,12 +81,161 @@ addr_segndx (Dwfl *dwfl, size_t segment, GElf_Addr addr, bool next) return ndx; } +/* Return whether there is SZ bytes available at PTR till END. + Function comes from src/readelf.c . */ + +static bool +buf_has_data (const void *ptr, const void *end, size_t sz) +{ + return ptr < end && (size_t) (end - ptr) >= sz; +} + +/* Read SZ bytes into *RETP from *PTRP (limited by END) in format E32. + Function comes from src/readelf.c . */ + +static bool +buf_read_ulong (const Elf32_Ehdr *e32, size_t sz, + const void **ptrp, const void *end, uint64_t *retp) +{ + if (! buf_has_data (*ptrp, end, sz)) + return false; + + union + { + uint64_t u64; + uint32_t u32; + } u; + + memcpy (&u, *ptrp, sz); + (*ptrp) += sz; + + if (retp == NULL) + return true; + + if (MY_ELFDATA != e32->e_ident[EI_DATA]) + { + if (sz == 4) + CONVERT (u.u32); + else + CONVERT (u.u64); + } + if (sz == 4) + *retp = u.u32; + else + *retp = u.u64; + return true; +} + +/* Try to find matching entry for module from address MODULE_START to + MODULE_END in NT_FILE note located at NOTE_FILE of NOTE_FILE_SIZE + bytes in format E32. */ + +static const char * +handle_file_note (GElf_Addr module_start, GElf_Addr module_end, + const Elf32_Ehdr *e32, + const void *note_file, size_t note_file_size) +{ + if (note_file == NULL) + return NULL; + + size_t sz; + switch (e32->e_ident[EI_CLASS]) + { + case ELFCLASS32: + sz = 4; + break; + case ELFCLASS64: + sz = 8; + break; + default: + return NULL; + } + + const void *ptr = note_file; + const void *end = note_file + note_file_size; + uint64_t count; + if (! buf_read_ulong (e32, sz, &ptr, end, &count)) + return NULL; + if (! buf_read_ulong (e32, sz, &ptr, end, NULL)) // page_size + return NULL; + + /* Where file names are stored. */ + const char *fptr = ptr + 3 * count * sz; + + ssize_t firstix = -1; + ssize_t lastix = -1; + for (size_t mix = 0; mix < count; mix++) + { + uint64_t mstart, mend, moffset; + if (! buf_read_ulong (e32, sz, &ptr, fptr, &mstart) + || ! buf_read_ulong (e32, sz, &ptr, fptr, &mend) + || ! buf_read_ulong (e32, sz, &ptr, fptr, &moffset)) + return NULL; + if (mstart == module_start && moffset == 0) + firstix = lastix = mix; + if (firstix != -1 && mstart < module_end) + lastix = mix; + if (mend >= module_end) + break; + } + if (firstix == -1) + return NULL; + + const char *retval = NULL; + for (ssize_t mix = 0; mix <= lastix; mix++) + { + const char *fnext = memchr (fptr, 0, (const char *) end - fptr); + if (fnext == NULL) + return NULL; + if (mix == firstix) + retval = fptr; + if (firstix < mix && mix <= lastix && strcmp (fptr, retval) != 0) + return NULL; + fptr = fnext + 1; + } + return retval; +} + +/* Return true iff we are certain ELF cannot match BUILD_ID of + BUILD_ID_LEN bytes. Pass DISK_FILE_HAS_BUILD_ID as false if it is + certain ELF does not contain build-id (it is only a performance hit + to pass it always as true). */ + +static bool +invalid_elf (Elf *elf, bool disk_file_has_build_id, + const void *build_id, size_t build_id_len) +{ + if (! disk_file_has_build_id && build_id_len > 0) + { + /* Module found in segments with build-id is more reliable + than a module found via DT_DEBUG on disk without any + build-id. */ + return true; + } + if (disk_file_has_build_id && build_id_len > 0) + { + const void *elf_build_id; + ssize_t elf_build_id_len; + + /* If there is a build id in the elf file, check it. */ + elf_build_id_len = INTUSE(dwelf_elf_gnu_build_id) (elf, &elf_build_id); + if (elf_build_id_len > 0) + { + if (build_id_len != (size_t) elf_build_id_len + || memcmp (build_id, elf_build_id, build_id_len) != 0) + return true; + } + } + return false; +} + int dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, Dwfl_Memory_Callback *memory_callback, void *memory_callback_arg, Dwfl_Module_Callback *read_eagerly, void *read_eagerly_arg, + const void *note_file, size_t note_file_size, const struct r_debug_info *r_debug_info) { size_t segment = ndx; @@ -121,10 +272,16 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, void *buffer = NULL; size_t buffer_available = INITIAL_READ; + Elf *elf = NULL; + int fd = -1; inline int finish (void) { release_buffer (&buffer, &buffer_available); + if (elf != NULL) + elf_end (elf); + if (fd != -1) + close (fd); return ndx; } @@ -481,32 +638,9 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, if ((module_end > module->start && module_start < module->end) || dyn_vaddr == module->l_ld) { - bool close_elf = false; - if (! module->disk_file_has_build_id && build_id_len > 0) - { - /* Module found in segments with build-id is more reliable - than a module found via DT_DEBUG on disk without any - build-id. */ - if (module->elf != NULL) - close_elf = true; - } if (module->elf != NULL - && module->disk_file_has_build_id && build_id_len > 0) - { - const void *elf_build_id; - ssize_t elf_build_id_len; - - /* If there is a build id in the elf file, check it. */ - elf_build_id_len = INTUSE(dwelf_elf_gnu_build_id) (module->elf, - &elf_build_id); - if (elf_build_id_len > 0) - { - if (build_id_len != (size_t) elf_build_id_len - || memcmp (build_id, elf_build_id, build_id_len) != 0) - close_elf = true; - } - } - if (close_elf) + && invalid_elf (module->elf, module->disk_file_has_build_id, + build_id, build_id_len)) { elf_end (module->elf); close (module->fd); @@ -527,6 +661,29 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, } } + const char *file_note_name = handle_file_note (module_start, module_end, + &ehdr.e32, + note_file, note_file_size); + if (file_note_name) + { + name = file_note_name; + name_is_final = true; + bool invalid = false; + fd = open64 (name, O_RDONLY); + if (fd >= 0) + { + Dwfl_Error error = __libdw_open_file (&fd, &elf, true, false); + if (error == DWFL_E_NOERROR) + invalid = invalid_elf (elf, true /* disk_file_has_build_id */, + build_id, build_id_len); + } + if (invalid) + { + free (build_id); + return finish (); + } + } + /* Our return value now says to skip the segments contained within the module. */ ndx = addr_segndx (dwfl, segment, module_end, true); @@ -683,10 +840,10 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, : dynstr_vaddr + dynstrsz - start); const GElf_Off whole = MAX (file_trimmed_end, shdrs_end); - Elf *elf = NULL; - if ((*read_eagerly) (MODCB_ARGS (mod), &buffer, &buffer_available, - cost, worthwhile, whole, contiguous, - read_eagerly_arg, &elf) + if (elf == NULL + && (*read_eagerly) (MODCB_ARGS (mod), &buffer, &buffer_available, + cost, worthwhile, whole, contiguous, + read_eagerly_arg, &elf) && elf == NULL) { /* The caller wants to read the whole file in right now, but hasn't @@ -748,6 +905,8 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, { /* Install the file in the module. */ mod->main.elf = elf; + elf = NULL; + fd = -1; mod->main.vaddr = module_start - bias; mod->main.address_sync = module_address_sync; mod->main_bias = bias; diff --git a/libdwfl/libdwflP.h b/libdwfl/libdwflP.h index 735b920a0..12ee116e6 100644 --- a/libdwfl/libdwflP.h +++ b/libdwfl/libdwflP.h @@ -660,6 +660,8 @@ extern int dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, void *memory_callback_arg, Dwfl_Module_Callback *read_eagerly, void *read_eagerly_arg, + const void *note_file, + size_t note_file_size, const struct r_debug_info *r_debug_info); /* Report a module for entry in the dynamic linker's struct link_map list. diff --git a/tests/ChangeLog b/tests/ChangeLog index 3f1272850..71163ee3a 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,15 @@ +2014-09-18 Jan Kratochvil + + Support NT_FILE for locating files. + * Makefile.am (TESTS): Add run-linkmap-cut.sh. + (EXTRA_DIST): Add run-linkmap-cut.sh, linkmap-cut-lib.so.bz2, + linkmap-cut.bz2 and linkmap-cut.core.bz2 . + * linkmap-cut-lib.so.bz2: New file. + * linkmap-cut.bz2: New file. + * linkmap-cut.core.bz2: New file. + * run-linkmap-cut.sh: New file. + * test-core.core.bz2: Disable its NT_FILE note. + 2014-08-28 Jan Kratochvil * Makefile.am (check_PROGRAMS): Add deleted and deleted-lib.so. diff --git a/tests/Makefile.am b/tests/Makefile.am index be3494dab..ebf4f71f4 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -109,7 +109,8 @@ TESTS = run-arextract.sh run-arsymtest.sh newfile test-nlist \ run-backtrace-core-s390x.sh run-backtrace-core-s390.sh \ run-backtrace-core-aarch64.sh \ run-backtrace-demangle.sh run-stack-d-test.sh run-stack-i-test.sh \ - run-readelf-dwz-multi.sh run-allfcts-multi.sh run-deleted.sh + run-readelf-dwz-multi.sh run-allfcts-multi.sh run-deleted.sh \ + run-linkmap-cut.sh if !BIARCH export ELFUTILS_DISABLE_BIARCH = 1 @@ -272,7 +273,8 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \ run-stack-d-test.sh run-stack-i-test.sh \ testfiledwarfinlines.bz2 testfiledwarfinlines.core.bz2 \ run-readelf-zdebug.sh testfile-debug.bz2 testfile-zdebug.bz2 \ - run-deleted.sh + run-deleted.sh run-linkmap-cut.sh linkmap-cut-lib.so.bz2 \ + linkmap-cut.bz2 linkmap-cut.core.bz2 if USE_VALGRIND valgrind_cmd='valgrind -q --error-exitcode=1 --run-libc-freeres=no' diff --git a/tests/linkmap-cut-lib.so.bz2 b/tests/linkmap-cut-lib.so.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..a1bda5c039fd167147898f097a55b326c5e88720 GIT binary patch literal 2151 zc-jGH2$=UmT4*^jL0KkKSvm~&DgX!x|NsC0|Ni&?e}Dh~{`UX>|Nrm*a{QDT0Q&vb zdQe{c`+eXC7OLM};NJJV)q3UVFO@5@@HUhJuHQ8hVdV(d9BdL8fX3jUJ)u z06j;kp!GELfB*pX0B8Z~27r2v4H_Fz(@a2U2dL4Y)W}r*6rZCI6#WF6X@NA;Kn(!U z4FCWEpa21&4Gji>00000&;vjK0MQx~B$}I1S*-TXaECg8Vv!EXvi`HLkI&v85s=#2AT(=0AZn|8tRjw zDE$qtg-ua_5ntReh)|IY<9b{YkjTWw!6gh?nn=XOJXatZ9>WY-EZrKEW=c9lgGfbU zo(z3Dr3X>Sp0f7p+?i2NB7Mm4orh028c2laM!t4KR_Lv!9)cq6lWAB5BWC=BwG4ys zv!qx_4y=SzC+o|FV9{0fhEkkH$tw$Tx;EB9D3(%Uid2Rgjn`+85X!bG1PGhGeCL@a z91uTLG{ywq;Y3X9uO(0rGyuY;vEwq%k(CaRN8qBK@cer&NDlb%8t=; z(8pYb01@7XhJKDg=#OI*87Jk75LM(<5lB|4Z<|Gk66QoJ9iV^(=Q1LkU=(S-FEU0- zzOCwng2ELQi_xprFv&DiGCaLv+*=_irMQry6pLa)H(LV;K%8O)eWVCj%mFLI5~+-5 zG%_0)hTCIfT>Aq8X$n}l_Ljm!Xq1T0LPE!CwvbB%kk}wif@~9N>_8``Q5x~UlW10n z9JxpdCIPgIQ342vD`^ujEj-7a$`kdAoC6|i7SsR)k8k1hOe!RfXLkqO{Xopn zZcflb4HubVjDm3rARmZf4HKj(sNb8$vWsDUv8m1YGqHgg4JCb}d}lDjK=@WJ1nGjQ z)nr6DVHaYKjLB(t%t;>0FzaCt_Br8P+(YQemPN*Ws}p znf!domQ?UI;p+?59Cf@wCNaz~%16p21P?%gi_F=?1|d6zX=II?~gMTQ)V zLlyXx&eCP1?%#(ff^as$xQLet&Lbg%WWd-}Bw7L4dgL*;5GMGD&BKSW&+C0%UMaQR zBVA-@OCZVUt1szkZHo4g>Q_>Q&)kmC^^|wzy7f0$X8{VRKaSAnc6aBW2O zXcXSdB?3(#evpV~fT_Z%ma^qp&a(?>(96kj!vbA!FfLev+`Z^4Ni+=+m~^(HGp5f~ zMh0{(1N@-F({0*h&oxGX7q!y{0%Wi0LX^f8t@}0m(Ff-A4M~AN69U!{ROw;EA%chI z^l>FC!;!ATn&0Q~4D<)Zi%KI98WQ31;S54hyvMZJ^Ky4bwv`e^9RjOlMkELWWfljFas(YOgIm`SI_OvA+cshh66NlC7xS4K zYQtw0Ee263C@p(70+2SD+4d;n0gHH)P%1Dwmx|RTJXxGYV=ntC#SM-!vR~Fzk_3-o zT~MemR%%+ZD+-p1s>m-2(A1P=0LNMrZn3+R%G9T1xe=16s#Q|i`d0y<;T6eK7^?WpuqmL?%&B}ShF;sS9kkVg1wsMZk2Dxp4g3Pi;94XZ2NxRE zN~0c5LBcr@uJOrCGzezZE!h^?Sd5rxl}cr~opfud$qFU{;9Y|nE#lJ&0?hC=Z9_ z@RV0uP=v79o1mpQs&i8zmp4pDez;Mz^f9kXRTKMgtD>;a{!%5za*3x3Ne$&>p=bMC z$fsyD(AO*nYQzjwCZ1Y?%!rg4ODCFf9V^6U-!nh;$p2t1eX5NXnt_a|%F(=P5egh{ dWkn9{0`K7?X;<21!zzEp+>uTcBo2c;%77ilx{3e* literal 0 Hc-jL100001 diff --git a/tests/linkmap-cut.bz2 b/tests/linkmap-cut.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..f2ccd7ca6119e7c484182bb77b032503c96ca197 GIT binary patch literal 2633 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 literal 0 Hc-jL100001 diff --git a/tests/linkmap-cut.core.bz2 b/tests/linkmap-cut.core.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b55b2f2168276e1588b2933535a25d1020380f22 GIT binary patch literal 21343 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 z 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 literal 0 Hc-jL100001 diff --git a/tests/run-linkmap-cut.sh b/tests/run-linkmap-cut.sh new file mode 100755 index 000000000..7b1e79773 --- /dev/null +++ b/tests/run-linkmap-cut.sh @@ -0,0 +1,27 @@ +#! /bin/bash +# Copyright (C) 2014 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 . + +. $srcdir/test-subr.sh + +testfiles linkmap-cut-lib.so linkmap-cut linkmap-cut.core +tempfiles bt +# It may have non-zero exit code with: +# .../elfutils/src/stack: dwfl_thread_getframes tid 3130 at 0x3fdf821d64 in /usr/lib64/libc-2.18.so: no matching address range +testrun ${abs_top_builddir}/src/stack --core=linkmap-cut.core -e linkmap-cut >bt || true +cat bt +grep -qw libfunc bt +grep -qw main bt diff --git a/tests/test-core.core.bz2 b/tests/test-core.core.bz2 index 4d4346b9cf7e2ffb995ca80b1549ee28a39d4d4f..dfaecc75b696e4a8c1debca22ff5cd879486167b 100644 GIT binary patch literal 14205 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 literal 14165 zc-jF~H>$`&T4*^jL0KkKS#1c;RRBPFfB*mg|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0 z|NsC0|Nr1M+b*>189wv9cY582h#eI`00000B_6b{uUs77=Sg>Pd)eypZdKMz)qCB` z)YTlbOENSlcfFZ9aYRN&4dvC|J9Y^6>Zi-Q)pVbIoL#l1qU`uO+B{18(|fQT9-mK@ zeeUXgUu**Jv+ryG9Vi{obKUF97UftpAp``-8UO$$m;p3oG&I6#h$d;EX)!QN(3)UP zG{k9>Q!;5i15;$xJ*nxEc@tonPa`DtFeA~EMA{mgRN6gL#;LZ5p3_8RL7@cD0GOI4 zAOtd}~eCr=-)=^vZgTHl~A5)gGs* z`l0Fr^+BhU4^zT})M=-b(dq!m0qFzO115meAp{_bdYTEEjWpV5$~K{p$+bMAYH8?$ zKs3pTra;id$N(A|XaEL{0iXtfplE0^000>P00w{n01|3MAv6SNnLR3dO;gnKLqRhY z9#hdY{YmOP%7>;CQyQ9W6Uj93G?@)OL&|MW6!jjbsM>%%CO|aN=s}|mPe=f04F{>} z003wKlR#w9G%9M0Kpv)mWCosz>K;(j)YB97AOPB$8Z>Ab1_Wr)kjOnv0002d>HyK8 z&}aY{fB}<08a+mU00Tg1&`6O9peBG!34&zNl-Pov3S&W~JSNDVfT!rE=z~#=)jXLd zCea>~4NVV3^p8oVgCl7Tl)_}%hDlVwGSkZvuoMO|lYkUucx1FfYPN{8B zaY_qwbj@tGHK?X`oL=2HT&mQ$T~|q`AiNeSi!ro|;aXLxWl*CRC_@O{(?80Y;GiOE zQ3NPR9nu0IViYlQkfF)|g)B!b$7sdM#w#}wDS9~m`FIbU7$CI-{NxnFx?(D~;_(_m zdfl`)Fi17^Nq2PBX((~QY{9+*1F@Oi1V&CWg(#D~?oHR03a zlbD@xq=-)f{dP)*g*oQwQXh>CRd_4?#lhs7jXKkzJRlOn|2%?E_gyKo(_fp5>-{qa z3Bblrag4YknRPLE%av#{p9;f}D+93(?FB3fP=G=dOS_#JQ*{3;^*jppelLle239fS zns=xRC0Z(|$PaB|9?Dx3i+>N4q+Ztp^7Jjz)&ioC8G**hQI(k#g}(5pKQ@Mm>A{zL zEvwaD4Ld_{>KdrHbVFMQWoqBzCEWIMo7-!0`H9tAgB@q;kQ&TOD@$2IXnuWNAzfWsCE8O|E6Zl}9e*}>e#?AozSg?oOd~ai1Vs2~#4!%cK}=`0 zm22D>q`*~(=!%20sPZDfsa`AuW!W5S3h&tBGkHk()NHD1l- zj&@?9vgB^I9sL2TBvnDDi-T*{?)_!_dhRZ$3k_IwJiT~8broFBL^zmA+N$mOnwHd{ zp_m|DmS$uwl1*FG4E!5d%!aycxwn<0Qlc|=RZ4LXdrm!RXSHh@61E`RY#XbYbmj9Q zn8TpA^@NeO!RQtA@AyF+^lZYTm~cj5M?U$j?rPnyyuWi@5)oD+Mq3iOI#D1gFTn)+ zKt~vva zsdW^J1GO1V*fp$D8Pmm)og=|^rlGRTgGp#&1EffjF|)vl97+}}>{y!Sv_l2T)hV17 zuiV(C8Jb0lAZTSWVE>b4VBUv41+b!-7DXVM$!MZ>$WyGyA0WUy;s@L$hdRz1A*Gx4 z6FM5~Hd6*jS&}RO;V>zacF7B*fh6jxp_GQq49uQ3ib=?5LdVM0O6}-cA;;x^4F&5w zk0Z|UW_dId)crnY5^hWafvMtdDtY;Ct(`uqbcloF0EF`z3}tuT*d%JCMh$pp4Y3O zCy>ePpYQUzdlDJOL){=w`qlV;-|?+^HP}>S6#zHXxEgO8)kzY4rM)D^2Ai7^M_Y$cXU@F__iPUa3=n)JXCCJ|0(-1d1ahCzQgIz3_Sc zj!q^esG*T$A|8s0ea{}&SjIm{(wJXG$r1+0H=_ z0*XXo77%2J=&1@<;zooc7^!LkltL4kW@{8DpsHY^GABmVAfO$kP=C^WLT7HU^V};* ztA0hPM0gZXiVFciSOW$RJw&D`EQ`otNjRuL#D%30>KREU%@jWlh)7^+)P>W$bg;0_ zfh$`ZO|};hR3s#W1JJ*C%_HjkO9ZfZ%+sx$RaH?D6#)cy)KI9Q0~SdDrVAh}4cjL) z$pDs&l1)@3fhiP_iwGqMZn}ZaB!9j|`L=}XJ5oB1h zA_6cyV*<6RQb-FHEO07@ESWULM4bvy$g&VvqQO*=K|(5of`k?dEQpE%fQ*3_285Kt zIjAWVfdvSngdPP2GDKjYq>z#uDNIsb2ehdJU5Bwr0YEe`4?*#j0_djggupbkq#W(6 zNJHfT0%u@Z0t}2WNgzkTXe6FTbSp%G31sJLi6Nl?@K7a~1ng26T8RTo0)&zP{ZP{H zBLg!D3o;U1blWPHBny|K0TcnsfGVhj+htqA!9;HW*JP4mgHn7z?!+VvZ-s~+1+8Ed zlB-m!KxndBX|+glkc7x&YmJA^yMAU3>fbf}HNqPslYr)}n zIxk)SZaq$4v) zkSUE#FrHO%65fpfsAvy}aUm_fJOaaNSdlh`y*jEtK5J`q5bd%MYO!YRvaH#T?vWH+ zv7In%T~kS3qR+smI+dSRB#?t{)-79`RL~qP4Ha2nN@+qT%)SYNiHHae@_#d6XxP%? z?Sl_MG&_9rpkR$lHmP;uO6oLOqA>#WOz0Uy6|ZjzV+|S+2^t#P8?NU7AW}_q-mv7b z1D8W>keiGo4sir<{ojEkiL?bw08}u?#|TLQHiW(75;PvGKnIlGLO`HtC2=tb^v0wK zTYVz|2iYWtRvPpWhT|t6MMy)8$t3Min#Un10||yBT%m{%3dNX5oFCX|7vVfA&#rmH z!@}Rkqvy1U&K?kJx6t>AEcW57gm|pC66SI93Ee0?hMtc>r4-qbB$25>4$i4@&U7=G z&5GIcDIg8qs4k2lN^%a{^tST6*+tkx1HW42VoPE_uMx3So(Kx1e}v_RbKDKfD03;JBC=O0_Yrg@99)ljB2&vF`hS zdX=1?=`kzeKN0-(X>=2z!Szp73dB z+f=V^6+n#Q2}1;FhaP;i;}~4vb`REDSCn$k4!w`Tqu;gEWyC`}7$}_8L#265DykiA z=-2mtX4|azHl>7guq%yca=3B=rXNj}u_MO~;RUPbDoCVaI#z?)aiJq=F$)Et4DN4_ zkH7Y@Nt)=59aK%G5O}%u6x`4^0*Huu8?+);O#uE|^Z-OL@X=?08*Zbq>f4OlZQc3~ zLxg46goX?qsF`}mqXuJOVGR6a9rL4(7@7q%XXd@OuJ0{m)heUYG_$yK_Wgga@%nFl zz%kM8`>jWoW~<`2N!tO!xT$f=sdK4Ik^W7=2)G8;^bBsr#%N@)pZ2#^IN-vSDrT6D)tPWKFz zSDlR~M;3CXrtJ{LMQ0s0Zk+ATjw=eRLEnwfXF_I+9tt6a${enQ!Gta|5p|{WPSk07 z_1&mJHIV)1H{N?cKg(MmBJ|ZyHmG;0!JTDG94%XIAaVhL)+bz$GZw!$53gs4oVpzD z%1pgrp+XnaGZT39Chs3NtYa&ZfW&#B=k_vgRy03>2zVx2a)|x8mmP8**m2NtjAp}w z4lFgjv+%Q|3r*~+s|o8l*eQ|?4-&K3#yHyQ&a$AXgJ45GdQtK!;Ap{JeEDX|dJKlw zd^tA6b4C;5!Vhv-(6jNUKue%sYeFW+$95z^i<=9kT99QlcTI5@T^NAF4Z*;LA?x&9 znF7{n87Z+0DPWAYgTnWIH*vY>c{FmTV;io83^>gN=8(E333-OPL&)W8WCRSvDNxww z%ZZo>iD_U!P&Y2ZUy|O|<3ql>`)D}sC<2tQ4xJ6ErYxG4tGzp`^fVsKPEK-ekE`-( zkGjWCciLFaGm<-2f(_r#zDUAp7ESgLOYF24YOYxi)_X#d(8{sTfk{ZIsPon#P2$xB zroQ7oQ%DaFRt2;%USn%%psI|s=0bz_=yI`rFM_8XmaBSKa`CDugDQ>^0hnP5&I8De zaJR|poJqq;N_mp7PjMvpv;5bsk*W3RNn9^LH?w6`>AotDbs|EeR#!q2nMp;UzD7sDKOI?l%fwe@TidI z8PC1uM-<@}B?cI(!v&AZQh+rtusS`6I#s}#YVC**Gt1jAME{2UJ+BKxFY>XR<9bOB zEk?CKBQf#~Sz=68Vo& zL1U-QS1xMv9%0OI^%vuw#O`nyLY8%p$MneG9g=oZLQ^LlR?AHT?&3zvLx+mR#)-f5 zNk&S#bj1lT(>NuFfc>{831GS4>0T-bqm@K$JICpEN%yMVgV^bh%U$7 zNZ@%}jxSqCps`{>2Dfl9fcC%+CVJ@etJJ+pSqnZjt;YGh$Bmz}d-N}{N9t~>@9&y9 z>5tpS13uVO2$K5x43dTmCJCW=!o>Qxiyb%wE!WpvB44P0M!!LF6itrf3*;xbOqex^xa?zv)o>EFl=}yW)lC`c zpyjbGx$0wZ&t(3OcdMH{yB7~ zz#|UcdP8AZkt z3~213D0kBA&>glM<^@1OO&hOQ7A*snv&Ykxj~^S zMeDVDU7d>G;%Mgev|SyFfO=VKP%p7n+JLB-sU%evvB#wO%1bt4$zbe~tu3)&DWRso zV92Nflq;sYkw+T=25mEwG@DWN@9JSL=4XyY5=MQt_=yaITX=@@QnK?4PJB7RV#Pr; zYHWlM5EuwBHwFk$^310-pxCvW2&T>HvZ@?3r&~78mK)I|iYfyHubl*69K%Q%6r}{v zB`Xf3$Q(3uB_T6N5TY?eNLt{)Fl1tt`;&1Iykri_EQVXOrBDi{LDSkNPuZsC;n><) zJy&7STimt`3diE}TIp39EmiH1JsXh?tsCa02f8w5JV+`nv#@r1qKP2hZy^_%!HV>4 z-f^o`2RxCPLe-|>#VNxfb^qID*~MCPpcSSR2xStsNVRFg4_sIhc#j|DCnU*AG%p-dv$@OOBERi!VT=xXxy+J$(eCsB+_id#k)y}WXnqej0@hc zp1!2?Jl^6{6Gjsoc-UDuDJYOMkc^g)9j)YWvKFDTof=!s6mCj2Bu}Pq!}CINShU0o zOlKHO9OA%@n`ThF4-q5<_cnx(f*6DeLqGr;9sR@;v}rq%o?LPtr+C)ZPK{Isoh$fx z*}Ddo%z#6Rpd&c(Ivj)zT?qpXkk%qp&F1}vkCugG2rgT+O^({)hJY|f}dT{QXG6*z&4QF%Qt-!iz z)^!!j$9485m>sl)jX-Au(znH8zK$+r+diHWR2ydGwL=x$xGtVf#tHloNZIUk0jpt- z5psA{UN)^#72g+z^N^X-jx&=~DKA~IYnEH~3HRVEd-T;7oT2WF4 z5FlA$PPe?CxLFUI)$-Mz#wKFP0oZ8<#2z_jR_nvByJ-yEZ4QjXY$aK}S8`9RpxL*3 z*kpzJF#+&6-L4lcBPsi=L!gCA4pEF&$;X=^vp7t;HI4cw^1P&HfGi6&OAVW>3K+&l zr*dF0#;CzjyieG2N7B+Gm8l&3AX&f~&L_(^B^>8l0_)CexzFfaR*{b_y|1%z+G)dH ze8fl}RUVo<@`fC1Eyj&xpZxMwt^dSt`udB#hq{A7yRBy;oJ9yZJnQ9h2=u+bRC#u( zre1iUorQqAjp^*)gd0F_zqA-bc}H#jmj9G1kC3zJnivnixZihUblCYa3A_1ze$d*6 zRc-ou_(}(%+bVi_8Os9v1W&?~^W^qU#cqXB2h)*t__)$^>NHMlOuf;hL98{cqv^r{ z?7206A0xNk@xCmN7#ji|4DuVHO}Dzj`s+i_C|r4X-b~)IVK(%AtVNsn^{6`~K>bHR$1FLY^3tiRxAo#;`Ok z{!Va&TRXn3!#uR+3<(#oFo%@X^OgniX5oUmA@l5Ho&CdCba(-0?!Tv}HsHZ1Li2S~>SvMf^X zOA(Ci0BQrU0BOMjquSrqz~z+ejf-9SD*d24P%Uo)4Z?hbrp%~HP*MxV{Zebq8DqS6VwH|b}wqbBI;4`T>OeF}SD#4AjcqAVE zfdW;kW5e)}XfrUusaclGF{IVyTopxiK}EiUA_c$H0ul}e^IEfQ$Zcn61q<|`+?_ua z@ijhTAyB11h>p!eS2bu)t1*35mGEqlxTK(z2r>Gr9}#WK7L8aDDuq#lO9~{S=wfBp zhB1(%pHLn7gg$lm&$W%6Xjx9TOc8h|ws86kmdqF1;|;!5qS@fb*E$1OFJjTm?CKR( z_1x?bg*jUPDMB?Cix%wFjO??Ic3ALGj(!EHkiZWA)&wK)Id)=E#w{rp>np4f1p^fC z8!#<%&|ciG1m2JxQ~0i2NF`hvgb1o|2utM|`QyxdSiSf_{x~5}amyj^j~IjC>=iQC z2x>#Hd>V@CyR=U2)3BhC@9j*|A2b9x*pt(p|7}d37^o_*d2T-D!GZUQb^{>=4kv;-+t1(pc=d_(y`^Zkp`wmL}xNM7Kt6rsgQ!dP$s{2-gjJ zQ+md}qBKLIh=AZ%JfIu_3eAvwNFW5E0YX1anXKP8N_ZaN_wqt5Yz75@y%t^iY9y8+ zwP%1(l3x5U@Pv_F(+VqO#+a9>t9%Y~XCm`R83MNjOyq?PZ>*twNy-32%P>nK#AaZ@ zw*-U;$+v$ne*x(L7XYJB&TC>(1ux&jlJNXqgP#XedF*|E^CkA%kL9?p8_xZ|#=NoH z>;iDiOfBzXD&pjw@dE zBE=?ntb*yfVEAJ=vKC|_$j@wT!gzOFKd4FIRz$| zsddUhRuN`LN1cHm8T7Y2@>S0ny)IrdOHDP{dP73VbOD% zU&bbqTg>!E2}ube*j^%ONb#85me|V>Voxv7+%wDAibJ+mm8>+f^HGM%z?zXz60=3N zF5MKX%)xI*Y^woEX_+&NjzI2kbd4h+Bm;*u8rgUUBggG@&!1Pmc|gjcfr_y%-`CQ~ zAn-$jLCOmF(`)s9(?SgVIpRYGW(HCWVQ49gIq2-oiF98+lvI zyC&luQIoKW9{Ybh(xBvk64K;>Mnn**UcLuk9arP>c-}Cow&$6n`0n` zBJ8wfi-w(dm3!q3PaD%GWTpEFqPNG^|=2qtU(&}YD7+sxwe#a|q zUvHGA!N(O|ELMtKb`N^q7C?gzxdD&{2*|UDM4xS31hvp$IXjL&+3R#<_Iw!) zJmBWZ#HEZfH8c#Uobs~B{J#gM(K4qga^Bnu){5yYkzxR$C8sbSLKPu^CSbHVa(VdV z`CTGKKuy}X9qPkkKrKwOv2rn~0rP-s7)=d}KFR+M#spO&SeY~!q6_-LGpEM8+SsVW z5=Iski{x5J>Rc=a8KbLvkwG_}3N|HlYP!OA2D!|Y))VK@%trrej8*rKwH9!CzDH9z zJv>?CDUuVi?*UBE5V4)HsnP0{WE!eZ+U}}64<9#& z&ylC;S^CiCgeja4(nVu`zhNfqC;qQmZtgWrO#MZ?6YowCI}j*{pJ4*bY-xkmtV-3U z9gvvH*Ws_XIqN@Xo%(J%JFiFe{hU7MQTIxVPIC}h3r0x^IyAsi%c^Oz4qoMI?=<|+ z1?Q+a6gZvF*M}Of^XqH(k`T;gRvdL~s47e+jCzmxk%{_*?D@-s=oD2KtrNv=f&l$Of11J>qe3f`duzPB(##|9f_ecOEPsx)fG&_E~ukTDfM>{@0!Ja2&^m$KL z&x07E2#kn>7%Hh1ipDZA1XK|sFjfdEtQ8fD5-Sl9Q3fK#ii)v{F+@fxiqcXSSHlWIb)_;GI;ms;~R7Sz{2tFuwnB%H<^h}Sg^#@6{?y%1+ zo!`dP!Ns2S%GKc^&!)?RGT5j}LvP?A07@`26u^Qg!I*EZ<@IBDeAk|TPs>5FM!HISeTGA0KCDM1xO^TD4leT8B*++Xb`C2!;k%s*d`u@cs871F3U%*jtXV zVsrGo?i3GftMRU4w&bm*75W@sLKm&@rR|=p3Bn-iSCpcro2+j(d@{Z+b88GOmhwFp z8iu?A7;Db$%m^Oz7?RyTf8##nI3k9ngKajqJF?^+!TF-q4SvS#?CGCqU7>?OJtQt& zJyM94%7=l&d2V6qE8a5Oi~4Qj{EZO$FxQa5IAsqF?P~cioQt=4fiiT4T!Dh^{;L)_ z2Kj5}L>hS=$rO}R=c3|3(gfHRWADI3M@!JJt+Gvl=sCtvZMyWFucMlfEJF(mI_6=U zXuuuZYCjZi1rE@GkzIJCf^!p}z?v@)X=P;>ZE*H@Bjl-+x?cwnn1`;sd_nC?>J|;`%Qi`Hfix`i(+8zM+TmPGsg`< z^5W}ZKTJSwZ`18OZclOWdj8v`7AHPEchSPq{A~T;te>&S%I>|j7ld?ZH|RJBCSbP4 z&)a-c%)&V@wsB#HLq|5tus!kxFuakHc5L$TkmYR!e9Si9psKc7g;Y8gfI>LUM2Lrr zbaCRqe+;x1n1;tN?XcklWSogPkSB&@hc)W2PaNQbkJ4KKkOOWn-LhFod_qcvJ7b! zWK@P9a3LW0`1rh3cD13waVm^?zmF$Xf|+X*%ln62UB|DSWgvN^6Yq_-;m<<$Bdo)$UBoQ-^on6VO2^>v|f~g!=U176Y0gl zAFX|~oYWt*Ftk*Wxm`Om(GZ?+Q-I3wH6Z92?U)nL)9ao~<|aKu*|5R8FO=LiUW|Oc zM5+HnT(O;*z%G#d6V91b->2hNJrO#pWxz2G3?DCWA+Ur7{`lmi91~KIQ1nzJ&+j}J zBJ!PNBTu+7Eua$a*^fqcMVz+V7DCo!Hu{?utN_k;vzKgpQd6ld?rXop>gWBaaJA?= z)ycA~$Xmxiw4kZ!=AtY*DgbcmbkNRO6r>93|LVXBFkUb)3yE*gT> zs|}G+5`mWkccL5C3cP7vdmOe8_xd+6a$8Q$PEt+el!9=(R*cMKS5|pS6u@?Q9`Tka zut(o}=3vjxS{rOC_mO|AwzMm~KXJc}ye5j_@1@t_$8~;`yL_PeJ>t>}wO^#8%+QMi7Y`E^PZbAD``4^C z!{ZCFCo|=VVwY-d9iuF0hIi=ekFJ9yEHR|o-W3n>I=m7XU+2$#b~rLBj=jUjAibM zil_E^TyD>N`)#SmtKC<7$n(LuxAE_DPEzcWH;4B|MFSrq;1rxwbrOy}>ZTrDT0aHP z_rG5T3{ii+M0jM+?eIy|>-GHlXocAL{-jvp&C$hq1@<6pNn7NGuRl04{-aHKfH?cW zafTLPP$4J~wz0$stiENYjKP@`z?SUASZh7Ue8_zWF-;INFHFb*1njiiE38MQ`0>EWJIp*c)v!s#+F`l6mkokJ!4Q zYfxNNRz)n7wn^qyZjDjgMM}%Ambcwo(?=v#Jp0lyX2_(DcGE-AM{*h6c2X18_4qG3 z39qS&!A$IWdySozS8?cHZI($Qbq)cu>i2LPe+j^J%~He_r$2=X{NICO72^5l^R8=Q zUXF?lwk*_nNkVYh-7xWbEO$B$teB6G6fY$E#Q(Ubz^+iRRmp1@m7iCPbs{iU)VEbw8+U78g zL6WF{%$^p&9h>mi3C7#FD$@T*wMv>1>7RkIL(-mg2l!9Yt{8< zMB4F~I*?uJnglXPWs^|Oisr3LWNI{!P8gwxx@8H=VpvthZ_x`)5|#|?8QI396PnN@ z+bcX1o-86nv}#yIq*0b&^NFAhXse=vOr11i7`pccud7+4ELH z02>6%Ep*HS@3qV(lbB?ZNEU>K{UQuTbh3oiA(USb9cLMcLV<$`Q|906)t!UHk9 zg0N$l+{3#y9WoXyfFkOxcxEI6WXwg{%T`nhpjw8Qmk1E8RQO;hCmAMmM$HPyifGkq zIiD+I4NNR&Xtb9S5f~Pi(h>;-iLzLrAh9emLBO^(c!n_)M8H^8nwN-{VD3WM5Q_nb zSW8p_!x4^`oGB6v(qWrCG_b^T(W23rtXxpfn)j0E0;3y}5k&y9w8IL!IDofG;xHpV zva>W{f;wOZ%88a(3t8paiD51>mxgA}aGKUl1IcQT%=Q=ypymS;QF^$e079k$A>f3p zUE3?BXQPBg;s7_7VNn!z#D=1(tz-dK4(W*mu*Q%o-9_Tob`CVOGgkOfLjez%CkRaG zITjO!mu40rgIpN_@WI$fEl@@+RaXzXLjc&>u4n=iDX9uJEJHGbRza_z0TBQ*Nl}H1 zGaj{9o-p^a*(Ymikw)|s@z7V54eG$nm}tlqknf9-Si-~}N^4gaymy&5eZQ^;W@_)XQ3!kbt zTwk9rT;vvfS!GJqTYQ$wbIJ0sddBAUeGAKU4WgCLFo5Glso=GRpSxg67m#saH$X23 z>y|MxB$up$>w483s#U1K{1ejzZz=4Gks)<&P+bL@=Y6l!^ z`T+a4S^=)|#jhLlb0liiph7sIWWDNZrjkOjZO=YAR{ ze+4wjCEB!)w!tC~qxFuOV($i68a&pl6@y}cVMHoF{K6Wa)YV3jWHVyp3m>8e>5@ry zLMbFWwgurZivbz$Dvn=&I;MJJk7jHP;A-sd^)>aje8=gQ(XWhSDFC({FouC1b%_+5 zyFG%{n?JWlmExVl>+gzYN=_9}U|SV?d^1$#0OWbviBker23r|b5Rx5K$siBbyX5`8 z$0wlnnwh-sy)cgYkKfu;pw3&M1&-`Zc62R*4x4y8?_c+0m@EywaEwxTSmPi-DpIc2 f{?6+EL6Fx}wDfsqtjZ*R|BJaIoG3^(gl8&%(;Sly -- 2.47.2