Theodosius v3.0
Jit linker, symbol mapper, and obfuscator
reloc.hpp
Go to the documentation of this file.
1// Copyright (c) 2022, _xeroxz
2// All rights reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions are met:
6//
7// 1. Redistributions of source code must retain the above copyright notice,
8// this list of conditions and the following disclaimer.
9//
10// 2. Redistributions in binary form must reproduce the above copyright notice,
11// this list of conditions and the following disclaimer in the documentation
12// and/or other materials provided with the distribution.
13//
14// 3. Neither the name of the copyright holder nor the names of its
15// contributors may be used to endorse or promote products derived from
16// this software without specific prior written permission.
17//
18// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28// POSSIBILITY OF SUCH DAMAGE.
29//
30
31#pragma once
32#include <cstddef>
33#include <cstdint>
35
36namespace theo::recomp {
37
38/// <summary>
39/// meta data about a relocation for a symbol
40/// </summary>
41class reloc_t {
42 public:
43 /// <summary>
44 /// explicit constructor for this class.
45 /// </summary>
46 /// <param name="offset">offset into the symbol data where the relocation is
47 /// at. all relocations are assumed to be linear virtual addresses of the
48 /// symbol.</param>
49 /// <param name="hash">hash of the symbol to which the relocation is
50 /// of.</param> <param name="sym_name">the name of the symbol to which the
51 /// relocation is of.</param>
52 explicit reloc_t(std::uint32_t offset,
53 std::size_t hash,
54 const std::string&& sym_name)
55 : m_offset(offset), m_hash(hash), m_sym_name(sym_name) {}
56
57 /// <summary>
58 /// returns the hash of the relocation symbol.
59 /// </summary>
60 /// <returns>hash of the relocation symbol</returns>
61 std::size_t hash() { return m_hash; }
62
63 /// <summary>
64 /// returns the name of the relocation symbol.
65 /// </summary>
66 /// <returns>returns the name of the relocation symbol.</returns>
67 std::string name() { return m_sym_name; }
68
69 /// <summary>
70 /// returns the offset into the symbol to which the relocation will be
71 /// applied. the offset is in bytes. zero based.
72 /// </summary>
73 /// <returns>returns the offset into the symbol to which the relocation will
74 /// be applied. the offset is in bytes. zero based.</returns>
75 std::uint32_t offset() { return m_offset; }
76
77 /// <summary>
78 /// sets the offset to which the relocation gets applied too.
79 /// </summary>
80 /// <param name="offset">offset to which the relocation gets applied
81 /// too.</param>
82 void offset(std::uint32_t offset) { m_offset = offset; }
83
84 /// <summary>
85 /// adds a transformation to be applied to the relocation prior to writing it
86 /// into the symbol.
87 /// </summary>
88 /// <param name="entry">a pair containing a lambda function that when executed
89 /// transforms a relocation. the second value in the pair is a random value
90 /// which is passed to the lambda.</param>
92 std::pair<obf::transform::transform_t*, std::uint32_t> entry) {
93 m_transforms.push_back(entry);
94 }
95
96 /// <summary>
97 /// gets the vector of transformation.
98 /// </summary>
99 /// <returns>returns the vector of transformations.</returns>
100 std::vector<std::pair<obf::transform::transform_t*, std::uint32_t>>&
102 return m_transforms;
103 }
104
105 private:
106 std::vector<std::pair<obf::transform::transform_t*, std::uint32_t>>
107 m_transforms;
108 std::string m_sym_name;
109 std::size_t m_hash;
110 std::uint32_t m_offset;
111};
112} // namespace theo::recomp