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

Unified Diff: courgette/disassembler_elf_32.cc

Issue 2728653003: [Courgette] Disassembler code movement and format fix. (Closed)
Patch Set: Created 3 years, 10 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 | « courgette/disassembler_elf_32.h ('k') | courgette/disassembler_win32.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: courgette/disassembler_elf_32.cc
diff --git a/courgette/disassembler_elf_32.cc b/courgette/disassembler_elf_32.cc
index b1c3f0bde06a412c1d1776b815f3bfacce8de188..e305b4ce74197100c8d0235027cb791bfbb3d1b9 100644
--- a/courgette/disassembler_elf_32.cc
+++ b/courgette/disassembler_elf_32.cc
@@ -323,6 +323,70 @@ CheckBool DisassemblerElf32::RVAsToFileOffsets(
return true;
}
+CheckBool DisassemblerElf32::ParseAbs32Relocs() {
+ abs32_locations_.clear();
+
+ // Loop through sections for relocation sections
+ for (Elf32_Half section_id = 0; section_id < SectionHeaderCount();
+ ++section_id) {
+ const Elf32_Shdr* section_header = SectionHeader(section_id);
+
+ if (section_header->sh_type == SHT_REL) {
+ const Elf32_Rel* relocs_table =
+ reinterpret_cast<const Elf32_Rel*>(SectionBody(section_id));
+
+ int relocs_table_count =
+ section_header->sh_size / section_header->sh_entsize;
+
+ // Elf32_Word relocation_section_id = section_header->sh_info;
+
+ // Loop through relocation objects in the relocation section
+ for (int rel_id = 0; rel_id < relocs_table_count; ++rel_id) {
+ RVA rva;
+
+ // Quite a few of these conversions fail, and we simply skip
+ // them, that's okay.
+ if (RelToRVA(relocs_table[rel_id], &rva) && CheckSection(rva))
+ abs32_locations_.push_back(rva);
+ }
+ }
+ }
+
+ std::sort(abs32_locations_.begin(), abs32_locations_.end());
+ DCHECK(abs32_locations_.empty() || abs32_locations_.back() != kUnassignedRVA);
+ return true;
+}
+
+CheckBool DisassemblerElf32::ParseRel32RelocsFromSections() {
+ rel32_locations_.clear();
+ bool found_rel32 = false;
+
+ // Loop through sections for relocation sections
+ for (Elf32_Half section_id = 0; section_id < SectionHeaderCount();
+ ++section_id) {
+ const Elf32_Shdr* section_header = SectionHeader(section_id);
+
+ // Some debug sections can have sh_type=SHT_PROGBITS but sh_addr=0.
+ if (section_header->sh_type != SHT_PROGBITS || section_header->sh_addr == 0)
+ continue;
+
+ // Heuristic: Only consider ".text" section.
+ std::string section_name;
+ if (!SectionName(*section_header, &section_name))
+ return false;
+ if (section_name != ".text")
+ continue;
+
+ found_rel32 = true;
+ if (!ParseRel32RelocsFromSection(section_header))
+ return false;
+ }
+ if (!found_rel32)
+ VLOG(1) << "Warning: Found no rel32 addresses. Missing .text section?";
+
+ return true;
+}
+
RvaVisitor* DisassemblerElf32::CreateAbs32TargetRvaVisitor() {
return new RvaVisitor_Abs32(abs32_locations_, *this);
}
@@ -541,41 +605,6 @@ CheckBool DisassemblerElf32::ParseSimpleRegion(
return true;
}
-CheckBool DisassemblerElf32::ParseAbs32Relocs() {
- abs32_locations_.clear();
-
- // Loop through sections for relocation sections
- for (Elf32_Half section_id = 0; section_id < SectionHeaderCount();
- ++section_id) {
- const Elf32_Shdr* section_header = SectionHeader(section_id);
-
- if (section_header->sh_type == SHT_REL) {
- const Elf32_Rel* relocs_table =
- reinterpret_cast<const Elf32_Rel*>(SectionBody(section_id));
-
- int relocs_table_count = section_header->sh_size /
- section_header->sh_entsize;
-
- // Elf32_Word relocation_section_id = section_header->sh_info;
-
- // Loop through relocation objects in the relocation section
- for (int rel_id = 0; rel_id < relocs_table_count; ++rel_id) {
- RVA rva;
-
- // Quite a few of these conversions fail, and we simply skip
- // them, that's okay.
- if (RelToRVA(relocs_table[rel_id], &rva) && CheckSection(rva))
- abs32_locations_.push_back(rva);
- }
- }
- }
-
- std::sort(abs32_locations_.begin(), abs32_locations_.end());
- DCHECK(abs32_locations_.empty() ||
- abs32_locations_.back() != kUnassignedRVA);
- return true;
-}
-
CheckBool DisassemblerElf32::CheckSection(RVA rva) {
FileOffset file_offset = RVAToFileOffset(rva);
if (file_offset == kNoFileOffset)
@@ -598,35 +627,4 @@ CheckBool DisassemblerElf32::CheckSection(RVA rva) {
return false;
}
-CheckBool DisassemblerElf32::ParseRel32RelocsFromSections() {
- rel32_locations_.clear();
- bool found_rel32 = false;
-
- // Loop through sections for relocation sections
- for (Elf32_Half section_id = 0; section_id < SectionHeaderCount();
- ++section_id) {
- const Elf32_Shdr* section_header = SectionHeader(section_id);
-
- // Some debug sections can have sh_type=SHT_PROGBITS but sh_addr=0.
- if (section_header->sh_type != SHT_PROGBITS ||
- section_header->sh_addr == 0)
- continue;
-
- // Heuristic: Only consider ".text" section.
- std::string section_name;
- if (!SectionName(*section_header, &section_name))
- return false;
- if (section_name != ".text")
- continue;
-
- found_rel32 = true;
- if (!ParseRel32RelocsFromSection(section_header))
- return false;
- }
- if (!found_rel32)
- VLOG(1) << "Warning: Found no rel32 addresses. Missing .text section?";
-
- return true;
-}
-
} // namespace courgette
« no previous file with comments | « courgette/disassembler_elf_32.h ('k') | courgette/disassembler_win32.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698