aboutsummaryrefslogtreecommitdiff
path: root/malloc
diff options
context:
space:
mode:
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>2022-01-21 10:20:50 -0300
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2022-02-10 09:16:13 -0300
commitd7703d3176d225d5743b21811d888619eba39e82 (patch)
tree5a4586f8fe3459d45319cac801366dd92510d5b2 /malloc
parent6628c742b2c16e785d3c884d9deeda5adb30ca12 (diff)
downloadglibc-d7703d3176d225d5743b21811d888619eba39e82.zip
glibc-d7703d3176d225d5743b21811d888619eba39e82.tar.gz
glibc-d7703d3176d225d5743b21811d888619eba39e82.tar.bz2
malloc: Remove LD_TRACE_PRELINKING usage from mtrace
The fix for BZ#22716 replacde LD_TRACE_LOADED_OBJECTS with LD_TRACE_PRELINKING so mtrace could record executable address position. To provide the same information, LD_TRACE_LOADED_OBJECTS is extended where a value or '2' also prints the executable address as well. 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 <siddhesh@sourceware.org>
Diffstat (limited to 'malloc')
-rw-r--r--malloc/mtrace.pl55
1 files changed, 31 insertions, 24 deletions
diff --git a/malloc/mtrace.pl b/malloc/mtrace.pl
index 042df72..3e7bd68 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 (<LOCS>) {
+ # Set the environment variable LD_TRACE_LOADED_OBJECTS to 2 so the
+ # executable is also printed.
+ if (open (locs, "env LD_TRACE_LOADED_OBJECTS=2 $prog |")) {
+ while (<locs>) {
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 = <ADDR>;
+ 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 = <ADDR>;
- 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 = <ADDR>;
- 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 = <ADDR>;
- chomp $line;
- close (ADDR);
- if ($line ne '??:0') {
+ if ($binary ne "") {
+ my $line = &addr2line($binary, $addr);
+ if ($line) {
$cache{$addr} = $line;
return $cache{$addr};
}