summaryrefslogtreecommitdiff
path: root/rtl-elf.h
blob: dd3e14af495efd678e2d9c8df575987daedfa858 (plain)
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
/*
 *  COPYRIGHT (c) 2012 Chris Johns <chrisj@rtems.org>
 *
 *  The license and distribution terms for this file may be
 *  found in the file LICENSE in this distribution or at
 *  http://www.rtems.com/license/LICENSE.
 */
/**
 * @file
 *
 * @ingroup rtems_rtl
 *
 * @brief RTEMS Run-Time Linker ELF Headers
 */

#if !defined (_RTEMS_RTL_ELF_H_)
#define _RTEMS_RTL_ELF_H_

#include <rtl-fwd.h>
#include <rtl-obj-fwd.h>
#include <rtl-sym.h>

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 ** Imported NetBSD ELF Specifics Start.
 **/

/*
 * Always 32bit for RTEMS at the moment. Do not add '()'. Leave plain.
 */
#define ELFSIZE 32

/*
 * Define _STANDALONE then remove after.
 */
#define _STANDALONE 1

#include <sys/cdefs.h>
#include <sys/exec_elf.h>

#undef _STANDALONE

/**
 ** Imported NetBSD ELF Specifics End.
 **/

/**
 * Maximum string length. This a read buffering limit rather than a
 * specific ELF length. I hope this is ok as I am concerned about
 * some C++ symbol lengths.
 */
#define RTEMS_RTL_ELF_STRING_MAX (256)

/**
 * Architecture specific handler to check is a relocation record's type is
 * required to resolve a symbol.
 *
 * @param type The type field in the relocation record.
 * @retval true The relocation record require symbol resolution.
 * @retval false The relocation record does not require symbol resolution.
 */
bool rtems_rtl_elf_rel_resolve_sym (Elf_Word type);

/**
 * Architecture specific relocation handler compiled in for a specific
 * architecture by the build system. The handler applies the relocation
 * to the target.
 *
 * @param obj The object file being relocated.
 * @param rel The ELF relocation record.
 * @param sect The section of the object file the relocation is for.
 * @param symname The symbol's name.
 * @param syminfo The ELF symbol info field.
 * @param symvalue If a symbol is referenced, this is the symbols value.
 * @retval bool The relocation has been applied.
 * @retval bool The relocation could not be applied.
 */
bool rtems_rtl_elf_relocate_rel (const rtems_rtl_obj_t*      obj,
                                 const Elf_Rel*              rel,
                                 const rtems_rtl_obj_sect_t* sect,
                                 const char*                 symname,
                                 const Elf_Byte              syminfo,
                                 const Elf_Word              symvalue);

/**
 * Architecture specific relocation handler compiled in for a specific
 * architecture by the build system. The handler applies the relocation
 * to the target.
 *
 * @param obj The object file being relocated.
 * @param rela The ELF addend relocation record.
 * @param sect The section of the object file the relocation is for.
 * @param symname The symbol's name.
 * @param syminfo The ELF symbol info field.
 * @param symvalue If a symbol is referenced, this is the symbols value.
 * @retval bool The relocation has been applied.
 * @retval bool The relocation could not be applied.
 */
bool rtems_rtl_elf_relocate_rela (const rtems_rtl_obj_t*      obj,
                                  const Elf_Rela*             rela,
                                  const rtems_rtl_obj_sect_t* sect,
                                  const char*                 symname,
                                  const Elf_Byte              syminfo,
                                  const Elf_Word              symvalue);

/**
 * Find the symbol. The symbol is passed as an ELF type symbol with the name
 * and the value returned is the absolute address of the symbol.
 *
 * If the symbol type is STT_NOTYPE the symbol references a global symbol. The
 * gobal symbol table is searched to find it and that value returned. If the
 * symbol is local to the object module the section for the symbol is located
 * and it's base added to the symbol's value giving an absolute location.
 *
 * @param obj The object the symbol is being resolved for.
 * @param sym The ELF type symbol.
 * @param symname The sym's name read from the symbol string table.
 * @param value Return the value of the symbol. Only valid if the return value
 *              is true.
 * @retval true The symbol resolved.
 * @retval false The symbol could not be result. The RTL error is set.
 */
bool rtems_rtl_elf_find_symbol (rtems_rtl_obj_t* obj,
                                const Elf_Sym*   sym,
                                const char*      symname,
                                Elf_Word*        value);

/**
 * The ELF format check handler.
 *
 * @param obj The object being checked.
 * @param fd The file descriptor.
 */
bool rtems_rtl_elf_file_check (rtems_rtl_obj_t* obj, int fd);

/**
 * The ELF file details handler.
 * 
 * @param obj Load the details of the obj.
 */
bool rtems_rtl_elf_load_details (rtems_rtl_obj_t* obj);

/**
 * The ELF format load handler.
 *
 * @param obj The object to load.
 * @param fd The file descriptor.
 */
bool rtems_rtl_elf_file_load (rtems_rtl_obj_t* obj, int fd);

/**
 * The ELF format signature handler.
 *
 * @return rtems_rtl_loader_format_t* The format's signature.
 */
rtems_rtl_loader_format_t* rtems_rtl_elf_file_sig (void);

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif