From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gnu.wildebeest.org (gnu.wildebeest.org [45.83.234.184]) by sourceware.org (Postfix) with ESMTPS id 3A13C3858D28 for ; Tue, 14 Nov 2023 14:03:36 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 3A13C3858D28 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=klomp.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=klomp.org ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 3A13C3858D28 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=45.83.234.184 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1699970626; cv=none; b=vd1j6Gfm9VBMCWJTGVOuM1ytQvBNa0jwaqYHlbuA8XEieKvxt6Ung3SnYiHy8hwTXptPe4tZps3S3GsiKwI+WRGierDZplOrD81ESVSI6KRzi8d02MbDe6wcZlsONh8wS63/80a3qiVjcLTZ/ropM3ImfXyYZZaTlJLQRPhIs3k= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1699970626; c=relaxed/simple; bh=LxdNh2urDgAAssc4bzPPsj1u9E8sTlzbq3uioNEh4Vw=; h=Message-ID:Subject:From:To:Date:MIME-Version; b=X5UA/whcti56oAztJOjWn1r0RU2bDcD5xOynpHzQwE/NuAZSGrymuWPiITxW3RRm1XFxd6ySqTeYjd5sbrfH+czffBUtP9Of2AcFGRyNwOLIWfATun+IGBEe2ID6Ztnmbjv1aAOZ0uLtS97utqWkrK4kDYATDrGQqBIUa1D+I9k= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from r6.localdomain (82-217-174-174.cable.dynamic.v4.ziggo.nl [82.217.174.174]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by gnu.wildebeest.org (Postfix) with ESMTPSA id 72AD3302FDDB; Tue, 14 Nov 2023 15:03:34 +0100 (CET) Received: by r6.localdomain (Postfix, from userid 1000) id 94803340234; Tue, 14 Nov 2023 15:03:33 +0100 (CET) Message-ID: <5b0d1e19085a0b29a9b9ca6c14c21746dff8995a.camel@klomp.org> Subject: Re: [PATCH] libdwfl: Correctly handle corefile non-contiguous segments From: Mark Wielaard To: Aaron Merey , elfutils-devel@sourceware.org Date: Tue, 14 Nov 2023 15:03:33 +0100 In-Reply-To: <20231112201645.25762-1-amerey@redhat.com> References: <20231112201645.25762-1-amerey@redhat.com> Autocrypt: addr=mark@klomp.org; prefer-encrypt=mutual; keydata=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 QifSU1tvZxQ== Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable User-Agent: Evolution 3.50.1 (3.50.1-1.fc39) MIME-Version: 1.0 X-Spam-Status: No, score=-3034.7 required=5.0 tests=BAYES_00,GIT_PATCH_0,JMQ_SPF_NEUTRAL,KAM_DMARC_STATUS,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Hi Aaron, On Sun, 2023-11-12 at 15:16 -0500, Aaron Merey wrote: > It is possible for segments of different shared libaries to be interleave= d > in memory such that the segments of one library are located in between > non-contiguous segments of another library. >=20 > For example, this can be seen with firefox on RHEL 7.9 where multiple > shared libraries could be mapped in between ld-2.17.so segments: >=20 > [...] > 7f0972082000-7f09720a4000 00000000 139264 /usr/lib64/ld-2.17.s= o > 7f09720a4000-7f09720a5000 00000000 4096 /memfd:mozilla-ipc (= deleted) > 7f09720a5000-7f09720a7000 00000000 8192 /memfd:mozilla-ipc (= deleted) > 7f09720a7000-7f09720a9000 00000000 8192 /memfd:mozilla-ipc (= deleted) > 7f0972134000-7f0972136000 00000000 8192 /usr/lib64/firefox/l= ibmozwayland.so > 7f0972136000-7f0972137000 00002000 4096 /usr/lib64/firefox/l= ibmozwayland.so > 7f0972137000-7f0972138000 00003000 4096 /usr/lib64/firefox/l= ibmozwayland.so > 7f0972138000-7f0972139000 00003000 4096 /usr/lib64/firefox/l= ibmozwayland.so > 7f097213a000-7f0972147000 00000000 53248 /usr/lib64/firefox/l= ibmozsqlite3.so > 7f0972147000-7f097221e000 0000d000 880640 /usr/lib64/firefox/l= ibmozsqlite3.so > 7f097221e000-7f0972248000 000e4000 172032 /usr/lib64/firefox/l= ibmozsqlite3.so > 7f0972248000-7f0972249000 0010e000 4096 /usr/lib64/firefox/l= ibmozsqlite3.so > 7f0972249000-7f097224c000 0010e000 12288 /usr/lib64/firefox/l= ibmozsqlite3.so > 7f097224c000-7f0972250000 00111000 16384 /usr/lib64/firefox/l= ibmozsqlite3.so > 7f0972250000-7f0972253000 00000000 12288 /usr/lib64/firefox/l= iblgpllibs.so > [...] > 7f09722a3000-7f09722a4000 00021000 4096 /usr/lib64/ld-2.17.s= o > 7f09722a4000-7f09722a5000 00022000 4096 /usr/lib64/ld-2.17.s= o >=20 > dwfl_segment_report_module did not account for the possibility of > interleaving non-contiguous segments, resulting in premature closure > of modules as well as failing to report modules. Nice description of the issue. > Fix this by removing segment skipping in dwfl_segment_report_module. > When dwfl_segment_report_module reported a module, it would return > the index of the segment immediately following the end address of the > current module. Since there's a chance that other modules might fall > within this address range, dwfl_segment_report_module instead returns > the index of the next segment. This makes sense. > This patch also fixes premature module closure that can occur in > dwfl_segment_report_module when interleaving non-contiguous segments > are found. Previously modules with start and end addresses that overlap > with the current segment would have their build-id compared the build-id > associated with the current segment. If there was a mismatch, that modul= e > would be closed. Avoid closing modules in this case when mismatching > build-ids correspond to distinct modules. Nice find. > A couple caveats should be mentioned. First, start and end addresses > of reported modules cannot be assumed to contain segments from only > that module. This has always been the case however. There is dwfl_addrmodule/dwfl_addrsegment to find the module that covers a specific address. Defined in libdwfl/segment.c. I think this should handle this by checking the closes load address. But I have not tested it. Normally only kernel modules (.ko ET_REL files) have multiple segments. So it might make sense to double check none of this impacts systemtap. > Second, the testcases in this patch use a firefox corefile that is > fairly large. The .bz2 corefile is about 47M. A clean elfutils repo > is currently about 42M, so this corefile more than doubles the size of > the elfutils repo. I looked for a much smaller process with > interleaving non-contiguous shared library sections but was not able > to find one. I've included the corefile and tests in this patch but > they can be removed if we'd prefer to not approx. double the size of > the repo. I really appreciate the testcase, but it really is too big. It is 736M bunzip2ed (which would happen on any make check). I think this makes the repo and the build/check a little too heavy. Also we try to include instructions to recreate any binary test files and that isn't really possible in this case. > https://sourceware.org/bugzilla/show_bug.cgi?id=3D30975 >=20 > Signed-off-by: Aaron Merey > --- > libdwfl/dwfl_segment_report_module.c | 37 +++++-- > tests/Makefile.am | 5 +- > tests/run-unstrip-noncontig.sh | 155 +++++++++++++++++++++++++++ > tests/testcore-noncontig.bz2 | Bin 0 -> 49146091 bytes > 4 files changed, 184 insertions(+), 13 deletions(-) > create mode 100755 tests/run-unstrip-noncontig.sh > create mode 100644 tests/testcore-noncontig.bz2 >=20 > diff --git a/libdwfl/dwfl_segment_report_module.c b/libdwfl/dwfl_segment_= report_module.c > index 3ef62a7d..09ee37b3 100644 > --- a/libdwfl/dwfl_segment_report_module.c > +++ b/libdwfl/dwfl_segment_report_module.c > @@ -737,17 +737,34 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, co= nst char *name, > && invalid_elf (module->elf, module->disk_file_has_build_id, > &build_id)) > { > - elf_end (module->elf); > - close (module->fd); > - module->elf =3D NULL; > - module->fd =3D -1; > + /* If MODULE's build-id doesn't match the disk file's > + build-id, close ELF only if MODULE and ELF refer to > + different builds of files with the same name. This > + prevents premature closure of the correct ELF in cases > + where segments of a module are non-contiguous in memory. */ > + if (name !=3D NULL && module->name[0] !=3D '\0' > + && strcmp (basename (module->name), basename (name)) =3D=3D 0) > + { > + elf_end (module->elf); > + close (module->fd); > + module->elf =3D NULL; > + module->fd =3D -1; > + } > } Nice. > - if (module->elf !=3D NULL) > + else if (module->elf !=3D NULL) > { > - /* Ignore this found module if it would conflict in address > - space with any already existing module of DWFL. */ > + /* This module has already been reported. */ > skip_this_module =3D true; > } > + else > + { > + /* Only report this module if we haven't already done so. */ > + for (Dwfl_Module *mod =3D dwfl->modulelist; mod !=3D NULL; > + mod =3D mod->next) > + if (mod->low_addr =3D=3D module_start > + && mod->high_addr =3D=3D module_end) > + skip_this_module =3D true; > + } > } > if (skip_this_module) > goto out; OK. So now we only skip modules if we have already seen this exact module. > @@ -781,10 +798,6 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, con= st char *name, > } > } > =20 > - /* Our return value now says to skip the segments contained > - within the module. */ > - ndx =3D addr_segndx (dwfl, segment, module_end, true); > - > /* Examine its .dynamic section to get more interesting details. > If it has DT_SONAME, we'll use that as the module name. > If it has a DT_DEBUG, then it's actually a PIE rather than a DSO. > @@ -929,6 +942,8 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, cons= t char *name, > ndx =3D -1; > goto out; > } > + else > + ndx++; > =20 > /* We have reported the module. Now let the caller decide whether we > should read the whole thing in right now. */ Right, so addr_segndx would normally return this ndx because next =3D=3D true. But now we just always just report the next ndx. > diff --git a/tests/Makefile.am b/tests/Makefile.am > index 7fb8efb1..a12df1d3 100644 > --- a/tests/Makefile.am > +++ b/tests/Makefile.am > @@ -212,7 +212,7 @@ TESTS =3D run-arextract.sh run-arsymtest.sh run-ar.sh= newfile test-nlist \ > $(asm_TESTS) run-disasm-bpf.sh run-low_high_pc-dw-form-indirect.sh \ > run-nvidia-extended-linemap-libdw.sh run-nvidia-extended-linemap-readel= f.sh \ > run-readelf-dw-form-indirect.sh run-strip-largealign.sh \ > - run-readelf-Dd.sh > + run-readelf-Dd.sh run-unstrip-noncontig.sh > =20 > if !BIARCH > export ELFUTILS_DISABLE_BIARCH =3D 1 > @@ -632,7 +632,8 @@ EXTRA_DIST =3D run-arextract.sh run-arsymtest.sh run-= ar.sh \ > run-nvidia-extended-linemap-libdw.sh run-nvidia-extended-linemap-r= eadelf.sh \ > testfile_nvidia_linemap.bz2 \ > testfile-largealign.o.bz2 run-strip-largealign.sh \ > - run-funcretval++11.sh > + run-funcretval++11.sh \ > + run-unstrip-noncontig.sh testcore-noncontig.bz2 > =20 > =20 > if USE_VALGRIND I really like to have a testcase, but only if we can find/construct something much smaller. Thanks, Mark