diff --git a/ld/ChangeLog b/ld/ChangeLog index fc4b1be195..3b3516ec23 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,10 @@ +2004-02-19 Nathan Sidwell + + * ldlang.c (map_input_to_output_sections): Initialize sections + mentioned in a data statement expression. + (lang_do_assignments_1): Add data statement's expression's + section's vma. + 2004-02-18 Nathan Sidwell * ldgram.y (statement_anywhere): Add assert rule. diff --git a/ld/ldlang.c b/ld/ldlang.c index 487ee02b06..a25f5f300a 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -2098,10 +2098,14 @@ map_input_to_output_sections target, output_section_statement); break; + case lang_data_statement_enum: + /* Make sure that any sections mentioned in the expression + are initialized. */ + exp_init_os (s->data_statement.exp); + /* FALLTHROUGH */ case lang_fill_statement_enum: case lang_input_section_enum: case lang_object_symbols_statement_enum: - case lang_data_statement_enum: case lang_reloc_statement_enum: case lang_padding_statement_enum: case lang_input_statement_enum: @@ -3375,9 +3379,10 @@ lang_do_assignments_1 value = exp_fold_tree (s->data_statement.exp, abs_output_section, lang_final_phase_enum, dot, &dot); - s->data_statement.value = value.value; if (!value.valid_p) einfo (_("%F%P: invalid data statement\n")); + s->data_statement.value + = value.value + value.section->bfd_section->vma; } { unsigned int size; diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 282ee0c806..23e41a9526 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2004-02-19 Nathan Sidwell + + * ld-scripts/data.{s,t,d,exp}: New. + 2004-02-18 Nathan Sidwell * ld-scripts/assert.{s,t,exp}: New. diff --git a/ld/testsuite/ld-scripts/data.d b/ld/testsuite/ld-scripts/data.d new file mode 100644 index 0000000000..62846866c1 --- /dev/null +++ b/ld/testsuite/ld-scripts/data.d @@ -0,0 +1,9 @@ +#source: data.s +#ld: -T data.t +#objdump: -s -j .text + +.*: file format .* + +Contents of section .text: + 1000 (0410)?0000(1004)? (0810)?0000(1008)? +........ * +#pass diff --git a/ld/testsuite/ld-scripts/data.exp b/ld/testsuite/ld-scripts/data.exp new file mode 100644 index 0000000000..9cca01a92f --- /dev/null +++ b/ld/testsuite/ld-scripts/data.exp @@ -0,0 +1,20 @@ +# Test DATA STATEMENT in a linker script. +# By Nathan Sidwell, CodeSourcery LLC +# Copyright 2004 +# Free Software Foundation, Inc. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +run_dump_test data diff --git a/ld/testsuite/ld-scripts/data.s b/ld/testsuite/ld-scripts/data.s new file mode 100644 index 0000000000..0517ffe829 --- /dev/null +++ b/ld/testsuite/ld-scripts/data.s @@ -0,0 +1 @@ +#nothing here diff --git a/ld/testsuite/ld-scripts/data.t b/ld/testsuite/ld-scripts/data.t new file mode 100644 index 0000000000..359a02f64a --- /dev/null +++ b/ld/testsuite/ld-scripts/data.t @@ -0,0 +1,10 @@ +SECTIONS +{ + .text 0x1000 : + { + LONG (label) + label = .; + LONG (ADDR (.other)) + } + .other : {} +}