This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
maintaining LMA-VMA delta
- From: Nathan Sidwell <nathan at codesourcery dot com>
- To: binutils <binutils at sources dot redhat dot com>
- Date: Thu, 02 Apr 2009 15:16:24 +0100
- Subject: maintaining LMA-VMA delta
The linker's manual specifies:
"If neither @code{AT} nor @code{AT>} is specified for an allocatable
section, the linker will set the LMA such that the difference between
VMA and LMA for the section is the same as the preceding output
section in the same region. If there is no preceding output section
or the section is not allocatable, the linker will set the LMA equal
to the VMA."
This patch makes the linker do what that documentation specifies when using AT>.
the current behaviour for something like
.foo { ... } >bar AT>baz
.bar { ... > >bar
will set .bar's LMA to it's VMA, rather than place the LMA after foo's placement
in baz. That's contrary to what the document specifies.
This patch set's the lma_region on an output section iff
*) the user's not specified a load_base or lma_region
*) this section and the previous section were for the same region
*) the previous section has an lma_region (well, actually we copy NULL in that
case, which is equivalent).
This does have the potential of breaking linker scripts that relied on the
linker's implemented behaviour, rather than documented behaviour. the
alternative is to fix the documentation of course :)
tested in i686-pc-linux-gnu, ok?
nathan
--
Nathan Sidwell :: http://www.codesourcery.com :: CodeSourcery
2009-04-02 Nathan Sidwell <nathan@codesourcery.com>
* 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.
Index: ldlang.c
===================================================================
RCS file: /cvs/src/src/ld/ldlang.c,v
retrieving revision 1.303
diff -c -3 -p -r1.303 ldlang.c
*** ldlang.c 20 Mar 2009 17:39:03 -0000 1.303
--- ldlang.c 2 Apr 2009 14:04:39 -0000
*************** lang_leave_output_section_statement (fil
*** 6543,6548 ****
--- 6543,6557 ----
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 ();
Index: testsuite/ld-scripts/rgn-at.exp
===================================================================
RCS file: testsuite/ld-scripts/rgn-at.exp
diff -N testsuite/ld-scripts/rgn-at.exp
*** /dev/null 1 Jan 1970 00:00:00 -0000
--- testsuite/ld-scripts/rgn-at.exp 2 Apr 2009 14:04:43 -0000
***************
*** 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
+ }
Index: testsuite/ld-scripts/rgn-at.s
===================================================================
RCS file: testsuite/ld-scripts/rgn-at.s
diff -N testsuite/ld-scripts/rgn-at.s
*** /dev/null 1 Jan 1970 00:00:00 -0000
--- testsuite/ld-scripts/rgn-at.s 2 Apr 2009 14:04:43 -0000
***************
*** 0 ****
--- 1,6 ----
+ .text
+ .long 0x12345678
+ .data
+ .long 0x9abcdef0
+ .bss
+ .long 0
Index: testsuite/ld-scripts/rgn-at1.d
===================================================================
RCS file: testsuite/ld-scripts/rgn-at1.d
diff -N testsuite/ld-scripts/rgn-at1.d
*** /dev/null 1 Jan 1970 00:00:00 -0000
--- testsuite/ld-scripts/rgn-at1.d 2 Apr 2009 14:04:43 -0000
***************
*** 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]+ +.*
Index: testsuite/ld-scripts/rgn-at1.t
===================================================================
RCS file: testsuite/ld-scripts/rgn-at1.t
diff -N testsuite/ld-scripts/rgn-at1.t
*** /dev/null 1 Jan 1970 00:00:00 -0000
--- testsuite/ld-scripts/rgn-at1.t 2 Apr 2009 14:04:43 -0000
***************
*** 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/ : { *(*) }
+ }
Index: testsuite/ld-scripts/rgn-at2.d
===================================================================
RCS file: testsuite/ld-scripts/rgn-at2.d
diff -N testsuite/ld-scripts/rgn-at2.d
*** /dev/null 1 Jan 1970 00:00:00 -0000
--- testsuite/ld-scripts/rgn-at2.d 2 Apr 2009 14:04:43 -0000
***************
*** 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]+ +.*
Index: testsuite/ld-scripts/rgn-at2.t
===================================================================
RCS file: testsuite/ld-scripts/rgn-at2.t
diff -N testsuite/ld-scripts/rgn-at2.t
*** /dev/null 1 Jan 1970 00:00:00 -0000
--- testsuite/ld-scripts/rgn-at2.t 2 Apr 2009 14:04:43 -0000
***************
*** 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/ : { *(*) }
+ }
Index: testsuite/ld-scripts/rgn-at3.d
===================================================================
RCS file: testsuite/ld-scripts/rgn-at3.d
diff -N testsuite/ld-scripts/rgn-at3.d
*** /dev/null 1 Jan 1970 00:00:00 -0000
--- testsuite/ld-scripts/rgn-at3.d 2 Apr 2009 14:04:43 -0000
***************
*** 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]+ +.*
Index: testsuite/ld-scripts/rgn-at3.t
===================================================================
RCS file: testsuite/ld-scripts/rgn-at3.t
diff -N testsuite/ld-scripts/rgn-at3.t
*** /dev/null 1 Jan 1970 00:00:00 -0000
--- testsuite/ld-scripts/rgn-at3.t 2 Apr 2009 14:04:43 -0000
***************
*** 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/ : { *(*) }
+ }