From 4a5a6337f7b79c8800dc0f5d7119f17b07e527ae Mon Sep 17 00:00:00 2001 From: Jonas Devlieghere Date: Tue, 26 Sep 2017 08:17:28 +0000 Subject: [PATCH] [dsymutil] Better support for symbol aliases This patch adds logic to follow a symbol's aliases when the symbol name cannot be found in the current object file. It checks the main binary for the symbol's address and queries the current object for its aliases (symbols with the same address) before printing out a warning. Differential revision: https://reviews.llvm.org/D38230 llvm-svn: 314198 --- llvm/test/tools/dsymutil/Inputs/alias/bar.o | Bin 0 -> 1956 bytes llvm/test/tools/dsymutil/Inputs/alias/foo.o | Bin 0 -> 1656 bytes llvm/test/tools/dsymutil/Inputs/alias/foobar | Bin 0 -> 8688 bytes llvm/test/tools/dsymutil/X86/alias.test | 19 +++++++++++++++++++ llvm/tools/dsymutil/MachODebugMapParser.cpp | 24 ++++++++++++++++++++++++ 5 files changed, 43 insertions(+) create mode 100644 llvm/test/tools/dsymutil/Inputs/alias/bar.o create mode 100644 llvm/test/tools/dsymutil/Inputs/alias/foo.o create mode 100755 llvm/test/tools/dsymutil/Inputs/alias/foobar create mode 100644 llvm/test/tools/dsymutil/X86/alias.test diff --git a/llvm/test/tools/dsymutil/Inputs/alias/bar.o b/llvm/test/tools/dsymutil/Inputs/alias/bar.o new file mode 100644 index 0000000000000000000000000000000000000000..d98632f64308072ed66deb4f8f57b32e1aeaa230 GIT binary patch literal 1956 zcmb7FK~EDw6n@*K1u0#N5XET7nqWfJv{eik6$JsQ(E|b09yH^&EU?&ao9$A;n8?X! zxOg(gAK=-aVB*1}`~)@eXrdm~fbZ?TDeVHGzGUW`_x8PSznPtx{q+0$W-EZA0(RJ1 zux(JMV?#TNEld6$_8{ax_`x~SM^2y?<2oT+bH!x`L5SIj?CiELM~8Vpd_*}#;waVv zYXs7Sm@{+B3!>sWUPy@XyQ9*B;3MEB9T=XXJ8@StWgqeEwSi&U1CH zNj}S-FHuR5?=AD(WPHVZS)4Bm+f|=q*b8Q5C*M!zk?^HSeMKYhNet?feBRn4>Hd61 zxm+-XZ4^n~j`{v#VV4=d?yJw|E9I8*R1(yeWMO^G*Bjx%HU!qMPG8x`2l=K0eAk-f zb63l|&bP{ZldNZcU%q^)h`L;{Y(KK>IU#P1Z%+l_J@e@te208=W*6o8sBIfRK?rkE z%scosq~CbnJ~Q8l{}?uyk6nl&wHy=5^HH#Dk1@D@IPp$#$x_D0MPvu@-h|Wj}`+34MW%z z{@g?Y2Wsoy9d2)LI}uhR$xsNhaobYz@M#|-y^IJHk0coBeFuq|jfQnD9yr`wAiQ1l E4{zqkGXMYp literal 0 HcmV?d00001 diff --git a/llvm/test/tools/dsymutil/Inputs/alias/foo.o b/llvm/test/tools/dsymutil/Inputs/alias/foo.o new file mode 100644 index 0000000000000000000000000000000000000000..aff057285888d43eef4305a54a586279737ffb18 GIT binary patch literal 1656 zcmb7^-D(p-6vtXBpFUh5>p8+NZ&U zLKdKTTAw1{C<*de#;7%zjC6)JA(q9R_gu`yy8dLhK3u0~ikI;B6LawPY;F%dmi4$+ zuMO8~rb;JXMmfh=@SMhe+lqJ??}E2ed-Ze>sW`8t=c{rIB1Z9wXEz$5)1&@Jd6vw( zE$#7?ypGrMDJ9MOC^?(bu4ct#Hz)pAtVY^b^@XLwc9+UK(eIHgkI5=nzxkV z9ZkvO2f^5WUr63FS>MlzJaM1hj^~W)_mkw^lDswCla!3y7dn?Y3Ya|~htcL0=o{n_ zDuB(y8qk-}q|mh=xbM9)D|af@jq-}Q?7F>f zY2dqCU0Y!--!C>!`m4N7~_L6qC@}y literal 0 HcmV?d00001 diff --git a/llvm/test/tools/dsymutil/Inputs/alias/foobar b/llvm/test/tools/dsymutil/Inputs/alias/foobar new file mode 100755 index 0000000000000000000000000000000000000000..8f3891decfde7dc75818fe94beab23f6c10b93bf GIT binary patch literal 8688 zcmeHNOKTHR6h32H6s@)>h+-k56!8HW7Zo3?MiNYY)T$|HMQ)SMlm?qLBol3S0dXN( z=+d427rJ+$8|iNl6x;~z1QGH3=F!YVrQ%LJ2hKhByZ4@R&-rFHckXO_{q%jih}9?3 z*(M@G&<4OGvC$Jb2rWX5naW)(%oJ{1<7ir}H2fuEoR3grN`+gc^pe1TI6Wp2Ms6|y zWo{H>d~ewg`yo!pTSozmw?A4!+}~YJ&`CmL+Vuz3x@)TS`6W#B=Jzs+M-C{&aW3IV zx@DcupvL5LrCeeT^`z>I>rK=N+QT)0zgzapUH{+3+pG<7w#qAfj#nloFBkF?@iVY{ z@&cxO4w4li|4}y>KZ5twQggG667HyGzu*-*`u)CmBP|BW2S<7B%azDU7 z62`EhgHWg4YC4P6isP;08~svH#7LmhaWF7qZBsS_!?6!f?NFTVx09@d%S26=gsf zPzIC%Wk4BF29yD1KpFVI8JI3U{!m;Um<9{43*X4a6S@0pZH;H75kg4P@+`u$$`~y5 zMRaaqpXbX#oKc3mCoJo4&RPhgq6{bl%78MU3@8K2fHI&AC5M~l(G4xB{|1W3w^SlLDR9r2HzSoVX#Sn{!zd~aT?9){j%>ley!oSt(BVZwR}h5k)0EV2Ckby(BUvm G9PtP4T$fV- literal 0 HcmV?d00001 diff --git a/llvm/test/tools/dsymutil/X86/alias.test b/llvm/test/tools/dsymutil/X86/alias.test new file mode 100644 index 0000000..9625b30 --- /dev/null +++ b/llvm/test/tools/dsymutil/X86/alias.test @@ -0,0 +1,19 @@ +# RUN: llvm-dsymutil -f -oso-prepend-path=%p/../Inputs/alias \ +# RUN: %p/../Inputs/alias/foobar -o - 2>&1 | llvm-dwarfdump - | FileCheck %s +# CHECK-NOT: could not find object file symbol for symbol +# CHECK: DW_AT_name ("foo.c") +# CHECK: DW_AT_name ("bar.c") + +# Source: +# $ cat foo.c +# int foo = 1; +# $ cat bar.c +# extern int bar; +# int main() { +# return bar; +# } + +# Compile with: +# $ clang -g -O0 bar.c -c -o bar.o +# $ clang -g -O0 foo.c -c -o foo.o +# $ ld -arch x86_64 -macosx_version_min 10.13.0 foo.o bar.o -lSystem -alias _foo _bar -o foobar diff --git a/llvm/tools/dsymutil/MachODebugMapParser.cpp b/llvm/tools/dsymutil/MachODebugMapParser.cpp index 75ae67c..866196f 100644 --- a/llvm/tools/dsymutil/MachODebugMapParser.cpp +++ b/llvm/tools/dsymutil/MachODebugMapParser.cpp @@ -70,6 +70,7 @@ private: sys::TimePoint Timestamp); void resetParserState(); uint64_t getMainBinarySymbolAddress(StringRef Name); + std::vector getMainBinarySymbolNames(uint64_t Value); void loadMainBinarySymbols(const MachOObjectFile &MainBinary); void loadCurrentObjectFileSymbols(const object::MachOObjectFile &Obj); void handleStabSymbolTableEntry(uint32_t StringIndex, uint8_t Type, @@ -382,9 +383,21 @@ void MachODebugMapParser::handleStabSymbolTableEntry(uint32_t StringIndex, } auto ObjectSymIt = CurrentObjectAddresses.find(Name); + + // If the name of a (non-static) symbol is not in the current object, we + // check all its aliases from the main binary. + if (ObjectSymIt == CurrentObjectAddresses.end() && Type != MachO::N_STSYM) { + for (const auto &Alias : getMainBinarySymbolNames(Value)) { + ObjectSymIt = CurrentObjectAddresses.find(Alias); + if (ObjectSymIt != CurrentObjectAddresses.end()) + break; + } + } + if (ObjectSymIt == CurrentObjectAddresses.end()) return Warning("could not find object file symbol for symbol " + Twine(Name)); + if (!CurrentDebugMapObject->addSymbol(Name, ObjectSymIt->getValue(), Value, Size)) return Warning(Twine("failed to insert symbol '") + Name + @@ -429,6 +442,17 @@ uint64_t MachODebugMapParser::getMainBinarySymbolAddress(StringRef Name) { return Sym->second; } +/// Get all symbol names in the main binary for the given value. +std::vector +MachODebugMapParser::getMainBinarySymbolNames(uint64_t Value) { + std::vector Names; + for (const auto &Entry : MainBinarySymbolAddresses) { + if (Entry.second == Value) + Names.push_back(Entry.first()); + } + return Names; +} + /// Load the interesting main binary symbols' addresses into /// MainBinarySymbolAddresses. void MachODebugMapParser::loadMainBinarySymbols( -- 2.7.4