diff options
Diffstat (limited to 'tools/relocation_packer/src/delta_encoder.h')
-rw-r--r-- | tools/relocation_packer/src/delta_encoder.h | 132 |
1 files changed, 0 insertions, 132 deletions
diff --git a/tools/relocation_packer/src/delta_encoder.h b/tools/relocation_packer/src/delta_encoder.h deleted file mode 100644 index 46c324c49..000000000 --- a/tools/relocation_packer/src/delta_encoder.h +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Delta encode and decode REL/RELA section of elf file. -// -// The encoded data format is sequence of elements of ElfAddr type (unsigned long): -// -// [00] relocation_count - the total count of relocations -// [01] initial r_offset - this is initial r_offset for the -// relocation table. -// followed by group structures: -// [02] group -// ... -// [nn] group - -// the generalized format of the group is (! - always present ? - depends on group_flags): -// -------------- -// ! group_size -// ! group_flags -// ? group_r_offset_delta when RELOCATION_GROUPED_BY_OFFSET_DELTA flag is set -// ? group_r_info when RELOCATION_GROUPED_BY_INFO flag is set -// ? group_r_addend_group_delta when RELOCATION_GROUP_HAS_ADDEND and RELOCATION_GROUPED_BY_ADDEND -// flag is set -// -// The group description is followed by individual relocations. -// please note that there is a case when individual relocation -// section could be empty - that is if every field ends up grouped. -// -// The format for individual relocations section is: -// ? r_offset_delta - when RELOCATION_GROUPED_BY_OFFSET_DELTA is not set -// ? r_info - when RELOCATION_GROUPED_BY_INFO flag is not set -// ? r_addend_delta - RELOCATION_GROUP_HAS_ADDEND is set and RELOCATION_GROUPED_BY_ADDEND is not set -// -// For example lets pack the following relocations: -// -// Relocation section '.rela.dyn' at offset 0xbf58 contains 939 entries: -// Offset Info Type Symbol's Value Symbol's Name + Addend -// 00000000000a2178 0000000000000403 R_AARCH64_RELATIVE 177a8 -// 00000000000a2180 0000000000000403 R_AARCH64_RELATIVE 177cc -// 00000000000a2188 0000000000000403 R_AARCH64_RELATIVE 177e0 -// 00000000000a2190 0000000000000403 R_AARCH64_RELATIVE 177f4 -// 00000000000a2198 0000000000000403 R_AARCH64_RELATIVE 17804 -// 00000000000a21a0 0000000000000403 R_AARCH64_RELATIVE 17818 -// 00000000000a21a8 0000000000000403 R_AARCH64_RELATIVE 1782c -// 00000000000a21b0 0000000000000403 R_AARCH64_RELATIVE 17840 -// 00000000000a21b8 0000000000000403 R_AARCH64_RELATIVE 17854 -// 00000000000a21c0 0000000000000403 R_AARCH64_RELATIVE 17868 -// 00000000000a21c8 0000000000000403 R_AARCH64_RELATIVE 1787c -// 00000000000a21d0 0000000000000403 R_AARCH64_RELATIVE 17890 -// 00000000000a21d8 0000000000000403 R_AARCH64_RELATIVE 178a4 -// 00000000000a21e8 0000000000000403 R_AARCH64_RELATIVE 178b8 -// -// The header is going to be -// [00] 14 <- count -// [01] 0x00000000000a2170 <- initial relocation (first relocation - delta, -// the delta is 8 in this case) -// -- starting the first and only group -// [03] 14 <- group size -// [03] 0xb <- flags RELOCATION_GROUP_HAS_ADDEND | RELOCATION_GROUPED_BY_OFFSET_DELTA -// | RELOCATION_GROUPED_BY_INFO -// [04] 8 <- offset delta -// [05] 0x403 <- r_info -// -- end of group definition, starting list of r_addend deltas -// [06] 0x177a8 -// [07] 0x24 = 177cc - 177a8 -// [08] 0x14 = 177e0 - 177cc -// [09] 0x14 = 177f4 - 177e0 -// [10] 0x10 = 17804 - 177f4 -// [11] 0x14 = 17818 - 17804 -// [12] 0x14 = 1782c - 17818 -// [13] 0x14 = 17840 - 1782c -// [14] 0x14 = 17854 - 17840 -// [15] 0x14 = 17868 - 17854 -// [16] 0x14 = 1787c - 17868 -// [17] 0x14 = 17890 - 1787c -// [18] 0x14 = 178a4 - 17890 -// [19] 0x14 = 178b8 - 178a4 -// -- the end. - -// TODO (dimitry): consider using r_addend_group_delta in the way we use group offset delta, it can -// save us more bytes... - -// The input ends when sum(group_size) == relocation_count - -#ifndef TOOLS_RELOCATION_PACKER_SRC_DELTA_ENCODER_H_ -#define TOOLS_RELOCATION_PACKER_SRC_DELTA_ENCODER_H_ - -#include <vector> - -#include "elf.h" -#include "elf_traits.h" - -namespace relocation_packer { - -// A RelocationDeltaCodec packs vectors of relative relocations with -// addends into more compact forms, and unpacks them to reproduce the -// pre-packed data. -template <typename ELF> -class RelocationDeltaCodec { - public: - typedef typename ELF::Addr ElfAddr; - typedef typename ELF::Rela ElfRela; - - // Encode relocations with addends into a more compact form. - // |relocations| is a vector of relative relocation with addend structs. - // |packed| is the vector of packed words into which relocations are packed. - static void Encode(const std::vector<ElfRela>& relocations, - std::vector<ElfAddr>* packed); - - // Decode relative relocations with addends from their more compact form. - // |packed| is the vector of packed relocations. - // |relocations| is a vector of unpacked relative relocations. - static void Decode(const std::vector<ElfAddr>& packed, - std::vector<ElfRela>* relocations); - - private: - static void DetectGroup(const std::vector<ElfRela>& relocations, - size_t group_starts_with, ElfAddr previous_offset, - ElfAddr* group_size, ElfAddr* group_flags, - ElfAddr* group_offset_delta, ElfAddr* group_info, - ElfAddr* group_addend); - - static void DetectGroupFields(const ElfRela& reloc_one, const ElfRela& reloc_two, - ElfAddr current_offset_delta, ElfAddr* group_flags, - ElfAddr* group_offset_delta, ElfAddr* group_info, - ElfAddr* group_addend); -}; - -} // namespace relocation_packer - -#endif // TOOLS_RELOCATION_PACKER_SRC_DELTA_ENCODER_H_ |