diff options
author | Samuel Huang <huangs@chromium.org> | 2021-08-04 00:58:50 +0000 |
---|---|---|
committer | Copybara-Service <copybara-worker@google.com> | 2021-08-03 18:07:42 -0700 |
commit | 3e1f64d1395c53a730475d930b663d5f6006099e (patch) | |
tree | b8ebaace02a34c080bbcfec6fa3c89379d6d6ce4 /disassembler_win32.cc | |
parent | cc55358d0d888c102638c2937e73f6a2e52518ca (diff) | |
download | zucchini-3e1f64d1395c53a730475d930b663d5f6006099e.tar.gz |
[Zucchini] Disassemblers: Fix abs32 width for ELF; cleanup Traits template param.
Previously DisassemblerElfIntel<TRAITS>::ParseExecSection() passes a
hard-coded 4 to Abs32GapFinder's |abs32_width| CTOR param. This is
wrong for X64, which has abs32 pointer width of 8 bytes. This can lead
to lower quality rel32 extraction.
This CL fixes the above by replacing 4 with Traits::kVAWidth, and also
cleans up TRAITS / Traits template parameter for Disassembler:
* For template param, "template <class TRAITS>" is used throughout.
* This means function params needs to use TRAITS.
* For usage, each Disassembler class with TRAITS declares
using Traits = TRAITS;
(and variant) and uses Traits in the body of all functions. Reason:
Specialized derive classes won't have TRAITS available , so:
* Function params can use DisassemblerBase::Traits.
* Function bodies can use Traits.
* For consistency, even if TRAITS is available, still use Traits.
Bug: 1233831
Change-Id: Ie796c867fb238eca462b2fb6b4e68a965996c25a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3063919
Commit-Queue: Samuel Huang <huangs@chromium.org>
Reviewed-by: Etienne Pierre-Doray <etiennep@chromium.org>
Cr-Commit-Position: refs/heads/master@{#908261}
NOKEYCHECK=True
GitOrigin-RevId: 294860c47cd3678c46422ce57da366724e1dc629
Diffstat (limited to 'disassembler_win32.cc')
-rw-r--r-- | disassembler_win32.cc | 79 |
1 files changed, 39 insertions, 40 deletions
diff --git a/disassembler_win32.cc b/disassembler_win32.cc index a23201b..37e43e5 100644 --- a/disassembler_win32.cc +++ b/disassembler_win32.cc @@ -24,7 +24,6 @@ namespace { // Decides whether |image| points to a Win32 PE file. If this is a possibility, // assigns |source| to enable further parsing, and returns true. Otherwise // leaves |source| at an undefined state and returns false. -template <class Traits> bool ReadWin32Header(ConstBufferView image, BufferSource* source) { *source = BufferSource(image); @@ -47,9 +46,9 @@ bool ReadWin32Header(ConstBufferView image, BufferSource* source) { return true; } -template <class Traits> +template <class TRAITS> const pe::ImageDataDirectory* ReadDataDirectory( - const typename Traits::ImageOptionalHeader* optional_header, + const typename TRAITS::ImageOptionalHeader* optional_header, size_t index) { if (index >= optional_header->number_of_rva_and_sizes) return nullptr; @@ -57,7 +56,7 @@ const pe::ImageDataDirectory* ReadDataDirectory( } // Decides whether |section| (assumed value) is a section that contains code. -template <class Traits> +template <class TRAITS> bool IsWin32CodeSection(const pe::ImageSectionHeader& section) { return (section.characteristics & kCodeCharacteristics) == kCodeCharacteristics; @@ -82,31 +81,31 @@ const char Win32X64Traits::kExeTypeString[] = "Windows PE x64"; /******** DisassemblerWin32 ********/ // static. -template <class Traits> -bool DisassemblerWin32<Traits>::QuickDetect(ConstBufferView image) { +template <class TRAITS> +bool DisassemblerWin32<TRAITS>::QuickDetect(ConstBufferView image) { BufferSource source; - return ReadWin32Header<Traits>(image, &source); + return ReadWin32Header(image, &source); } // |num_equivalence_iterations_| = 2 for reloc -> abs32. -template <class Traits> -DisassemblerWin32<Traits>::DisassemblerWin32() : Disassembler(2) {} +template <class TRAITS> +DisassemblerWin32<TRAITS>::DisassemblerWin32() : Disassembler(2) {} -template <class Traits> -DisassemblerWin32<Traits>::~DisassemblerWin32() = default; +template <class TRAITS> +DisassemblerWin32<TRAITS>::~DisassemblerWin32() = default; -template <class Traits> -ExecutableType DisassemblerWin32<Traits>::GetExeType() const { +template <class TRAITS> +ExecutableType DisassemblerWin32<TRAITS>::GetExeType() const { return Traits::kExeType; } -template <class Traits> -std::string DisassemblerWin32<Traits>::GetExeTypeString() const { +template <class TRAITS> +std::string DisassemblerWin32<TRAITS>::GetExeTypeString() const { return Traits::kExeTypeString; } -template <class Traits> -std::vector<ReferenceGroup> DisassemblerWin32<Traits>::MakeReferenceGroups() +template <class TRAITS> +std::vector<ReferenceGroup> DisassemblerWin32<TRAITS>::MakeReferenceGroups() const { return { {ReferenceTypeTraits{2, TypeTag(kReloc), PoolTag(kReloc)}, @@ -118,8 +117,8 @@ std::vector<ReferenceGroup> DisassemblerWin32<Traits>::MakeReferenceGroups() }; } -template <class Traits> -std::unique_ptr<ReferenceReader> DisassemblerWin32<Traits>::MakeReadRelocs( +template <class TRAITS> +std::unique_ptr<ReferenceReader> DisassemblerWin32<TRAITS>::MakeReadRelocs( offset_t lo, offset_t hi) { if (!ParseAndStoreRelocBlocks()) @@ -135,8 +134,8 @@ std::unique_ptr<ReferenceReader> DisassemblerWin32<Traits>::MakeReadRelocs( translator_); } -template <class Traits> -std::unique_ptr<ReferenceReader> DisassemblerWin32<Traits>::MakeReadAbs32( +template <class TRAITS> +std::unique_ptr<ReferenceReader> DisassemblerWin32<TRAITS>::MakeReadAbs32( offset_t lo, offset_t hi) { ParseAndStoreAbs32(); @@ -146,8 +145,8 @@ std::unique_ptr<ReferenceReader> DisassemblerWin32<Traits>::MakeReadAbs32( translator_); } -template <class Traits> -std::unique_ptr<ReferenceReader> DisassemblerWin32<Traits>::MakeReadRel32( +template <class TRAITS> +std::unique_ptr<ReferenceReader> DisassemblerWin32<TRAITS>::MakeReadRel32( offset_t lo, offset_t hi) { ParseAndStoreRel32(); @@ -155,8 +154,8 @@ std::unique_ptr<ReferenceReader> DisassemblerWin32<Traits>::MakeReadRel32( translator_); } -template <class Traits> -std::unique_ptr<ReferenceWriter> DisassemblerWin32<Traits>::MakeWriteRelocs( +template <class TRAITS> +std::unique_ptr<ReferenceWriter> DisassemblerWin32<TRAITS>::MakeWriteRelocs( MutableBufferView image) { if (!ParseAndStoreRelocBlocks()) return std::make_unique<EmptyReferenceWriter>(); @@ -166,30 +165,30 @@ std::unique_ptr<ReferenceWriter> DisassemblerWin32<Traits>::MakeWriteRelocs( translator_); } -template <class Traits> -std::unique_ptr<ReferenceWriter> DisassemblerWin32<Traits>::MakeWriteAbs32( +template <class TRAITS> +std::unique_ptr<ReferenceWriter> DisassemblerWin32<TRAITS>::MakeWriteAbs32( MutableBufferView image) { return std::make_unique<Abs32WriterWin32>( image, AbsoluteAddress(Traits::kBitness, image_base_), translator_); } -template <class Traits> -std::unique_ptr<ReferenceWriter> DisassemblerWin32<Traits>::MakeWriteRel32( +template <class TRAITS> +std::unique_ptr<ReferenceWriter> DisassemblerWin32<TRAITS>::MakeWriteRel32( MutableBufferView image) { return std::make_unique<Rel32WriterX86>(image, translator_); } -template <class Traits> -bool DisassemblerWin32<Traits>::Parse(ConstBufferView image) { +template <class TRAITS> +bool DisassemblerWin32<TRAITS>::Parse(ConstBufferView image) { image_ = image; return ParseHeader(); } -template <class Traits> -bool DisassemblerWin32<Traits>::ParseHeader() { +template <class TRAITS> +bool DisassemblerWin32<TRAITS>::ParseHeader() { BufferSource source; - if (!ReadWin32Header<Traits>(image_, &source)) + if (!ReadWin32Header(image_, &source)) return false; constexpr size_t kDataDirBase = @@ -297,8 +296,8 @@ bool DisassemblerWin32<Traits>::ParseHeader() { return true; } -template <class Traits> -bool DisassemblerWin32<Traits>::ParseAndStoreRelocBlocks() { +template <class TRAITS> +bool DisassemblerWin32<TRAITS>::ParseAndStoreRelocBlocks() { if (has_parsed_relocs_) return reloc_region_.lo() != kInvalidOffset; @@ -324,8 +323,8 @@ bool DisassemblerWin32<Traits>::ParseAndStoreRelocBlocks() { return true; } -template <class Traits> -bool DisassemblerWin32<Traits>::ParseAndStoreAbs32() { +template <class TRAITS> +bool DisassemblerWin32<TRAITS>::ParseAndStoreAbs32() { if (has_parsed_abs32_) return true; has_parsed_abs32_ = true; @@ -355,8 +354,8 @@ bool DisassemblerWin32<Traits>::ParseAndStoreAbs32() { return true; } -template <class Traits> -bool DisassemblerWin32<Traits>::ParseAndStoreRel32() { +template <class TRAITS> +bool DisassemblerWin32<TRAITS>::ParseAndStoreRel32() { if (has_parsed_rel32_) return true; has_parsed_rel32_ = true; |