source: rtems-tools/rtemstoolkit/rld-symbols.h @ 87e0e76

4.104.11
Last change on this file since 87e0e76 was 87e0e76, checked in by Chris Johns <chrisj@…>, on Sep 13, 2014 at 2:09:16 AM

Refactor code into the RTEMS Toolkit.

  • Property mode set to 100644
File size: 6.4 KB
Line 
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
35namespace 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 */
291static inline std::ostream& operator<< (std::ostream&               out,
292                                        const rld::symbols::symbol& sym) {
293  sym.output (out);
294  return out;
295}
296
297#endif
Note: See TracBrowser for help on using the repository browser.