| Index: tools/relocation_packer/src/elf_file.cc
|
| diff --git a/tools/relocation_packer/src/elf_file.cc b/tools/relocation_packer/src/elf_file.cc
|
| index 62c390a2bde39232462df9ef2858cc293005c4b4..3ffccecd7c4bc4d87a34194f7416b04b141524ee 100644
|
| --- a/tools/relocation_packer/src/elf_file.cc
|
| +++ b/tools/relocation_packer/src/elf_file.cc
|
| @@ -71,9 +71,10 @@ Elf_Data* GetSectionData(Elf_Scn* section) {
|
|
|
| // Rewrite section data. Allocates new data and makes it the data element's
|
| // buffer. Relies on program exit to free allocated data.
|
| -void RewriteSectionData(Elf_Data* data,
|
| +void RewriteSectionData(Elf_Scn* section,
|
| const void* section_data,
|
| size_t size) {
|
| + Elf_Data* data = GetSectionData(section);
|
| CHECK(size == data->d_size);
|
| uint8_t* area = new uint8_t[size];
|
| memcpy(area, section_data, size);
|
| @@ -797,7 +798,7 @@ void AdjustDynamicSectionForHole(Elf_Scn* dynamic_section,
|
|
|
| void* section_data = &dynamics[0];
|
| size_t bytes = dynamics.size() * sizeof(dynamics[0]);
|
| - RewriteSectionData(data, section_data, bytes);
|
| + RewriteSectionData(dynamic_section, section_data, bytes);
|
| }
|
|
|
| // Resize a section. If the new size is larger than the current size, open
|
| @@ -952,7 +953,7 @@ bool ElfFile::PackRelocations() {
|
| relocations_base + data->d_size / sizeof(relocations[0]));
|
|
|
| LOG(INFO) << "Relocations : REL";
|
| - return PackTypedRelocations<ELF::Rel>(relocations, data);
|
| + return PackTypedRelocations<ELF::Rel>(relocations);
|
| }
|
|
|
| if (relocations_type_ == RELA) {
|
| @@ -964,7 +965,7 @@ bool ElfFile::PackRelocations() {
|
| relocations_base + data->d_size / sizeof(relocations[0]));
|
|
|
| LOG(INFO) << "Relocations : RELA";
|
| - return PackTypedRelocations<ELF::Rela>(relocations, data);
|
| + return PackTypedRelocations<ELF::Rela>(relocations);
|
| }
|
|
|
| NOTREACHED();
|
| @@ -973,8 +974,7 @@ bool ElfFile::PackRelocations() {
|
|
|
| // Helper for PackRelocations(). Rel type is one of ELF::Rel or ELF::Rela.
|
| template <typename Rel>
|
| -bool ElfFile::PackTypedRelocations(const std::vector<Rel>& relocations,
|
| - Elf_Data* data) {
|
| +bool ElfFile::PackTypedRelocations(const std::vector<Rel>& relocations) {
|
| // Filter relocations into those that are relative and others.
|
| std::vector<Rel> relative_relocations;
|
| std::vector<Rel> other_relocations;
|
| @@ -1085,17 +1085,16 @@ bool ElfFile::PackTypedRelocations(const std::vector<Rel>& relocations,
|
| const void* section_data = &other_relocations[0];
|
| const size_t bytes = other_relocations.size() * sizeof(other_relocations[0]);
|
| ResizeSection<Rel>(elf_, relocations_section_, bytes);
|
| - RewriteSectionData(data, section_data, bytes);
|
| + RewriteSectionData(relocations_section_, section_data, bytes);
|
|
|
| // Rewrite the current packed android relocations section to hold the packed
|
| // relative relocations.
|
| - data = GetSectionData(android_relocations_section_);
|
| ResizeSection<Rel>(elf_, android_relocations_section_, packed_bytes);
|
| - RewriteSectionData(data, packed_data, packed_bytes);
|
| + RewriteSectionData(android_relocations_section_, packed_data, packed_bytes);
|
|
|
| // Rewrite .dynamic to include two new tags describing the packed android
|
| // relocations.
|
| - data = GetSectionData(dynamic_section_);
|
| + Elf_Data* data = GetSectionData(dynamic_section_);
|
| const ELF::Dyn* dynamic_base = reinterpret_cast<ELF::Dyn*>(data->d_buf);
|
| std::vector<ELF::Dyn> dynamics(
|
| dynamic_base,
|
| @@ -1116,7 +1115,7 @@ bool ElfFile::PackTypedRelocations(const std::vector<Rel>& relocations,
|
| }
|
| const void* dynamics_data = &dynamics[0];
|
| const size_t dynamics_bytes = dynamics.size() * sizeof(dynamics[0]);
|
| - RewriteSectionData(data, dynamics_data, dynamics_bytes);
|
| + RewriteSectionData(dynamic_section_, dynamics_data, dynamics_bytes);
|
|
|
| Flush();
|
| return true;
|
| @@ -1149,7 +1148,7 @@ bool ElfFile::UnpackRelocations() {
|
| // Signature is APR1, unpack relocations.
|
| CHECK(relocations_type_ == REL);
|
| LOG(INFO) << "Relocations : REL";
|
| - return UnpackTypedRelocations<ELF::Rel>(packed, data);
|
| + return UnpackTypedRelocations<ELF::Rel>(packed);
|
| }
|
|
|
| if (packed.size() > 3 &&
|
| @@ -1160,7 +1159,7 @@ bool ElfFile::UnpackRelocations() {
|
| // Signature is APA1, unpack relocations with addends.
|
| CHECK(relocations_type_ == RELA);
|
| LOG(INFO) << "Relocations : RELA";
|
| - return UnpackTypedRelocations<ELF::Rela>(packed, data);
|
| + return UnpackTypedRelocations<ELF::Rela>(packed);
|
| }
|
|
|
| LOG(ERROR) << "Packed relative relocations not found (not packed?)";
|
| @@ -1169,8 +1168,7 @@ bool ElfFile::UnpackRelocations() {
|
|
|
| // Helper for UnpackRelocations(). Rel type is one of ELF::Rel or ELF::Rela.
|
| template <typename Rel>
|
| -bool ElfFile::UnpackTypedRelocations(const std::vector<uint8_t>& packed,
|
| - Elf_Data* data) {
|
| +bool ElfFile::UnpackTypedRelocations(const std::vector<uint8_t>& packed) {
|
| // Unpack the data to re-materialize the relative relocations.
|
| const size_t packed_bytes = packed.size() * sizeof(packed[0]);
|
| LOG(INFO) << "Packed relative: " << packed_bytes << " bytes";
|
| @@ -1182,7 +1180,7 @@ bool ElfFile::UnpackTypedRelocations(const std::vector<uint8_t>& packed,
|
| LOG(INFO) << "Unpacked relative: " << unpacked_bytes << " bytes";
|
|
|
| // Retrieve the current dynamic relocations section data.
|
| - data = GetSectionData(relocations_section_);
|
| + Elf_Data* data = GetSectionData(relocations_section_);
|
|
|
| // Interpret data as relocations.
|
| const Rel* relocations_base = reinterpret_cast<Rel*>(data->d_buf);
|
| @@ -1234,17 +1232,17 @@ bool ElfFile::UnpackTypedRelocations(const std::vector<uint8_t>& packed,
|
| const size_t bytes = relocations.size() * sizeof(relocations[0]);
|
| LOG(INFO) << "Total : " << relocations.size() << " entries";
|
| ResizeSection<Rel>(elf_, relocations_section_, bytes);
|
| - RewriteSectionData(data, section_data, bytes);
|
| + RewriteSectionData(relocations_section_, section_data, bytes);
|
|
|
| // Nearly empty the current packed android relocations section. Leaves a
|
| // four-byte stub so that some data remains allocated to the section.
|
| // This is a convenience which allows us to re-pack this file again without
|
| // having to remove the section and then add a new small one with objcopy.
|
| // The way we resize sections relies on there being some data in a section.
|
| - data = GetSectionData(android_relocations_section_);
|
| ResizeSection<Rel>(
|
| elf_, android_relocations_section_, sizeof(kStubIdentifier));
|
| - RewriteSectionData(data, &kStubIdentifier, sizeof(kStubIdentifier));
|
| + RewriteSectionData(
|
| + android_relocations_section_, &kStubIdentifier, sizeof(kStubIdentifier));
|
|
|
| // Rewrite .dynamic to remove two tags describing packed android relocations.
|
| data = GetSectionData(dynamic_section_);
|
| @@ -1256,7 +1254,7 @@ bool ElfFile::UnpackTypedRelocations(const std::vector<uint8_t>& packed,
|
| RemoveDynamicEntry(DT_ANDROID_REL_SIZE, &dynamics);
|
| const void* dynamics_data = &dynamics[0];
|
| const size_t dynamics_bytes = dynamics.size() * sizeof(dynamics[0]);
|
| - RewriteSectionData(data, dynamics_data, dynamics_bytes);
|
| + RewriteSectionData(dynamic_section_, dynamics_data, dynamics_bytes);
|
|
|
| Flush();
|
| return true;
|
|
|