[PATCH] D57151: [llvm-symbolizer] Add switch to adjust addresses by fixed offset

James Henderson via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Jan 24 05:37:11 PST 2019


jhenderson created this revision.
jhenderson added reviewers: grimar, ruiu, MaskRay, dblaikie, eugene, smeenai.
Herald added a subscriber: rupprecht.

If a stack trace or similar has a list of addresses from a program or DSO loaded at a variable address (e.g. due to ASLR), the addresses will not directly correspond to the addresses stored in the object file. If a user wishes to use llvm-symbolizer, they have to subtract the load address from every address. This is somewhat inconvenient, especially as the output of --print-address will result in the adjusted address being listed, rather than the address coming from the stack trace, making it harder to map results between the two.

This change adds a new switch to llvm-symbolizer `--adjust-vma` which takes an offset, which is then used to automatically do this calculation. The printed address remains the input address (allowing for easy mapping), whilst the specified offset is applied to the addresses when performing the lookup.

The switch is conceptually similar to llvm-objdump's new switch of the same name (see D57051 <https://reviews.llvm.org/D57051>), which in turn mirrors a GNU switch. There is no equivalent switch in addr2line.


Repository:
  rL LLVM

https://reviews.llvm.org/D57151

Files:
  test/tools/llvm-symbolizer/adjust-vma.s
  tools/llvm-symbolizer/llvm-symbolizer.cpp


Index: tools/llvm-symbolizer/llvm-symbolizer.cpp
===================================================================
--- tools/llvm-symbolizer/llvm-symbolizer.cpp
+++ tools/llvm-symbolizer/llvm-symbolizer.cpp
@@ -134,6 +134,11 @@
 static cl::opt<bool> ClVerbose("verbose", cl::init(false),
                                cl::desc("Print verbose line info"));
 
+// -adjust-vma
+static cl::opt<unsigned long long>
+    ClAdjustVMA("adjust-vma", cl::init(0), cl::value_desc("offset"),
+                cl::desc("Add specified offset to object file addresses"));
+
 static cl::list<std::string> ClInputAddresses(cl::Positional,
                                               cl::desc("<input addresses>..."),
                                               cl::ZeroOrMore);
@@ -201,6 +206,7 @@
     StringRef Delimiter = ClPrettyPrint ? ": " : "\n";
     outs() << Delimiter;
   }
+  ModuleOffset -= ClAdjustVMA;
   if (IsData) {
     auto ResOrErr = Symbolizer.symbolizeData(ModuleName, ModuleOffset);
     Printer << (error(ResOrErr) ? DIGlobal() : ResOrErr.get());
Index: test/tools/llvm-symbolizer/adjust-vma.s
===================================================================
--- test/tools/llvm-symbolizer/adjust-vma.s
+++ test/tools/llvm-symbolizer/adjust-vma.s
@@ -0,0 +1,39 @@
+# REQUIRES: x86-registered-target
+
+.type foo, at function
+.size foo,12
+foo:
+    .space 10
+    nop
+    nop
+
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o -g
+
+# RUN: llvm-symbolizer 0xa 0xb --print-address --obj=%t.o \
+# RUN:   | FileCheck %s --check-prefix=NORMAL
+# RUN: llvm-symbolizer 0x10a 0x10b --print-address --adjust-vma 0x100 --obj=%t.o \
+# RUN:   | FileCheck %s --check-prefix=ADJUST
+
+# Show that we can handle addresses less than the offset.
+# RUN: llvm-symbolizer 0xa --print-address --adjust-vma 0xb --obj=%t.o \
+# RUN:   | FileCheck %s --check-prefix=OVERFLOW
+
+# NORMAL:      0xa
+# NORMAL-NEXT: foo
+# NORMAL-NEXT: adjust-vma.s:7:0
+# NORMAL-EMPTY:
+# NORMAL-NEXT: 0xb
+# NORMAL-NEXT: foo
+# NORMAL-NEXT: adjust-vma.s:8:0
+
+# ADJUST:      0x10a
+# ADJUST-NEXT: foo
+# ADJUST-NEXT: adjust-vma.s:7:0
+# ADJUST-EMPTY:
+# ADJUST-NEXT: 0x10b
+# ADJUST-NEXT: foo
+# ADJUST-NEXT: adjust-vma.s:8:0
+
+# OVERFLOW:      0xa
+# OVERFLOW-NEXT: ??
+# OVERFLOW-NEXT: ??


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D57151.183289.patch
Type: text/x-patch
Size: 2291 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190124/eec1e7dc/attachment.bin>


More information about the llvm-commits mailing list