RTEMS Linker
0.0.1
RTEMS Tools Project
Main Page
Related Pages
Namespaces
Classes
Files
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Pages
/Users/chris/Development/rtems/src/apps/rtl-host.chrisj/rld-symbols.h
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2011, Chris Johns <chrisj@rtems.org>
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 and this permission notice appear in all copies.
7
*
8
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15
*/
16
/**
17
* @file
18
*
19
* @ingroup rtems-ld
20
*
21
* @brief RTEMS Linker symbols manages the symbols from all the object files.
22
*
23
*/
24
25
#if !defined (_RLD_SYMBOLS_H_)
26
#define _RLD_SYMBOLS_H_
27
28
#include <iostream>
29
#include <list>
30
#include <map>
31
#include <string>
32
33
#include <
rld-elf-types.h
>
34
35
namespace
rld
36
{
37
/**
38
* Forward declarations.
39
*/
40
namespace
files
41
{
42
class
object;
43
}
44
45
namespace
symbols
46
{
47
/**
48
* A symbol.
49
*/
50
class
symbol
51
{
52
public
:
53
/**
54
* Default constructor. No symbol has been defined.
55
*/
56
symbol
();
57
58
/**
59
* Construct an exported symbol with a object file.
60
*/
61
symbol
(
int
index
,
62
const
std::string&
name
,
63
files::object
&
object
,
64
const
elf::elf_sym
&
esym
);
65
66
/**
67
* Construct a symbol with no object file and an ELF index.
68
*/
69
symbol
(
int
index,
const
std::string& name,
const
elf::elf_sym
& esym);
70
71
/**
72
* Construct a linker symbol that is internally created.
73
*/
74
symbol
(
const
std::string& name,
75
const
elf::elf_addr
value
= 0);
76
77
/**
78
* Construct a linker symbol that is internally created.
79
*/
80
symbol
(
const
char
* name,
81
elf::elf_addr
value
= 0);
82
83
/**
84
* The symbol's index in the symtab section of the ELF file.
85
*/
86
int
index
()
const
;
87
88
/**
89
* The symbol's name.
90
*/
91
const
std::string&
name
()
const
;
92
93
/**
94
* The symbol's demangled name.
95
*/
96
const
std::string&
demangled
()
const
;
97
98
/**
99
* Is the symbol a C++ name ?
100
*/
101
bool
is_cplusplus
()
const
;
102
103
/**
104
* The symbol's type.
105
*/
106
int
type
()
const
;
107
108
/**
109
* The symbol's binding, ie local, weak, or global.
110
*/
111
int
binding
()
const
;
112
113
/**
114
* The symbol's section index.
115
*/
116
int
section_index
()
const
;
117
118
/**
119
* The value of the symbol.
120
*/
121
elf::elf_addr
value
()
const
;
122
123
/**
124
* The data of the symbol.
125
*/
126
uint32_t
info
()
const
;
127
128
/**
129
* The symbol's object file name.
130
*/
131
files::object
*
object
()
const
;
132
133
/**
134
* Set the symbol's object file name. Used when resolving unresolved
135
* symbols.
136
*/
137
void
set_object
(
files::object
& obj);
138
139
/**
140
* The ELF symbol.
141
*/
142
const
elf::elf_sym
&
esym
()
const
;
143
144
/**
145
* Return the number of references.
146
*/
147
int
references
()
const
{
148
return
references_;
149
}
150
151
/**
152
* Return the number of references.
153
*/
154
void
referenced
();
155
156
/**
157
* Less than operator for the map container.
158
*/
159
bool
operator<
(
const
symbol
& rhs)
const
;
160
161
/**
162
* Output to the a stream.
163
*/
164
void
output
(std::ostream& out)
const
;
165
166
private
:
167
168
int
index_;
//< The symbol's index in the ELF file.
169
std::string name_;
//< The name of the symbol.
170
std::string demangled_;
//< If a C++ symbol the demangled name.
171
files::object
* object_;
//< The object file containing the symbol.
172
elf::elf_sym
esym_;
//< The ELF symbol.
173
int
references_;
//< The number of times if it referenced.
174
};
175
176
/**
177
* Container of symbols. A bucket of symbols.
178
*/
179
typedef
std::list < symbol >
bucket
;
180
181
/**
182
* References to symbols. Should always point to symbols held in a bucket.
183
*/
184
typedef
std::list < symbol* >
pointers
;
185
186
/**
187
* A symbols table is a map container of symbols. Should always point to
188
* symbols held in a bucket.
189
*/
190
typedef
std::map < std::string, symbol* >
symtab
;
191
192
/**
193
* A symbols contains a symbol table of externals and weak symbols.
194
*/
195
class
table
196
{
197
public
:
198
/**
199
* Construct a table.
200
*/
201
table
();
202
203
/**
204
* Destruct a table.
205
*/
206
~table
();
207
208
/**
209
* Add an external symbol.
210
*/
211
void
add_external
(
symbol
& sym);
212
213
/**
214
* Add a weak symbol.
215
*/
216
void
add_weak
(
symbol
& sym);
217
218
/**
219
* Find an external symbol.
220
*/
221
symbol
*
find_external
(
const
std::string& name);
222
223
/**
224
* Find an weak symbol.
225
*/
226
symbol
*
find_weak
(
const
std::string& name);
227
228
/**
229
* Return the size of the symbols loaded.
230
*/
231
size_t
size
()
const
;
232
233
/**
234
* Return the externals symbol table.
235
*/
236
const
symtab
&
externals
()
const
;
237
238
/**
239
* Return the weaks symbol table.
240
*/
241
const
symtab
&
weaks
()
const
;
242
243
private
:
244
245
/**
246
* Cannot copy a table.
247
*/
248
table
(
const
table
& orig);
249
250
/**
251
* A table of external symbols.
252
*/
253
symtab
_externals;
254
255
/**
256
* A table of weak symbols.
257
*/
258
symtab
_weaks;
259
};
260
261
/**
262
* Load a table from a buckey.
263
*/
264
void
load
(
bucket
& bucket_,
table
& table_);
265
266
/**
267
* Load a table from a buckey.
268
*/
269
void
load
(
bucket
& bucket_,
symtab
& table_);
270
271
/**
272
* Given a container of symbols return how many are referenced.
273
*/
274
size_t
referenced
(
pointers
& symbols);
275
276
/**
277
* Output the symbol table.
278
*/
279
void
output
(std::ostream& out,
const
table
& symbols);
280
281
/**
282
* Output the symbol table.
283
*/
284
void
output
(std::ostream& out,
const
symtab
& symbols);
285
}
286
}
287
288
/**
289
* Output stream operator.
290
*/
291
static
inline
std::ostream& operator<< (std::ostream& out,
292
const
rld::symbols::symbol
& sym) {
293
sym.
output
(out);
294
return
out;
295
}
296
297
#endif
rld-symbols.h
Generated on Wed Jan 23 2013 14:02:37 for RTEMS Linker by
1.8.3.1