summaryrefslogtreecommitdiff
path: root/mtrace-Fix-output-with-PIE-and-ASLR-BZ-22716.patch
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2024-08-03 06:28:41 +0000
committerCoprDistGit <infra@openeuler.org>2024-08-03 06:28:41 +0000
commitd20db0561a6a36f914fde030512503b114ef9a0c (patch)
treed4e5e3494d95c269a1cee6195f11bf3201bcadbf /mtrace-Fix-output-with-PIE-and-ASLR-BZ-22716.patch
parent016343d99b1b269d7246ef1e143d4b54914433d4 (diff)
Diffstat (limited to 'mtrace-Fix-output-with-PIE-and-ASLR-BZ-22716.patch')
-rw-r--r--mtrace-Fix-output-with-PIE-and-ASLR-BZ-22716.patch77
1 files changed, 77 insertions, 0 deletions
diff --git a/mtrace-Fix-output-with-PIE-and-ASLR-BZ-22716.patch b/mtrace-Fix-output-with-PIE-and-ASLR-BZ-22716.patch
new file mode 100644
index 0000000..10622da
--- /dev/null
+++ b/mtrace-Fix-output-with-PIE-and-ASLR-BZ-22716.patch
@@ -0,0 +1,77 @@
+From f2e33c3268db9adf8e57e991676ed0d5ac74e8a8 Mon Sep 17 00:00:00 2001
+From: Siddhesh Poyarekar <siddhesh@sourceware.org>
+Date: Mon, 23 Aug 2021 08:11:54 +0530
+Subject: [PATCH] mtrace: Fix output with PIE and ASLR [BZ #22716]
+
+Record only the relative address of the caller in mtrace file. Use
+LD_TRACE_PRELINKING to get the executable as well as binary vs
+executable load offsets so that we may compute a base to add to the
+relative address in the mtrace file. This allows us to get a valid
+address to pass to addr2line in all cases.
+
+Fixes BZ #22716.
+
+Co-authored-by: John Ogness <john.ogness@linutronix.de>
+Reviewed-by: Andreas Schwab <schwab@linux-m68k.org>
+Reviewed-by: DJ Delorie <dj@redhat.com>
+---
+ malloc/mtrace-impl.c | 6 +++---
+ malloc/mtrace.pl | 15 +++++++--------
+ 2 files changed, 10 insertions(+), 11 deletions(-)
+
+diff --git a/malloc/mtrace-impl.c b/malloc/mtrace-impl.c
+index 83008ca..f5f19c2 100644
+--- a/malloc/mtrace-impl.c
++++ b/malloc/mtrace-impl.c
+@@ -65,9 +65,9 @@ tr_where (const void *caller, Dl_info *info)
+ offset);
+ }
+
+- fprintf (mallstream, "@ %s%s%s[%p] ", info->dli_fname ? : "",
+- info->dli_fname ? ":" : "",
+- buf, caller);
++ fprintf (mallstream, "@ %s%s%s[0x%" PRIxPTR "] ",
++ info->dli_fname ? : "", info->dli_fname ? ":" : "", buf,
++ caller - info->dli_fbase);
+ }
+ else
+ fprintf (mallstream, "@ [%p] ", caller);
+diff --git a/malloc/mtrace.pl b/malloc/mtrace.pl
+index 6f49c83..b1073a1 100644
+--- a/malloc/mtrace.pl
++++ b/malloc/mtrace.pl
+@@ -75,11 +75,15 @@ if ($#ARGV == 0) {
+ } else {
+ $prog = "./$binary";
+ }
+- if (open (LOCS, "env LD_TRACE_LOADED_OBJECTS=1 $prog |")) {
++ # 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 (<LOCS>) {
+ chop;
+- if (/^.*=> (.*) .(0x[0123456789abcdef]*).$/) {
++ if (/^.*=> (.*) \((0x[0123456789abcdef]*), (0x[0123456789abcdef]*).*/) {
+ $locs{$1} = $2;
++ $rel{$1} = hex($2) - hex($3);
+ }
+ }
+ close (LOCS);
+@@ -110,12 +114,7 @@ sub location {
+ my $addr = $2;
+ my $searchaddr;
+ return $cache{$addr} if (exists $cache{$addr});
+- if ($locs{$prog} ne "") {
+- $searchaddr = sprintf "%#x", $addr - $locs{$prog};
+- } else {
+- $searchaddr = $addr;
+- $prog = $binary;
+- }
++ $searchaddr = sprintf "%#x", hex($addr) + $rel{$prog};
+ if ($binary ne "" && open (ADDR, "addr2line -e $prog $searchaddr|")) {
+ my $line = <ADDR>;
+ chomp $line;
+--
+1.8.3.1
+