-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Expand file tree
/
Copy pathdynamic_arm64.go
More file actions
78 lines (65 loc) · 1.69 KB
/
Copy pathdynamic_arm64.go
File metadata and controls
78 lines (65 loc) · 1.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package runtime
import (
"unsafe"
)
const debugLoader = false
const (
rAARCH64_RELATIVE = 1027
dtNULL = 0 /* Terminating entry. */
dtRELA = 7 /* Address of ElfNN_Rela relocations. */
dtRELASZ = 8 /* Total size of ElfNN_Rela relocations. */
)
/* ELF64 relocations that need an addend field. */
type rela64 struct {
Off uint64 /* Location to be relocated. */
Info uint64 /* Relocation type and symbol index. */
Addend int64 /* Addend. */
}
// ELF64 Dynamic structure. The ".dynamic" section contains an array of them.
type dyn64 struct {
Tag int64 /* Entry type. */
Val uint64 /* Integer/address value */
}
//export __dynamic_loader
func dynamicLoader(base uintptr, dyn *dyn64) {
var rela *rela64
relasz := uint64(0)
if debugLoader {
println("ASLR Base: ", base)
}
for dyn.Tag != dtNULL {
switch dyn.Tag {
case dtRELA:
rela = (*rela64)(unsafe.Add(base, dyn.Val))
case dtRELASZ:
relasz = uint64(dyn.Val) / uint64(unsafe.Sizeof(rela64{}))
}
ptr := unsafe.Pointer(dyn)
ptr = unsafe.Add(ptr, unsafe.Sizeof(dyn64{}))
dyn = (*dyn64)(ptr)
}
if rela == nil {
runtimePanic("bad reloc")
}
if debugLoader {
println("Sections to load: ", relasz)
}
for relasz > 0 && rela != nil {
switch rela.Info {
case rAARCH64_RELATIVE:
if debugLoader {
println("relocating ", uintptr(rela.Addend), " to ", base+uintptr(rela.Addend))
}
ptr := (*uint64)(unsafe.Add(base, rela.Off))
*ptr = uint64(base + uintptr(rela.Addend))
default:
if debugLoader {
println("unknown section to load:", rela.Info)
}
}
rptr := unsafe.Pointer(rela)
rptr = unsafe.Add(rptr, unsafe.Sizeof(rela64{}))
rela = (*rela64)(rptr)
relasz--
}
}