vndk-vtable-dumper: Use demangled name of symbol while handling symbol aliasing.

While trying to handle cases where multiple symbols could be aliased, we
were trying to relate a symbol to its class by trying to find the
class' demangled name as a substring of the symbol's mangled name. This
might lead to errors when the class is in a qualified namespace (due to
C++ mangled names having fully qualified namespaces of the form
<num-letters><namespace>. Having <num-letters> interspersed between namespaces
makes finding the substring inaccurate). Now, we try find the class' demangled
name in the demangled symbol name instead.

Bug: 80088849

Test: Without this change, vndk-vtable-dumper for
      libstagefright_bufferqueue_helper.so has an incorrect entry in the
      vtable for android::GraphicsBuffer at offset 20 :
      _ZNK7android6VectorIiE12do_constructEPvj

Test: With this change, vndk-vtable-dumper for
      libstagefright_bufferqueue_helper.so has the correct entry in the
      vtable for android::GraphicsBuffer at offset 20 :
      _ZN7android19GraphicBufferSource23onSidebandStreamChangedEv

Change-Id: I16507f3cef4d9c252aae3d27bef34563e2679703
This commit is contained in:
Jayant Chowdhary
2018-05-22 10:55:17 -07:00
parent b83b0f1f72
commit f0641b065f

View File

@@ -329,8 +329,9 @@ SymbolRef ELFSharedObject<ELFT>::matchValueToSymbol(
const std::string ClassName(Vtablep->getDemangledName().substr(pos)); const std::string ClassName(Vtablep->getDemangledName().substr(pos));
for (const SymbolRef &Symbol : SymVec) { for (const SymbolRef &Symbol : SymVec) {
StringRef SymbolName = UnWrap(Symbol.getName()); StringRef SymbolName = UnWrap(Symbol.getName());
if (SymbolName.str().find(ClassName) != std::string::npos) if (demangle(SymbolName.str()).find(ClassName) != std::string::npos) {
return Symbol; return Symbol;
}
} }
// Return the 1st Symbol by default. // Return the 1st Symbol by default.
return SymVec[0]; return SymVec[0];