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

@@ -46,6 +46,7 @@ class Input_argument;
class Input_objects;
class Input_group;
class Input_file;
class Output_segment;
class Task_token;
class Workqueue;
struct Version_dependency_list;
@@ -65,10 +66,27 @@ class Expression
virtual ~Expression()
{ }
// Return the value of the expression.
// Return the value of the expression which is not permitted to
// refer to the dot symbol.
uint64_t
eval(const Symbol_table*, const Layout*);
// Return the value of an expression which is permitted to refer to
// the dot symbol. This sets *IS_ABSOLUTE to indicate whether this
// is an absolute value; it will be false if a non-absolute symbol
// was referenced in the expression; this is used to detect invalid
// uses when setting a section address.
uint64_t
eval_with_dot(const Symbol_table*, const Layout*, bool dot_has_value,
uint64_t dot_value, bool* is_absolute);
// Return the value of an expression which may or may not be
// permitted to refer to the dot symbol, depending on
// is_dot_available.
uint64_t
eval_maybe_dot(const Symbol_table*, const Layout*, bool is_dot_available,
bool dot_has_value, uint64_t dot_value, bool* is_absolute);
// Print the expression to the FILE. This is for debugging.
virtual void
print(FILE*) const = 0;
@@ -181,17 +199,35 @@ class Symbol_assignment
add_to_table(Symbol_table*);
// Finalize the symbol value.
void finalize(Symbol_table*, const Layout*);
void
finalize(Symbol_table*, const Layout*);
// Finalize the symbol value when it can refer to the dot symbol.
void
finalize_with_dot(Symbol_table*, const Layout*, bool dot_has_value,
uint64_t dot_value);
// Set the symbol value, but only if the value is absolute. This is
// used while processing a SECTIONS clause.
void
set_if_absolute(Symbol_table*, const Layout*, bool is_dot_available,
bool dot_has_value, uint64_t dot_value);
// Print the assignment to the FILE. This is for debugging.
void
print(FILE*) const;
private:
// Shared by finalize and finalize_with_dot.
void
finalize_maybe_dot(Symbol_table*, const Layout*, bool is_dot_available,
bool dot_has_value, uint64_t dot_value);
// Sized version of finalize.
template<int size>
void
sized_finalize(Symbol_table*, const Layout*);
sized_finalize(Symbol_table*, const Layout*, bool is_dot_available,
bool dot_has_value, uint64_t dot_value);
// Symbol name.
std::string name_;
@@ -274,7 +310,7 @@ class Script_options
void
add_symbols_to_table(Symbol_table*);
// Finalize the symbol values.
// Finalize the symbol values. Also check assertions.
void
finalize_symbols(Symbol_table*, const Layout*);
@@ -290,6 +326,18 @@ class Script_options
script_sections()
{ return &this->script_sections_; }
// Whether we saw a SECTIONS clause.
bool
saw_sections_clause() const
{ return this->script_sections_.saw_sections_clause(); }
// Set section addresses using a SECTIONS clause. Return the
// segment which should hold the file header and segment headers;
// this may return NULL, in which case the headers are not in a
// loadable segment.
Output_segment*
set_section_addresses(Symbol_table*, Layout*);
// Print the script to the FILE. This is for debugging.
void
print(FILE*) const;