From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by finch.gentoo.org (Postfix) with ESMTPS id BE78F158015 for ; Fri, 22 Dec 2023 02:31:49 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id D4CC52BC01A; Fri, 22 Dec 2023 02:31:48 +0000 (UTC) Received: from smtp.gentoo.org (dev.gentoo.org [IPv6:2001:470:ea4a:1:5054:ff:fec7:86e4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id AF9A82BC01A for ; Fri, 22 Dec 2023 02:31:48 +0000 (UTC) Received: from oystercatcher.gentoo.org (oystercatcher.gentoo.org [148.251.78.52]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id BA10A340813 for ; Fri, 22 Dec 2023 02:31:47 +0000 (UTC) Received: from localhost.localdomain (localhost [IPv6:::1]) by oystercatcher.gentoo.org (Postfix) with ESMTP id 02FFD9C4 for ; Fri, 22 Dec 2023 02:31:46 +0000 (UTC) From: "Mike Frysinger" To: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: 8bit Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Mike Frysinger" Message-ID: <1702673639.c3205676f2bc6cc0ffd01098ce007ba7b5b7d159.vapier@gentoo> Subject: [gentoo-commits] proj/pax-utils:master commit in: / X-VCS-Repository: proj/pax-utils X-VCS-Files: lddtree.py X-VCS-Directories: / X-VCS-Committer: vapier X-VCS-Committer-Name: Mike Frysinger X-VCS-Revision: c3205676f2bc6cc0ffd01098ce007ba7b5b7d159 X-VCS-Branch: master Date: Fri, 22 Dec 2023 02:31:46 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-Archives-Salt: e2746441-c28f-409a-996a-9c130a468eb9 X-Archives-Hash: 37da66651ce7c8c947834ed4c09a458b commit: c3205676f2bc6cc0ffd01098ce007ba7b5b7d159 Author: David Riley chromium org> AuthorDate: Wed Sep 28 17:16:42 2022 +0000 Commit: Mike Frysinger gentoo org> CommitDate: Fri Dec 15 20:53:59 2023 +0000 URL: https://gitweb.gentoo.org/proj/pax-utils.git/commit/?id=c3205676 lddtree: Add --wrapper-preload --wrapper-preload allows the wrapper to be generated always specifying an LD_PRELOAD via the --preload option of the loader. Signed-off-by: David Riley chromium.org> Signed-off-by: Mike Frysinger chromium.org> Signed-off-by: Mike Frysinger gentoo.org> lddtree.py | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/lddtree.py b/lddtree.py index 60f3a7c..2b8b9c4 100755 --- a/lddtree.py +++ b/lddtree.py @@ -46,6 +46,7 @@ import functools import glob import mmap import os +import re import shutil import sys from typing import Any, Iterable, Optional, Union @@ -147,6 +148,7 @@ def GenerateLdsoWrapper( path: str, interp: str, libpaths: Iterable[str] = (), + preload: Optional[str] = None, ) -> None: """Generate a shell script wrapper which uses local ldso to run the ELF @@ -164,12 +166,21 @@ def GenerateLdsoWrapper( interp_dir, interp_name = os.path.split(interp) # Add ldso interpreter dir to end of libpaths as a fallback library path. libpaths = dedupe(list(libpaths) + [interp_dir]) + if preload: + # If preload is an absolute path, calculate it from basedir. + preload_prefix = f'${{basedir}}/{os.path.relpath("/", basedir)}' + preload = ":".join( + f"{preload_prefix}{x}" if os.path.isabs(x) else x + for x in re.split(r"[ :]", preload) + ) + replacements = { "interp": os.path.join(os.path.relpath(interp_dir, basedir), interp_name), "libpaths": ":".join( "${basedir}/" + os.path.relpath(p, basedir) for p in libpaths ), "argv0_arg": '--argv0 "$0"' if interp_supports_argv0(root + interp) else "", + "preload_arg": f'--preload "{preload}"' if preload else "", } wrapper = """#!/bin/sh if ! base=$(realpath "$0" 2>/dev/null); then @@ -182,6 +193,7 @@ basedir=${base%%/*} exec \\ "${basedir}/%(interp)s" \\ %(argv0_arg)s \\ + %(preload_arg)s \\ --library-path "%(libpaths)s" \\ --inhibit-cache \\ --inhibit-rpath '' \\ @@ -658,7 +670,15 @@ def _ActionCopy(options: argparse.Namespace, elf: dict): def _StripRoot(path: str) -> str: return path[len(options.root) - 1 :] - def _copy(realsrc, src, striproot=True, wrapit=False, libpaths=(), outdir=None): + def _copy( + realsrc, + src, + striproot=True, + wrapit=False, + libpaths=(), + outdir=None, + preload=None, + ): if realsrc is None: return @@ -712,7 +732,7 @@ def _ActionCopy(options: argparse.Namespace, elf: dict): interp = os.path.join(options.libdir, os.path.basename(elf["interp"])) else: interp = _StripRoot(elf["interp"]) - GenerateLdsoWrapper(options.dest, subdst, interp, libpaths) + GenerateLdsoWrapper(options.dest, subdst, interp, libpaths, preload) # XXX: We should automatically import libgcc_s.so whenever libpthread.so # is copied over (since we know it can be dlopen-ed by NPTL at runtime). @@ -750,6 +770,7 @@ def _ActionCopy(options: argparse.Namespace, elf: dict): wrapit=options.generate_wrappers, libpaths=libpaths, outdir=options.bindir, + preload=options.wrapper_preload, ) @@ -867,6 +888,12 @@ def GetParser() -> argparse.ArgumentParser: default=False, help="Copy over plain (non-ELF) files instead of warn+ignore", ) + group.add_argument( + "--wrapper-preload", + default=None, + type=str, + help="Have wrapper add --preload to the ldso invocation", + ) if argcomplete is not None: argcomplete.autocomplete(parser)