diff options
-rw-r--r-- | gold/ChangeLog | 11 | ||||
-rw-r--r-- | gold/script.cc | 8 | ||||
-rw-r--r-- | gold/testsuite/script_test_2.cc | 5 | ||||
-rw-r--r-- | gold/testsuite/script_test_2.t | 3 |
4 files changed, 25 insertions, 2 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog index 8539849..48508a9 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,14 @@ +2008-07-29 Ian Lance Taylor <iant@google.com> + + * script.cc (Script_options::finalize_symbols): Finalize SECTIONS + symbols before other symbols. + * testsuite/script_test_2.cc (test_addr): Declare. + (test_addr_alias): Declare. + (main): Check that test_addr and test_addr_alias have the right + values. + * testsuite/script_test_2.t: Define test_addr_alias and + test_addr. + 2008-07-24 Ian Lance Taylor <iant@google.com> PR 5990 diff --git a/gold/script.cc b/gold/script.cc index 4bfe33c..f6e4a39 100644 --- a/gold/script.cc +++ b/gold/script.cc @@ -1109,6 +1109,12 @@ Script_options::add_symbols_to_table(Symbol_table* symtab) void Script_options::finalize_symbols(Symbol_table* symtab, const Layout* layout) { + // We finalize the symbols defined in SECTIONS first, because they + // are the ones which may have changed. This way if symbol outside + // SECTIONS are defined in terms of symbols inside SECTIONS, they + // will get the right value. + this->script_sections_.finalize_symbols(symtab, layout); + for (Symbol_assignments::iterator p = this->symbol_assignments_.begin(); p != this->symbol_assignments_.end(); ++p) @@ -1118,8 +1124,6 @@ Script_options::finalize_symbols(Symbol_table* symtab, const Layout* layout) p != this->assertions_.end(); ++p) (*p)->check(symtab, layout); - - this->script_sections_.finalize_symbols(symtab, layout); } // Set section addresses. We set all the symbols which have absolute diff --git a/gold/testsuite/script_test_2.cc b/gold/testsuite/script_test_2.cc index 9ba3aad..7104551 100644 --- a/gold/testsuite/script_test_2.cc +++ b/gold/testsuite/script_test_2.cc @@ -35,6 +35,8 @@ extern char end_data[]; extern char start_fill[]; extern char end_fill[]; extern char end_test_area[]; +extern char test_addr[]; +extern char test_addr_alias[]; int main(int, char**) @@ -66,4 +68,7 @@ main(int, char**) assert(end_fill == start_fill + 8); assert(end_test_area == end_fill); + + assert(test_addr == start_test_area_1); + assert(test_addr_alias == test_addr); } diff --git a/gold/testsuite/script_test_2.t b/gold/testsuite/script_test_2.t index 41a8721..73d39df 100644 --- a/gold/testsuite/script_test_2.t +++ b/gold/testsuite/script_test_2.t @@ -20,6 +20,8 @@ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ +test_addr_alias = test_addr; + SECTIONS { /* With luck this will work everywhere. */ @@ -62,4 +64,5 @@ SECTIONS end_fill = .; } end_test_area = .; + test_addr = ADDR(.gold_test); } |