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

4.104.115
Last change on this file since be8e188 was ea6f8d4, checked in by Chris Johns <chrisj@…>, on 11/29/12 at 08:01:43

Add access to the value and info fields of a symbols.

  • Property mode set to 100644
File size: 4.8 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              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 = 0);
75
76      /**
77       * Construct a linker symbol that is internally created.
78       */
79      symbol (const char*   name,
80              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 type.
99       */
100      int type () const;
101
102      /**
103       * The symbol's binding, ie local, weak, or global.
104       */
105      int binding () const;
106
107      /**
108       * The synbol's section index.
109       */
110      int index () const;
111
112      /**
113       * The value of the symbol.
114       */
115      elf::elf_addr value () const;
116
117      /**
118       * The data of the symbol.
119       */
120      uint32_t info () const;
121
122      /**
123       * The symbol's object file name.
124       */
125      files::object* object () const;
126
127      /**
128       * Set the symbol's object file name. Used when resolving unresolved
129       * symbols.
130       */
131      void set_object (files::object& obj);
132
133      /**
134       * The ELF symbol.
135       */
136      const elf::elf_sym& esym () const;
137
138      /**
139       * Return the number of references.
140       */
141      int references () const {
142        return references_;
143      }
144
145      /**
146       * Return the number of references.
147       */
148      void referenced ();
149
150      /**
151       * Less than operator for the map container.
152       */
153      bool operator< (const symbol& rhs) const;
154
155      /**
156       * Output to the a stream.
157       */
158      void output (std::ostream& out) const;
159
160    private:
161
162      std::string    name_;       //< The name of the symbol.
163      std::string    demangled_;  //< If a C++ symbol the demangled name.
164      files::object* object_;     //< The object file containing the symbol.
165      elf::elf_sym   esym_;       //< The ELF symbol.
166      int            references_; //< The number of times if it referenced.
167    };
168
169    /**
170     * Container of symbols. A bucket of symbols.
171     */
172    typedef std::list < symbol > bucket;
173
174    /**
175     * References to symbols. Should always point to symbols held in a bucket.
176     */
177    typedef std::list < symbol* > pointers;
178
179    /**
180     * A symbols table is a map container of symbols. Should always point to
181     * symbols held in a bucket.
182     */
183    typedef std::map < std::string, symbol* > table;
184
185    /**
186     * Load a table from a buckey.
187     */
188    void load (bucket& bucket_, table& table_);
189
190    /**
191     * Given a container of symbols return how many are referenced.
192     */
193    size_t referenced (pointers& symbols);
194
195    /**
196     * Output the symbol table.
197     */
198    void output (std::ostream& out, const table& symbols);
199  }
200}
201
202/**
203 * Output stream operator.
204 */
205static inline std::ostream& operator<< (std::ostream&               out,
206                                        const rld::symbols::symbol& sym) {
207  sym.output (out);
208  return out;
209}
210
211#endif
Note: See TracBrowser for help on using the repository browser.