diff options
author | CoprDistGit <infra@openeuler.org> | 2024-08-03 06:28:41 +0000 |
---|---|---|
committer | CoprDistGit <infra@openeuler.org> | 2024-08-03 06:28:41 +0000 |
commit | d20db0561a6a36f914fde030512503b114ef9a0c (patch) | |
tree | d4e5e3494d95c269a1cee6195f11bf3201bcadbf /mtrace-Fix-output-with-PIE-and-ASLR-BZ-22716.patch | |
parent | 016343d99b1b269d7246ef1e143d4b54914433d4 (diff) |
automatic import of glibcopeneuler22.03_LTS_SP4openeuler22.03_LTS_SP3openeuler20.03
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.patch | 77 |
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 + |