Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/libexec/rtld-elf/aarch64/rtld_machdep.h
34875 views
1
/*-
2
* Copyright (c) 1999, 2000 John D. Polstra.
3
* Copyright (c) 2014 the FreeBSD Foundation
4
* All rights reserved.
5
*
6
* Portions of this software were developed by Andrew Turner
7
* under sponsorship from the FreeBSD Foundation.
8
*
9
* Redistribution and use in source and binary forms, with or without
10
* modification, are permitted provided that the following conditions
11
* are met:
12
* 1. Redistributions of source code must retain the above copyright
13
* notice, this list of conditions and the following disclaimer.
14
* 2. Redistributions in binary form must reproduce the above copyright
15
* notice, this list of conditions and the following disclaimer in the
16
* documentation and/or other materials provided with the distribution.
17
*
18
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19
* 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 AUTHOR OR CONTRIBUTORS BE LIABLE
22
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28
* SUCH DAMAGE.
29
*/
30
31
#ifndef RTLD_MACHDEP_H
32
#define RTLD_MACHDEP_H 1
33
34
#include <sys/types.h>
35
#include <machine/atomic.h>
36
#include <machine/tls.h>
37
38
struct Struct_Obj_Entry;
39
40
#define MD_OBJ_ENTRY \
41
bool variant_pcs : 1; /* Object has a variant pcs function */
42
43
/* Return the address of the .dynamic section in the dynamic linker. */
44
#define rtld_dynamic(obj) \
45
({ \
46
Elf_Addr _dynamic_addr; \
47
asm volatile("adr %0, _DYNAMIC" : "=&r"(_dynamic_addr)); \
48
(const Elf_Dyn *)_dynamic_addr; \
49
})
50
51
bool arch_digest_dynamic(struct Struct_Obj_Entry *obj, const Elf_Dyn *dynp);
52
53
bool arch_digest_note(struct Struct_Obj_Entry *obj, const Elf_Note *note);
54
55
Elf_Addr reloc_jmpslot(Elf_Addr *where, Elf_Addr target,
56
const struct Struct_Obj_Entry *defobj, const struct Struct_Obj_Entry *obj,
57
const Elf_Rel *rel);
58
59
#define make_function_pointer(def, defobj) \
60
((defobj)->relocbase + (def)->st_value)
61
62
#define call_initfini_pointer(obj, target) \
63
(((InitFunc)(target))())
64
65
#define call_init_pointer(obj, target) \
66
(((InitArrFunc)(target))(main_argc, main_argv, environ))
67
68
/*
69
* Pass zeros into the ifunc resolver so we can change them later. The first
70
* 8 arguments on arm64 are passed in registers so make them known values
71
* if we decide to use them later. Because of this ifunc resolvers can assume
72
* no arguments are passed in, and if this changes later will be able to
73
* compare the argument with 0 to see if it is set.
74
*/
75
#define call_ifunc_resolver(ptr) \
76
(((Elf_Addr (*)(uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, \
77
uint64_t, uint64_t, uint64_t))ptr)(0, 0, 0, 0, 0, 0, 0, 0))
78
79
#define round(size, align) \
80
(((size) + (align) - 1) & ~((align) - 1))
81
#define calculate_first_tls_offset(size, align, offset) \
82
round(16, align)
83
#define calculate_tls_offset(prev_offset, prev_size, size, align, offset) \
84
round(prev_offset + prev_size, align)
85
#define calculate_tls_post_size(align) \
86
round(TLS_TCB_SIZE, align) - TLS_TCB_SIZE
87
88
typedef struct {
89
unsigned long ti_module;
90
unsigned long ti_offset;
91
} tls_index;
92
93
extern void *__tls_get_addr(tls_index *ti);
94
95
#define md_abi_variant_hook(x)
96
97
#endif
98
99