aboutsummaryrefslogtreecommitdiff
path: root/gold/object.h
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@google.com>2006-09-27 22:53:42 +0000
committerIan Lance Taylor <iant@google.com>2006-09-27 22:53:42 +0000
commit75f65a3e309b8cd885c782f6af106d1e2a1876f6 (patch)
tree0f21c32a5e40156d007fd6a676b5d74a8c423c90 /gold/object.h
parent6b89cc2108a525fdc4186bae5365acc258e9c23c (diff)
downloadgdb-75f65a3e309b8cd885c782f6af106d1e2a1876f6.zip
gdb-75f65a3e309b8cd885c782f6af106d1e2a1876f6.tar.gz
gdb-75f65a3e309b8cd885c782f6af106d1e2a1876f6.tar.bz2
Finished layout code.
Diffstat (limited to 'gold/object.h')
-rw-r--r--gold/object.h43
1 files changed, 38 insertions, 5 deletions
diff --git a/gold/object.h b/gold/object.h
index 36cf949..e3df36d 100644
--- a/gold/object.h
+++ b/gold/object.h
@@ -14,6 +14,7 @@
namespace gold
{
+class Stringpool;
class Output_section;
class Layout;
@@ -25,8 +26,6 @@ struct Read_symbols_data
File_view* symbols;
// Size of symbol data in bytes.
off_t symbols_size;
- // Index of first global symbol.
- unsigned int first_global;
// Symbol names.
File_view* symbol_names;
// Size of symbol name data in bytes.
@@ -110,7 +109,13 @@ class Object
layout(Layout* lay)
{ this->do_layout(lay); }
- protected:
+ // Initial local symbol processing: set the offset where local
+ // symbol information will be stored; add local symbol names to
+ // *POOL; return the offset following the local symbols.
+ off_t
+ finalize_local_symbols(off_t off, Stringpool* pool)
+ { return this->do_finalize_local_symbols(off, pool); }
+
// What we need to know to map an input section to an output
// section. We keep an array of these, one for each input section,
// indexed by the input section number.
@@ -123,6 +128,13 @@ class Object
off_t offset;
};
+ // Given a section index, return the corresponding Map_to_output
+ // information.
+ const Map_to_output*
+ section_output_info(unsigned int shnum) const
+ { return &this->map_to_output_[shnum]; }
+
+ protected:
// Read the symbols--implemented by child class.
virtual Read_symbols_data
do_read_symbols() = 0;
@@ -136,6 +148,10 @@ class Object
virtual void
do_layout(Layout*) = 0;
+ // Finalize local symbols--implemented by child class.
+ virtual off_t
+ do_finalize_local_symbols(off_t, Stringpool*) = 0;
+
// Get the file.
Input_file*
input_file() const
@@ -152,7 +168,7 @@ class Object
// Get the number of sections.
unsigned int
- shnum(void) const
+ shnum() const
{ return this->shnum_; }
// Set the number of sections.
@@ -243,6 +259,10 @@ class Sized_object : public Object
void
do_layout(Layout*);
+ // Finalize the local symbols.
+ off_t
+ do_finalize_local_symbols(off_t, Stringpool*);
+
// Return the appropriate Sized_target structure.
Sized_target<size, big_endian>*
sized_target()
@@ -264,6 +284,11 @@ class Sized_object : public Object
static const int ehdr_size = elfcpp::Elf_sizes<size>::ehdr_size;
static const int shdr_size = elfcpp::Elf_sizes<size>::shdr_size;
static const int sym_size = elfcpp::Elf_sizes<size>::sym_size;
+ typedef elfcpp::Shdr<size, big_endian> Shdr;
+
+ // Read the section header for section SHNUM.
+ const unsigned char*
+ section_header(unsigned int shnum);
// Whether to include a section group in the link.
bool
@@ -286,6 +311,8 @@ class Sized_object : public Object
unsigned int symtab_shnum_;
// The entries in the symbol table for the external symbols.
Symbol** symbols_;
+ // File offset for local symbols.
+ off_t local_symbol_offset_;
};
// A class to manage the list of all objects.
@@ -294,7 +321,7 @@ class Input_objects
{
public:
Input_objects()
- : object_list_(), any_dynamic_(false)
+ : object_list_(), target_(NULL), any_dynamic_(false)
{ }
// The type of the list of input objects.
@@ -304,6 +331,11 @@ class Input_objects
void
add_object(Object*);
+ // Get the target we should use for the output file.
+ Target*
+ target() const
+ { return this->target_; }
+
// Iterate over all objects.
Object_list::const_iterator
begin() const
@@ -323,6 +355,7 @@ class Input_objects
Input_objects& operator=(const Input_objects&);
Object_list object_list_;
+ Target* target_;
bool any_dynamic_;
};