From patchwork Fri Jan 21 17:29:50 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 50318 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 98AD2385840D for ; Fri, 21 Jan 2022 17:31:00 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 98AD2385840D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1642786260; bh=GeIytik/XssoUC8+2ZGh6JuWj1T1KsiDFRpLOsHCiiM=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=N7QsPSJHhG1BLfOAvtsGUrNdzNoOsmoWvsggdpLwo79BIKRu9k28a+duSPfXX62HM K6apvFyDcVG88yOk7kXpgiycTBRGwfbywM2oze5km/HvGJhhSE0T4maiHbPSpl6obV 00xd5l2KgHdDAQEKlQpb0czMO72T4mtIpfCjVkAc= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-ot1-x32d.google.com (mail-ot1-x32d.google.com [IPv6:2607:f8b0:4864:20::32d]) by sourceware.org (Postfix) with ESMTPS id 44CA43858C60 for ; Fri, 21 Jan 2022 17:29:59 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 44CA43858C60 Received: by mail-ot1-x32d.google.com with SMTP id x31-20020a056830245f00b00599111c8b20so12624815otr.7 for ; Fri, 21 Jan 2022 09:29:59 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=GeIytik/XssoUC8+2ZGh6JuWj1T1KsiDFRpLOsHCiiM=; b=nBX1p+8cknFUc7OhdcXf96tzcbuI+tpv7v77sNvNXYbudn2/ycrrWE0kgnh3nQlxLQ fm8eQD+2FKWIMQexpEOvj+HFHg+V7xpcQxp5NN4DJRmg+lVr5oSqy7eDefmsu1aLYGWK dAk0LGTW3QfNIR6fWHfShjpsFH1DxQGpCuxJo9CMt6x1iF6xxBi2RPHrrw6n2w29R50/ 9VeDO72QWpSgH+dC0XCqB0y9+iScw1e9s21Y4vZDPKauwAD+Eqd91czF43xMfheW9q+w mxAYzRP+hMynTez8MM/FBGTnXyehpiGAhXjMWXZcK3kFwIsScLx8Aw5yO5LT/wgihErF 5L9A== X-Gm-Message-State: AOAM533o5tqd9OlMNdMyHVZldcPH9rvFiyqmmIrOTq1LIlBLrPJT8GCC ihwuCMR5B4kr9GNYWhSnSYLwPJTf3H0oOw== X-Google-Smtp-Source: ABdhPJxPHoTI9VVa1y5P2C+XWznTq9YUpE+KzV2iu4CfS9jm+RYqB7eYnVOSu1CTk4YrqmmFVXfS+A== X-Received: by 2002:a05:6830:2681:: with SMTP id l1mr3511647otu.380.1642786198530; Fri, 21 Jan 2022 09:29:58 -0800 (PST) Received: from birita.. ([2804:431:c7cb:27f8:f8b7:bc61:9607:9ecb]) by smtp.gmail.com with ESMTPSA id i21sm1294706oto.27.2022.01.21.09.29.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 21 Jan 2022 09:29:58 -0800 (PST) To: libc-alpha@sourceware.org Subject: [PATCH 2/3] malloc: Remove LD_TRACE_PRELINKING usage from mtrace Date: Fri, 21 Jan 2022 14:29:50 -0300 Message-Id: <20220121172951.285848-3-adhemerval.zanella@linaro.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220121172951.285848-1-adhemerval.zanella@linaro.org> References: <20220121172951.285848-1-adhemerval.zanella@linaro.org> MIME-Version: 1.0 X-Spam-Status: No, score=-12.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Adhemerval Zanella via Libc-alpha From: Adhemerval Zanella Netto Reply-To: Adhemerval Zanella Cc: Richard Purdie Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" The fix for BZ#22716 replaced LD_TRACE_LOADED_OBJECTS with LD_TRACE_PRELINKING so mtrace could record executable address as well. To provide the same information, LD_TRACE_LOADED_OBJECTS is extended where a value or '2' also prints the executable address. It avoid adding another loader environment variable to be used solely for mtrace. The vDSO will be printed as a default library (with '=>' pointing the same name), which is ok since both mtrace and ldd already handles it. The mtrace script is changed to also parse the new format. To correctly support PIE and non-PIE executables, both the default mtrace address and the one calculated as used (it fixes mtrace for non-PIE exectuable as for BZ#22716 for PIE). Checked on x86_64-linux-gnu. Reviewed-by: Siddhesh Poyarekar --- elf/dl-main.h | 3 +++ elf/rtld.c | 22 +++++++++++-------- malloc/mtrace.pl | 55 +++++++++++++++++++++++++++--------------------- 3 files changed, 47 insertions(+), 33 deletions(-) diff --git a/elf/dl-main.h b/elf/dl-main.h index 3e32f254c5..e4fa19ee4e 100644 --- a/elf/dl-main.h +++ b/elf/dl-main.h @@ -94,6 +94,9 @@ struct dl_main_state enum rtld_mode mode; + /* True if program should be also printed for rtld_mode_trace. */ + bool mode_trace_program; + /* True if any of the debugging options is enabled. */ bool any_debug; diff --git a/elf/rtld.c b/elf/rtld.c index dbf40c6bc1..9fea138619 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -2103,18 +2103,18 @@ dl_main (const ElfW(Phdr) *phdr, _dl_printf ("\tstatically linked\n"); else { - for (l = main_map->l_next; l; l = l->l_next) + for (l = state.mode_trace_program ? main_map : main_map->l_next; + l; l = l->l_next) { if (l->l_faked) /* The library was not found. */ - _dl_printf ("\t%s => not found\n", l->l_libname->name); - else if (strcmp (l->l_libname->name, l->l_name) == 0) - _dl_printf ("\t%s (0x%0*Zx)\n", l->l_libname->name, - (int) sizeof l->l_map_start * 2, - (size_t) l->l_map_start); + _dl_printf ("\t%s => not found\n", l->l_libname->name); else - _dl_printf ("\t%s => %s (0x%0*Zx)\n", l->l_libname->name, - l->l_name, (int) sizeof l->l_map_start * 2, + _dl_printf ("\t%s => %s (0x%0*Zx)\n", + DSO_FILENAME (l->l_libname->name), + DSO_FILENAME (l->l_name), + (int) sizeof l->l_map_start * 2, (size_t) l->l_map_start); + } } if (__glibc_unlikely (state.mode != rtld_mode_trace)) @@ -2675,7 +2675,11 @@ process_envvars (struct dl_main_state *state) case 20: /* The mode of the dynamic linker can be set. */ if (memcmp (envline, "TRACE_LOADED_OBJECTS", 20) == 0) - state->mode = rtld_mode_trace; + { + state->mode = rtld_mode_trace; + state->mode_trace_program + = _dl_strtoul (&envline[21], NULL) > 1; + } break; /* We might have some extra environment variable to handle. This diff --git a/malloc/mtrace.pl b/malloc/mtrace.pl index 042df725eb..bd2755ca77 100644 --- a/malloc/mtrace.pl +++ b/malloc/mtrace.pl @@ -74,15 +74,14 @@ if ($#ARGV == 0) { } else { $prog = "./$binary"; } - # Set the environment variable LD_TRACE_PRELINKING to an empty string so - # that we trigger tracing but do not match with the executable or any of - # its dependencies. - if (open (LOCS, "env LD_TRACE_PRELINKING= $prog |")) { - while () { + # Set the environment variable LD_TRACE_LOADED_OBJETS to 2 so the + # executable is also printed. + if (open (locs, "env LD_TRACE_LOADED_OBJECTS=2 $prog |")) { + while () { chop; - if (/^.*=> (.*) \((0x[0123456789abcdef]*), (0x[0123456789abcdef]*).*/) { + if (/^.*=> (.*) .(0x[0123456789abcdef]*).$/) { $locs{$1} = $2; - $rel{$1} = hex($2) - hex($3); + $rel{$1} = hex($2); } } close (LOCS); @@ -91,6 +90,18 @@ if ($#ARGV == 0) { die "Wrong number of arguments, run $progname --help for help."; } +sub addr2line { + my $addr = pop(@_); + my $prog = pop(@_); + if (open (ADDR, "addr2line -e $prog $addr|")) { + my $line = ; + chomp $line; + close (ADDR); + if ($line ne '??:0') { + return $line + } + } +} sub location { my $str = pop(@_); return $str if ($str eq ""); @@ -98,11 +109,9 @@ sub location { my $addr = $1; my $fct = $2; return $cache{$addr} if (exists $cache{$addr}); - if ($binary ne "" && open (ADDR, "addr2line -e $binary $addr|")) { - my $line = ; - chomp $line; - close (ADDR); - if ($line ne '??:0') { + if ($binary ne "") { + my $line = &addr2line($binary, $addr); + if ($line) { $cache{$addr} = $line; return $cache{$addr}; } @@ -114,24 +123,22 @@ sub location { my $searchaddr; return $cache{$addr} if (exists $cache{$addr}); $searchaddr = sprintf "%#x", hex($addr) + $rel{$prog}; - if ($binary ne "" && open (ADDR, "addr2line -e $prog $searchaddr|")) { - my $line = ; - chomp $line; - close (ADDR); - if ($line ne '??:0') { - $cache{$addr} = $line; - return $cache{$addr}; + if ($binary ne "") { + for my $address ($searchaddr, $addr) { + my $line = &addr2line($prog, $address); + if ($line) { + $cache{$addr} = $line; + return $cache{$addr}; + } } } $cache{$addr} = $str = $addr; } elsif ($str =~ /^.*[[](0x[^]]*)]$/) { my $addr = $1; return $cache{$addr} if (exists $cache{$addr}); - if ($binary ne "" && open (ADDR, "addr2line -e $binary $addr|")) { - my $line = ; - chomp $line; - close (ADDR); - if ($line ne '??:0') { + if ($binary ne "") { + my $line = &addr2line($binary, $addr); + if ($line) { $cache{$addr} = $line; return $cache{$addr}; }