From: Nathan Sidwell Date: Fri, 3 Apr 2009 07:45:28 +0000 (+0000) Subject: * ldlang.c (lang_leave_output_section_statement): Set lma_region X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=113e68452ed03bd9f48a31036ece530685751112;p=binutils-gdb.git * ldlang.c (lang_leave_output_section_statement): Set lma_region if it is not overridden and section is for the same vma region as the previous section. * ld-scripts/rgn-at.exp: New. * ld-scripts/rgn-at.s: New. * ld-scripts/rgn-at1.d: New. * ld-scripts/rgn-at1.t: New. * ld-scripts/rgn-at2.d: New. * ld-scripts/rgn-at2.t: New. * ld-scripts/rgn-at3.d: New. * ld-scripts/rgn-at3.t: New. --- diff --git a/ld/ChangeLog b/ld/ChangeLog index 0d4e0159b5c..78605abf4c6 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,9 @@ +2009-04-03 Nathan Sidwell + + * ldlang.c (lang_leave_output_section_statement): Set lma_region + if it is not overridden and section is for the same vma region as + the previous section. + 2009-04-02 Dave Korn PR ld/6744 diff --git a/ld/ldlang.c b/ld/ldlang.c index 55d1043a700..a32dd51cbe3 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -6543,6 +6543,15 @@ lang_leave_output_section_statement (fill_type *fill, const char *memspec, memspec, lma_memspec, current_section->load_base != NULL, current_section->addr_tree != NULL); + + /* If this section has no load region or base, but has the same + region as the previous section, then propagate the previous + section's load region. */ + + if (!current_section->lma_region && !current_section->load_base + && current_section->region == current_section->prev->region) + current_section->lma_region = current_section->prev->lma_region; + current_section->fill = fill; current_section->phdrs = phdrs; pop_stat_ptr (); diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 59500910ba7..f29db213250 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,14 @@ +2009-04-03 Nathan Sidwell + + * ld-scripts/rgn-at.exp: New. + * ld-scripts/rgn-at.s: New. + * ld-scripts/rgn-at1.d: New. + * ld-scripts/rgn-at1.t: New. + * ld-scripts/rgn-at2.d: New. + * ld-scripts/rgn-at2.t: New. + * ld-scripts/rgn-at3.d: New. + * ld-scripts/rgn-at3.t: New. + 2009-04-03 Dave Korn * ld-pe/export_dynamic_warning.s: Make dummy code portable. diff --git a/ld/testsuite/ld-scripts/rgn-at.exp b/ld/testsuite/ld-scripts/rgn-at.exp new file mode 100644 index 00000000000..90952736e1b --- /dev/null +++ b/ld/testsuite/ld-scripts/rgn-at.exp @@ -0,0 +1,33 @@ +# Test for proper diagnosis of overflowed memory regions. +# Copyright 2009 Free Software Foundation, Inc. +# +# This file is part of the GNU Binutils. +# +# This program 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 3 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., 51 Franklin Street - Fifth Floor, Boston, +# MA 02110-1301, USA. + +if ![is_elf_format] { + return +} + +load_lib ld-lib.exp + +set test_list [lsort [glob -nocomplain $srcdir/$subdir/rgn-at*.d]] +foreach test_file $test_list { + set test_name [file rootname $test_file] + set map_file "tmpdir/[file tail $test_name].map" + verbose $test_name + run_dump_test $test_name +} diff --git a/ld/testsuite/ld-scripts/rgn-at.s b/ld/testsuite/ld-scripts/rgn-at.s new file mode 100644 index 00000000000..406f875b3a0 --- /dev/null +++ b/ld/testsuite/ld-scripts/rgn-at.s @@ -0,0 +1,6 @@ + .text + .long 0x12345678 + .data + .long 0x9abcdef0 + .bss + .long 0 diff --git a/ld/testsuite/ld-scripts/rgn-at1.d b/ld/testsuite/ld-scripts/rgn-at1.d new file mode 100644 index 00000000000..f7de2c3829a --- /dev/null +++ b/ld/testsuite/ld-scripts/rgn-at1.d @@ -0,0 +1,12 @@ +# name: rgn-at1 +# source: rgn-at.s +# ld: -T rgn-at1.t +# objdump: -w -h + +.*: file format .* + +Sections: +Idx +Name +Size +VMA +LMA +File off +Algn +Flags + 0 .text +0+[0-9a-f] +0+0010000 +0+0020000 +.* + 1 .data +0+[0-9a-f] +0+00100[0-9a-f]+ +0+00200[0-9a-f]+ +.* + 2 .bss +0+[0-9a-f] +0+00100[0-9a-f]+ +0+00200[0-9a-f]+ +.* diff --git a/ld/testsuite/ld-scripts/rgn-at1.t b/ld/testsuite/ld-scripts/rgn-at1.t new file mode 100644 index 00000000000..610be2a34a9 --- /dev/null +++ b/ld/testsuite/ld-scripts/rgn-at1.t @@ -0,0 +1,13 @@ +/* Memory region at test, >AT should propagate by default */ + +MEMORY { + ram : ORIGIN = 0x10000, LENGTH = 0x100 + rom : ORIGIN = 0x20000, LENGTH = 0x200 +} +_start = 0x1000; +SECTIONS { + .text : { *(.text) } >ram AT>rom + .data : { *(.data) } >ram /* default AT>rom */ + .bss : { *(.bss) } >ram + /DISCARD/ : { *(*) } +} diff --git a/ld/testsuite/ld-scripts/rgn-at2.d b/ld/testsuite/ld-scripts/rgn-at2.d new file mode 100644 index 00000000000..1dae8af0a06 --- /dev/null +++ b/ld/testsuite/ld-scripts/rgn-at2.d @@ -0,0 +1,12 @@ +# name: rgn-at2 +# source: rgn-at.s +# ld: -T rgn-at2.t +# objdump: -w -h + +.*: file format .* + +Sections: +Idx +Name +Size +VMA +LMA +File off +Algn +Flags + 0 .text +0+[0-9a-f] +0+0010000 +0+0020000 +.* + 1 .data +0+[0-9a-f] +0+0030000 +0+0030000 +.* + 2 .bss +0+[0-9a-f] +0+00300[0-9a-f]+ +0+00300[0-9a-f]+ +.* diff --git a/ld/testsuite/ld-scripts/rgn-at2.t b/ld/testsuite/ld-scripts/rgn-at2.t new file mode 100644 index 00000000000..57fd88ca88d --- /dev/null +++ b/ld/testsuite/ld-scripts/rgn-at2.t @@ -0,0 +1,14 @@ +/* Memory region at test, >AT should propagate by default */ + +MEMORY { + ram : ORIGIN = 0x10000, LENGTH = 0x100 + rom : ORIGIN = 0x20000, LENGTH = 0x200 + other : ORIGIN = 0x30000, LENGTH = 0x200 +} +_start = 0x1000; +SECTIONS { + .text : { *(.text) } >ram AT>rom + .data : { *(.data) } >other /* No default AT>rom */ + .bss : { *(.bss) } >other + /DISCARD/ : { *(*) } +} diff --git a/ld/testsuite/ld-scripts/rgn-at3.d b/ld/testsuite/ld-scripts/rgn-at3.d new file mode 100644 index 00000000000..b4ffc7481dc --- /dev/null +++ b/ld/testsuite/ld-scripts/rgn-at3.d @@ -0,0 +1,12 @@ +# name: rgn-at3 +# source: rgn-at.s +# ld: -T rgn-at3.t +# objdump: -w -h + +.*: file format .* + +Sections: +Idx +Name +Size +VMA +LMA +File off +Algn +Flags + 0 .text +0+[0-9a-f] +0+0010000 +0+0020000 +.* + 1 .data +0+[0-9a-f] +0+00100[0-9a-f]+ +0+0030000 +.* + 2 .bss +0+[0-9a-f] +0+00100[0-9a-f]+ +0+00300[0-9a-f]+ +.* diff --git a/ld/testsuite/ld-scripts/rgn-at3.t b/ld/testsuite/ld-scripts/rgn-at3.t new file mode 100644 index 00000000000..4622e7ef742 --- /dev/null +++ b/ld/testsuite/ld-scripts/rgn-at3.t @@ -0,0 +1,13 @@ +/* Memory region at test, >AT should propagate by default */ + +MEMORY { + ram : ORIGIN = 0x10000, LENGTH = 0x100 + rom : ORIGIN = 0x20000, LENGTH = 0x200 +} +_start = 0x1000; +SECTIONS { + .text : { *(.text) } >ram AT>rom + .data : AT (0x30000) { *(.data) } >ram /* NO default AT>rom */ + .bss : { *(.bss) } >ram /* NO default AT>rom */ + /DISCARD/ : { *(*) } +}