source: rtems-tools/linkers/rld-symbols.h @ ec24a37

4.104.115
Last change on this file since ec24a37 was ec24a37, checked in by Chris Johns <chrisj@…>, on 05/06/12 at 22:47:11

Add to git.

  • Property mode set to 100644
File size: 4.1 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 (const std::string&  name,
62              rld::files::object& object,
63              const elf::elf_sym& esym);
64
65      /**
66       * Construct an unresolved symbol with no object file.
67       */
68      symbol (const std::string& name, const elf::elf_sym& esym);
69     
70      /**
71       * Construct a linker symbol that is internally created.
72       */
73      symbol (const std::string&  name,
74              const elf::elf_addr value);
75     
76      /**
77       * Construct a linker symbol that is internally created.
78       */
79      symbol (const char*        name,
80              rld::elf::elf_addr value = 0);
81     
82      /**
83       * The symbol's name.
84       */
85      const std::string& name () const;
86
87      /**
88       * The symbol's demangled name.
89       */
90      const std::string& demangled () const;
91
92      /**
93       * Is the symbol a C++ name ?
94       */
95      bool is_cplusplus () const;
96
97      /**
98       * The symbol's object file name.
99       */
100      rld::files::object* object () const;
101
102      /**
103       * Set the symbol's object file name. Used when resolving unresolved
104       * symbols.
105       */
106      void set_object (rld::files::object& obj);
107
108      /**
109       * The ELF symbol.
110       */
111      const ::GElf_Sym& esym () const;
112
113      /**
114       * Return the number of references.
115       */
116      int references () const {
117        return references_;
118      }
119
120      /**
121       * Return the number of references.
122       */
123      void referenced ();
124
125      /**
126       * Less than operator for the map container.
127       */
128      bool operator< (const symbol& rhs) const;
129
130      /**
131       * Output to the a stream.
132       */
133      void output (std::ostream& out) const;
134
135    private:
136      std::string         name_;       //< The name of the symbol.
137      std::string         demangled_;  //< If a C++ symbol the demangled name.
138      rld::files::object* object_;     //< The object file containing the
139                                       //  symbol.
140      ::GElf_Sym          esym_;       //< The ELF symbol.
141      int                 references_; //< The number of times if it referenced.
142    };
143
144    /**
145     * List of symbol references.
146     */
147    typedef std::list < symbol* > list;
148
149    /**
150     * A symbols table is a map container of symbols.
151     */
152    typedef std::map < std::string, symbol > table;
153
154    /**
155     * Given a list of symbols return how many are referenced.
156     */
157    size_t referenced (list& symbols);
158
159    /**
160     * Output the symbol table.
161     */
162    void output (std::ostream& out, const table& symbols);
163  }
164}
165
166/**
167 * Output stream operator.
168 */
169static inline std::ostream& operator<< (std::ostream& out, const rld::symbols::symbol& sym) {
170  sym.output (out);
171  return out;
172}
173
174#endif
Note: See TracBrowser for help on using the repository browser.