Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
CTCaer
GitHub Repository: CTCaer/hekate
Path: blob/master/bdk/ianos/elfload/elfreloc_aarch64.c
1476 views
1
/*
2
* Copyright © 2014, Owen Shepherd
3
*
4
* Permission to use, copy, modify, and/or distribute this software for any
5
* purpose with or without fee is hereby granted, provided that the above
6
* copyright notice appear in all copies.
7
*
8
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
9
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10
* AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
* PERFORMANCE OF THIS SOFTWARE.
15
*/
16
17
#include "elfload.h"
18
19
#if defined(__aarch64__)
20
21
#define R_AARCH64_NONE 0
22
#define R_AARCH64_RELATIVE 1027
23
24
el_status el_applyrela(el_ctx *ctx, Elf_RelA *rel)
25
{
26
uptr *p = (uptr *)(rel->r_offset + ctx->base_load_paddr);
27
u32 type = ELF_R_TYPE(rel->r_info);
28
u32 sym = ELF_R_SYM(rel->r_info);
29
30
switch (type)
31
{
32
case R_AARCH64_NONE:
33
EL_DEBUG("R_AARCH64_NONE\n");
34
break;
35
case R_AARCH64_RELATIVE:
36
if (sym)
37
{
38
EL_DEBUG("R_AARCH64_RELATIVE with symbol ref!\n");
39
return EL_BADREL;
40
}
41
42
EL_DEBUG("Applying R_AARCH64_RELATIVE reloc @%p\n", p);
43
*p = rel->r_addend + ctx->base_load_vaddr;
44
break;
45
46
default:
47
EL_DEBUG("Bad relocation %u\n", type);
48
return EL_BADREL;
49
}
50
51
return EL_OK;
52
}
53
54
el_status el_applyrel(el_ctx *ctx, Elf_Rel *rel)
55
{
56
uptr *p = (uptr *)(rel->r_offset + ctx->base_load_paddr);
57
u32 type = ELF_R_TYPE(rel->r_info);
58
u32 sym = ELF_R_SYM(rel->r_info);
59
60
switch (type)
61
{
62
case R_AARCH64_NONE:
63
EL_DEBUG("R_AARCH64_NONE\n");
64
break;
65
case R_AARCH64_RELATIVE:
66
if (sym)
67
{
68
EL_DEBUG("R_AARCH64_RELATIVE with symbol ref!\n");
69
return EL_BADREL;
70
}
71
72
EL_DEBUG("Applying R_AARCH64_RELATIVE reloc @%p\n", p);
73
*p += ctx->base_load_vaddr;
74
break;
75
76
default:
77
EL_DEBUG("Bad relocation %u\n", type);
78
return EL_BADREL;
79
}
80
81
return EL_OK;
82
}
83
84
#endif
85
86