Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1087)

Unified Diff: syzygy/pe/decomposer.cc

Issue 2856933003: Add support for the VS2017 built binaries. (Closed)
Patch Set: . Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « syzygy/pdb/pdb_data.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: syzygy/pe/decomposer.cc
diff --git a/syzygy/pe/decomposer.cc b/syzygy/pe/decomposer.cc
index 9314d45504db7f160c37f3bd9e97819ca4b1cc1b..1c81f4b8ee05a329488f70b3e293bc54a0c3329f 100644
--- a/syzygy/pe/decomposer.cc
+++ b/syzygy/pe/decomposer.cc
@@ -1792,6 +1792,7 @@ DiaBrowser::BrowserDirective Decomposer::OnDataSymbol(
// Verify that the data symbol does not exceed the size of the block.
if (addr + length > block_addr + block->size()) {
+ base::StringPiece spname(name);
// The data symbol can exceed the size of the block in the case of data
// imports. For some reason the toolchain emits a global data symbol with
// type information equal to the type of the data *pointed* to by the import
@@ -1802,10 +1803,24 @@ DiaBrowser::BrowserDirective Decomposer::OnDataSymbol(
// generated. This won't be part of the IAT, so we can't even filter based
// on that. Instead, we simply ignore global data symbols that exceed the
// block size.
- base::StringPiece spname(name);
- if (sym_tags.size() == 1 && spname.starts_with("_imp_")) {
+ bool is_imported_data_symbol = (sym_tags.size() == 1 &&
+ spname.starts_with("_imp_"));
+ // In VS2017 we've noticed that the size returned by IDiaSymbol::get_length
+ // function is invalid for the objects using RTTI in VS2017. This has been
+ // reported here:
+ // https://developercommunity.visualstudio.com/content/problem/47386/invalid-symbols-when-using-rtti.html
+ //
+ // In this situation the data symbol that we get always starts 4 bytes after
+ // the beginning of its parent block and has an identical size.
+ bool is_vtable_symbol = spname.ends_with("::`vftable'") &&
+ (addr - block_addr == 4) &&
+ length == block->size();
+ if (is_imported_data_symbol) {
VLOG(1) << "Encountered an imported data symbol \"" << name << "\" that "
<< "extends past its parent block \"" << block->name() << "\".";
+ } else if (is_vtable_symbol) {
+ VLOG(1) << "Encountered a vtable data symbol \"" << name << "\" that "
+ << "extends past its parent block \"" << block->name() << "\".";
} else {
LOG(ERROR) << "Received data symbol \"" << name << "\" that extends past "
<< "its parent block \"" << block->name() << "\".";
« no previous file with comments | « syzygy/pdb/pdb_data.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698