aboutsummaryrefslogtreecommitdiff
path: root/element_detection.cc
diff options
context:
space:
mode:
authorSamuel Huang <huangs@chromium.org>2021-08-05 16:46:38 +0000
committerCopybara-Service <copybara-worker@google.com>2021-08-05 10:05:02 -0700
commitfa10b05c4854c6d8a603ee47c2a213cbc23f8646 (patch)
tree94ad9d794dedc26bd0e0be4b18511d45026a0b98 /element_detection.cc
parent3e1f64d1395c53a730475d930b663d5f6006099e (diff)
downloadzucchini-fa10b05c4854c6d8a603ee47c2a213cbc23f8646.tar.gz
[Zucchini] Add ARM support for ELF files.
This CL enables ARM-ELF (AArch32 and AArch64) support in Zucchini. * Define ARM {AArch32, AArch64}ReferenceType. * Add Rel32Finder{Arm, AArch32, AArch64} (with tests) to use previously-added ARM disassembly code to extract rel32 references. * Add DisassemblerElf{Arm, AArch32, AArch64} to parse ARM ELF files and create reference readers / writers, and reference groups. * For AArch32: Add heuristic detection of ARM vs. Thumb2 mode. * Add IsTargetOffsetInElfSectionList() (with tests) to help ARM reject false positive references. * Add ReferenceBytesMixerElfArm to remove redundant reference target information from bytewise correction data. Bug: 918867 Change-Id: I1e6d3d8b8d174c85a3d44ca6d642b7ff0bd6a6a6 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2922822 Commit-Queue: Samuel Huang <huangs@chromium.org> Reviewed-by: Etienne Pierre-Doray <etiennep@chromium.org> Cr-Commit-Position: refs/heads/master@{#908913} NOKEYCHECK=True GitOrigin-RevId: 85cc8a596f183487b395a59e80b2f654f241ab2c
Diffstat (limited to 'element_detection.cc')
-rw-r--r--element_detection.cc16
1 files changed, 16 insertions, 0 deletions
diff --git a/element_detection.cc b/element_detection.cc
index 8682c78..356c0d7 100644
--- a/element_detection.cc
+++ b/element_detection.cc
@@ -65,6 +65,18 @@ std::unique_ptr<Disassembler> MakeDisassemblerWithoutFallback(
if (disasm && disasm->size() >= kMinProgramSize)
return disasm;
}
+
+ if (DisassemblerElfAArch32::QuickDetect(image)) {
+ auto disasm = Disassembler::Make<DisassemblerElfAArch32>(image);
+ if (disasm && disasm->size() >= kMinProgramSize)
+ return disasm;
+ }
+
+ if (DisassemblerElfAArch64::QuickDetect(image)) {
+ auto disasm = Disassembler::Make<DisassemblerElfAArch64>(image);
+ if (disasm && disasm->size() >= kMinProgramSize)
+ return disasm;
+ }
#endif // BUILDFLAG(ENABLE_ELF)
#if BUILDFLAG(ENABLE_DEX)
@@ -101,6 +113,10 @@ std::unique_ptr<Disassembler> MakeDisassemblerOfType(ConstBufferView image,
return Disassembler::Make<DisassemblerElfX86>(image);
case kExeTypeElfX64:
return Disassembler::Make<DisassemblerElfX64>(image);
+ case kExeTypeElfAArch32:
+ return Disassembler::Make<DisassemblerElfAArch32>(image);
+ case kExeTypeElfAArch64:
+ return Disassembler::Make<DisassemblerElfAArch64>(image);
#endif // BUILDFLAG(ENABLE_ELF)
#if BUILDFLAG(ENABLE_DEX)
case kExeTypeDex: