Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "courgette/disassembler_elf_32.h" | 5 #include "courgette/disassembler_elf_32.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "courgette/assembly_program.h" | 10 #include "courgette/assembly_program.h" |
| (...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 266 for (RVA rva : rvas) { | 266 for (RVA rva : rvas) { |
| 267 FileOffset file_offset = RVAToFileOffset(rva); | 267 FileOffset file_offset = RVAToFileOffset(rva); |
| 268 if (file_offset == kNoFileOffset) | 268 if (file_offset == kNoFileOffset) |
| 269 return false; | 269 return false; |
| 270 file_offsets->push_back(file_offset); | 270 file_offsets->push_back(file_offset); |
| 271 } | 271 } |
| 272 return true; | 272 return true; |
| 273 } | 273 } |
| 274 | 274 |
| 275 CheckBool DisassemblerElf32::RVAsToFileOffsets( | 275 CheckBool DisassemblerElf32::RVAsToFileOffsets( |
| 276 ScopedVector<TypedRVA>* typed_rvas) { | 276 std::vector<std::unique_ptr<TypedRVA>>* typed_rvas) { |
| 277 for (TypedRVA* typed_rva : *typed_rvas) { | 277 for (auto& typed_rva : *typed_rvas) { |
| 278 FileOffset file_offset = RVAToFileOffset(typed_rva->rva()); | 278 FileOffset file_offset = RVAToFileOffset(typed_rva->rva()); |
| 279 if (file_offset == kNoFileOffset) | 279 if (file_offset == kNoFileOffset) |
| 280 return false; | 280 return false; |
| 281 typed_rva->set_file_offset(file_offset); | 281 typed_rva->set_file_offset(file_offset); |
| 282 } | 282 } |
| 283 return true; | 283 return true; |
| 284 } | 284 } |
| 285 | 285 |
| 286 CheckBool DisassemblerElf32::ParseFile(AssemblyProgram* program) { | 286 CheckBool DisassemblerElf32::ParseFile(AssemblyProgram* program) { |
| 287 // Walk all the bytes in the file, whether or not in a section. | 287 // Walk all the bytes in the file, whether or not in a section. |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 298 | 298 |
| 299 if (!RVAsToFileOffsets(&rel32_locations_)) | 299 if (!RVAsToFileOffsets(&rel32_locations_)) |
| 300 return false; | 300 return false; |
| 301 std::sort(rel32_locations_.begin(), | 301 std::sort(rel32_locations_.begin(), |
| 302 rel32_locations_.end(), | 302 rel32_locations_.end(), |
| 303 TypedRVA::IsLessThanByFileOffset); | 303 TypedRVA::IsLessThanByFileOffset); |
| 304 | 304 |
| 305 std::vector<FileOffset>::iterator current_abs_offset = abs_offsets.begin(); | 305 std::vector<FileOffset>::iterator current_abs_offset = abs_offsets.begin(); |
| 306 std::vector<FileOffset>::iterator end_abs_offset = abs_offsets.end(); | 306 std::vector<FileOffset>::iterator end_abs_offset = abs_offsets.end(); |
| 307 | 307 |
| 308 ScopedVector<TypedRVA>::iterator current_rel = rel32_locations_.begin(); | 308 auto current_rel = rel32_locations_.begin(); |
|
huangs
2016/05/11 04:49:23
More consistent to keep at
std::vector<std::uniqe_
etiennep
2016/05/11 18:19:12
Done.
| |
| 309 ScopedVector<TypedRVA>::iterator end_rel = rel32_locations_.end(); | 309 auto end_rel = rel32_locations_.end(); |
| 310 | 310 |
| 311 // Visit section headers ordered by file offset. | 311 // Visit section headers ordered by file offset. |
| 312 for (Elf32_Half section_id : section_header_file_offset_order_) { | 312 for (Elf32_Half section_id : section_header_file_offset_order_) { |
| 313 const Elf32_Shdr* section_header = SectionHeader(section_id); | 313 const Elf32_Shdr* section_header = SectionHeader(section_id); |
| 314 | 314 |
| 315 if (section_header->sh_type == SHT_NOBITS) | 315 if (section_header->sh_type == SHT_NOBITS) |
| 316 continue; | 316 continue; |
| 317 | 317 |
| 318 if (!ParseSimpleRegion(file_offset, section_header->sh_offset, program)) | 318 if (!ParseSimpleRegion(file_offset, section_header->sh_offset, program)) |
| 319 return false; | 319 return false; |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 367 return false; | 367 return false; |
| 368 | 368 |
| 369 // Make certain we consume all of the relocations as expected | 369 // Make certain we consume all of the relocations as expected |
| 370 return (current_abs_offset == end_abs_offset); | 370 return (current_abs_offset == end_abs_offset); |
| 371 } | 371 } |
| 372 | 372 |
| 373 CheckBool DisassemblerElf32::ParseProgbitsSection( | 373 CheckBool DisassemblerElf32::ParseProgbitsSection( |
| 374 const Elf32_Shdr* section_header, | 374 const Elf32_Shdr* section_header, |
| 375 std::vector<FileOffset>::iterator* current_abs_offset, | 375 std::vector<FileOffset>::iterator* current_abs_offset, |
| 376 std::vector<FileOffset>::iterator end_abs_offset, | 376 std::vector<FileOffset>::iterator end_abs_offset, |
| 377 ScopedVector<TypedRVA>::iterator* current_rel, | 377 std::vector<std::unique_ptr<TypedRVA>>::iterator* current_rel, |
| 378 ScopedVector<TypedRVA>::iterator end_rel, | 378 std::vector<std::unique_ptr<TypedRVA>>::iterator end_rel, |
| 379 AssemblyProgram* program) { | 379 AssemblyProgram* program) { |
| 380 // Walk all the bytes in the file, whether or not in a section. | 380 // Walk all the bytes in the file, whether or not in a section. |
| 381 FileOffset file_offset = section_header->sh_offset; | 381 FileOffset file_offset = section_header->sh_offset; |
| 382 FileOffset section_end = section_header->sh_offset + section_header->sh_size; | 382 FileOffset section_end = section_header->sh_offset + section_header->sh_size; |
| 383 | 383 |
| 384 Elf32_Addr origin = section_header->sh_addr; | 384 Elf32_Addr origin = section_header->sh_addr; |
| 385 FileOffset origin_offset = section_header->sh_offset; | 385 FileOffset origin_offset = section_header->sh_offset; |
| 386 if (!program->EmitOriginInstruction(origin)) | 386 if (!program->EmitOriginInstruction(origin)) |
| 387 return false; | 387 return false; |
| 388 | 388 |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 548 if (!ParseRel32RelocsFromSection(section_header)) | 548 if (!ParseRel32RelocsFromSection(section_header)) |
| 549 return false; | 549 return false; |
| 550 } | 550 } |
| 551 if (!found_rel32) | 551 if (!found_rel32) |
| 552 VLOG(1) << "Warning: Found no rel32 addresses. Missing .text section?"; | 552 VLOG(1) << "Warning: Found no rel32 addresses. Missing .text section?"; |
| 553 | 553 |
| 554 return true; | 554 return true; |
| 555 } | 555 } |
| 556 | 556 |
| 557 } // namespace courgette | 557 } // namespace courgette |
| OLD | NEW |