Fully implement the SECTIONS clause.

This commit is contained in:
Ian Lance Taylor 2008-02-04 05:43:05 +00:00
parent d16c732117
commit a445fddf82
24 changed files with 3087 additions and 441 deletions

View file

@ -37,6 +37,8 @@ struct Input_section_spec;
class Expression;
class Sections_element;
class Output_section_definition;
class Output_section;
class Output_segment;
class Script_sections
{
@ -79,6 +81,11 @@ class Script_sections
void
add_symbol_assignment(const char* name, size_t length, Expression* value,
bool provide, bool hidden);
// Add an assignment to the special dot symbol.
void
add_dot_assignment(Expression* value);
// Add an assertion.
void
add_assertion(Expression* check, const char* message, size_t messagelen);
@ -91,6 +98,42 @@ class Script_sections
void
add_input_section(const Input_section_spec* spec, bool keep);
// Add any symbols we are defining to the symbol table.
void
add_symbols_to_table(Symbol_table*);
// Finalize symbol values and check assertions.
void
finalize_symbols(Symbol_table* symtab, const Layout* layout);
// Find the name of the output section to use for an input file name
// and section name. This returns a name, and sets
// *OUTPUT_SECTION_SLOT to point to the address where the actual
// output section may be stored.
// 1) If the input section should be discarded, this returns NULL
// and sets *OUTPUT_SECTION_SLOT to NULL.
// 2) If the input section is mapped by the SECTIONS clause, this
// returns the name to use for the output section (in permanent
// storage), and sets *OUTPUT_SECTION_SLOT to point to where the
// output section should be stored. **OUTPUT_SECTION_SLOT will be
// non-NULL if we have seen this output section already.
// 3) If the input section is not mapped by the SECTIONS clause,
// this returns SECTION_NAME, and sets *OUTPUT_SECTION_SLOT to
// NULL.
const char*
output_section_name(const char* file_name, const char* section_name,
Output_section*** output_section_slot);
// Place a marker for an orphan output section into the SECTIONS
// clause.
void
place_orphan(Output_section* os);
// Set the addresses of all the output sections. Return the segment
// which holds the file header and segment headers, if any.
Output_segment*
set_section_addresses(Symbol_table*, Layout*);
// Print the contents to the FILE. This is for debugging.
void
print(FILE*) const;
@ -98,6 +141,18 @@ class Script_sections
private:
typedef std::vector<Sections_element*> Sections_elements;
// Create segments.
Output_segment*
create_segments(Layout*);
// Create PT_NOTE and PT_TLS segments.
void
create_note_and_tls_segments(Layout*, const std::vector<Output_section*>*);
// Return whether the section is a BSS section.
static bool
is_bss_section(const Output_section*);
// True if we ever saw a SECTIONS clause.
bool saw_sections_clause_;
// True if we are currently processing a SECTIONS clause.