This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
PATCH: Improved diagnosis of overflowed memory regions
- From: Zack Weinberg <zack at codesourcery dot com>
- To: binutils at sourceware dot org
- Date: Wed, 18 Jul 2007 15:06:20 -0700
- Subject: PATCH: Improved diagnosis of overflowed memory regions
[ For the curious - I'm doing some contract work for CodeSourcery over
the summer. ]
The linker's current diagnostics when a memory region overflows are
unhelpful in four ways. First, once a region is full, every output
section targeted to that region will generate another "region is full"
message. Second, you *also* get a flood of "section overlap" messages
for those sections, even though nothing the user did would have caused
section overlap if the memory regions were big enough. Third, while you
do get a mapfile if you give -Map, the reported position of every
section after the one that overflowed the region will be garbage.
Fourth, nothing tells you how big the region needs to be.
All these problems can be fixed with a few simple changes to ldlang.c.
The only nontrivial bit is that os_region_check was resetting
region->current to region->origin on overflow; that was the cause of the
section overlap messages and the unhelpful linker maps. As at that
point we are definitely not generating output, I believe it is safe to
remove it altogether; that makes the memory layout as reported in the
mapfile be what it would have been if the memory regions had all been
big enough, and section overlap is reported only if it's "real" (i.e. if
a region at lower addresses would have to be so big that it overlapped
a region at higher addresses.)
OK?
zw
ld:
* ldlang.c (lang_check_section_addresses): Also report size of
overflow for any overflowed memory regions.
(os_region_check): Diagnose an overflowed region only once per
region. Do not reset region->current on overflow.
ld/testsuite:
* ld-scripts/rgn-over.exp: New driver.
* ld-scripts/rgn-over.s: New file.
* ld-scripts/rgn-over1.d, ld-scripts/rgn-over1.t
* ld-scripts/rgn-over2.d, ld-scripts/rgn-over2.t
* ld-scripts/rgn-over3.d, ld-scripts/rgn-over3.t
* ld-scripts/rgn-over4.d, ld-scripts/rgn-over4.t
* ld-scripts/rgn-over5.d, ld-scripts/rgn-over5.t
* ld-scripts/rgn-over6.d, ld-scripts/rgn-over6.t
* ld-scripts/rgn-over7.d, ld-scripts/rgn-over7.t:
New test cases.
===================================================================
Index: ld/ldlang.c
--- ld/ldlang.c 13 Jul 2007 07:34:25 -0000 1.267
+++ ld/ldlang.c 18 Jul 2007 21:31:40 -0000
@@ -4114,7 +4114,8 @@ sort_sections_by_lma (const void *arg1,
/* Check to see if any allocated sections overlap with other allocated
sections. This can happen if a linker script specifies the output
- section addresses of the two sections. */
+ section addresses of the two sections. Also check whether any memory
+ region has overflowed. */
static void
lang_check_section_addresses (void)
@@ -4127,6 +4128,7 @@ lang_check_section_addresses (void)
bfd_vma os_start;
bfd_vma os_end;
bfd_size_type amt;
+ lang_memory_region_type *m;
if (bfd_count_sections (output_bfd) <= 1)
return;
@@ -4175,6 +4177,20 @@ lang_check_section_addresses (void)
}
free (sections);
+
+ /* If any memory region has overflowed, report by how much.
+ We do not issue this diagnostic for regions that had sections
+ explicitly placed outside their bounds; os_region_check's
+ diagnostics are adequate for that case.
+
+ FIXME: It is conceivable that m->current - (m->origin + m->length)
+ might overflow a 32-bit integer. There is, alas, no way to print
+ a bfd_vma quantity in decimal. */
+ for (m = lang_memory_region_list; m; m = m->next)
+ if (m->had_full_message)
+ einfo (_("%X%P: region %s overflowed by %ld bytes\n"),
+ m->name, (long)(m->current - (m->origin + m->length)));
+
}
/* Make sure the new address is within the region. We explicitly permit the
@@ -4202,15 +4218,15 @@ os_region_check (lang_output_section_sta
os->bfd_section->name,
region->name);
}
- else
+ else if (!region->had_full_message)
{
- einfo (_("%X%P: region %s is full (%B section %s)\n"),
- region->name,
+ region->had_full_message = TRUE;
+
+ einfo (_("%X%P: %B section %s will not fit in region %s\n"),
os->bfd_section->owner,
- os->bfd_section->name);
+ os->bfd_section->name,
+ region->name);
}
- /* Reset the region pointer. */
- region->current = region->origin;
}
}
===================================================================
Index: testsuite/ld-scripts/rgn-over.exp
--- testsuite/ld-scripts/rgn-over.exp 1 Jan 1970 00:00:00 -0000
+++ testsuite/ld-scripts/rgn-over.exp 18 Jul 2007 21:31:42 -0000
@@ -0,0 +1,46 @@
+# Test for proper diagnosis of overflowed memory regions.
+# Copyright 2007 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-over*.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
+
+ set testname "[file tail $test_name] (map check)"
+ if [file exists $map_file] {
+ # compare the map file to the expectations in the .d file
+ # (run_dump_test can't do that).
+ if [regexp_diff $map_file $test_file] {
+ fail $testname
+ } else {
+ pass $testname
+ }
+ } else {
+ untested $testname
+ }
+}
===================================================================
Index: testsuite/ld-scripts/rgn-over.s
--- testsuite/ld-scripts/rgn-over.s 1 Jan 1970 00:00:00 -0000
+++ testsuite/ld-scripts/rgn-over.s 18 Jul 2007 21:31:42 -0000
@@ -0,0 +1,9 @@
+ .section .text, "ax", "progbits"
+ .4byte 0x11223344
+ .4byte 0x55667788
+ .4byte 0x99aabbcc
+
+ .section .data, "aw", "progbits"
+ .4byte 0x01020304
+ .4byte 0x05060708
+ .4byte 0x090a0b0c
===================================================================
Index: testsuite/ld-scripts/rgn-over1.d
--- testsuite/ld-scripts/rgn-over1.d 1 Jan 1970 00:00:00 -0000
+++ testsuite/ld-scripts/rgn-over1.d 18 Jul 2007 21:31:42 -0000
@@ -0,0 +1,30 @@
+# name: rgn-over1
+# source: rgn-over.s
+# ld: -T rgn-over1.t -Map tmpdir/rgn-over1.map
+# error: \A[^:\n]*?ld[^:\n]*?: [^\n]*?section \.text will not fit in region r1\n[^:\n]*?ld[^:\n]*?: region r1 overflowed by 16 bytes\Z
+
+Memory\s+Configuration
+
+Name\s+Origin\s+Length\s+Attributes
+bss\s+0x0+0000\s+0x0+0000\s+xrw
+r1\s+0x0+1000\s+0x0+0008\s+xrw
+\*default\*\s+0x0+0000\s+0xf+ffff
+
+Linker\s+script\s+and\s+memory\s+map
+
+\s*0x0+1000\s+_start\s+=\s+0x1000
+
+\s*\.bss\s+0x0+0000\s+0x0
+\s*\*\(\.bss\)
+\s*\.bss\s+0x0+0000\s+0x0\s+.*?
+
+\s*\.text\s+0x0+1000\s+0xc
+\s*\*\(\.text\)
+\s*\.text\s+0x0+1000\s+0xc\s+.*?
+
+\s*\.data\s+0x0+100c\s+0xc
+\s*\*\(\.data\)
+\s*\.data\s+0x0+100c\s+0xc\s+.*?
+
+LOAD\s+.*?
+OUTPUT\(.*?\)
===================================================================
Index: testsuite/ld-scripts/rgn-over1.t
--- testsuite/ld-scripts/rgn-over1.t 1 Jan 1970 00:00:00 -0000
+++ testsuite/ld-scripts/rgn-over1.t 18 Jul 2007 21:31:42 -0000
@@ -0,0 +1,12 @@
+/* Memory region overflow tests: one region, first output sect doesn't fit. */
+
+MEMORY {
+ bss (rwx) : ORIGIN = 0, LENGTH = 0
+ r1 (rwx) : ORIGIN = 0x1000, LENGTH = 8
+}
+_start = 0x1000;
+SECTIONS {
+ .bss : { *(.bss) } > bss
+ .text : { *(.text) } > r1
+ .data : { *(.data) } > r1
+}
===================================================================
Index: testsuite/ld-scripts/rgn-over2.d
--- testsuite/ld-scripts/rgn-over2.d 1 Jan 1970 00:00:00 -0000
+++ testsuite/ld-scripts/rgn-over2.d 18 Jul 2007 21:31:42 -0000
@@ -0,0 +1,30 @@
+# name: rgn-over2
+# source: rgn-over.s
+# ld: -T rgn-over2.t -Map tmpdir/rgn-over2.map
+# error: \A[^:\n]*?ld[^:\n]*?: [^\n]*?section \.data will not fit in region r1\n[^:\n]*?ld[^:\n]*?: region r1 overflowed by 4 bytes\Z
+
+Memory\s+Configuration
+
+Name\s+Origin\s+Length\s+Attributes
+bss\s+0x0+0000\s+0x0+0000\s+xrw
+r1\s+0x0+1000\s+0x0+0014\s+xrw
+\*default\*\s+0x0+0000\s+0xf+ffff
+
+Linker\s+script\s+and\s+memory\s+map
+
+\s*0x0+1000\s+_start\s+=\s+0x1000
+
+\s*\.bss\s+0x0+0000\s+0x0
+\s*\*\(\.bss\)
+\s*\.bss\s+0x0+0000\s+0x0\s+.*?
+
+\s*\.text\s+0x0+1000\s+0xc
+\s*\*\(\.text\)
+\s*\.text\s+0x0+1000\s+0xc\s+.*?
+
+\s*\.data\s+0x0+100c\s+0xc
+\s*\*\(\.data\)
+\s*\.data\s+0x0+100c\s+0xc\s+.*?
+
+LOAD\s+.*?
+OUTPUT\(.*?\)
===================================================================
Index: testsuite/ld-scripts/rgn-over2.t
--- testsuite/ld-scripts/rgn-over2.t 1 Jan 1970 00:00:00 -0000
+++ testsuite/ld-scripts/rgn-over2.t 18 Jul 2007 21:31:42 -0000
@@ -0,0 +1,13 @@
+/* Memory region overflow tests: one region, first output sect fits,
+ second doesn't. */
+
+MEMORY {
+ bss (rwx) : ORIGIN = 0, LENGTH = 0
+ r1 (rwx) : ORIGIN = 0x1000, LENGTH = 20
+}
+_start = 0x1000;
+SECTIONS {
+ .bss : { *(.bss) } > bss
+ .text : { *(.text) } > r1
+ .data : { *(.data) } > r1
+}
===================================================================
Index: testsuite/ld-scripts/rgn-over3.d
--- testsuite/ld-scripts/rgn-over3.d 1 Jan 1970 00:00:00 -0000
+++ testsuite/ld-scripts/rgn-over3.d 18 Jul 2007 21:31:43 -0000
@@ -0,0 +1,31 @@
+# name: rgn-over3
+# source: rgn-over.s
+# ld: -T rgn-over3.t -Map tmpdir/rgn-over3.map
+# error: \A[^:\n]*?ld[^:\n]*?: [^\n]*?section \.text will not fit in region r1\n[^:\n]*?ld[^:\n]*?: [^\n]*?section \.data will not fit in region r2\n[^:\n]*?ld[^:\n]*?: region r1 overflowed by 4 bytes\n[^:\n]*?ld[^:\n]*?: region r2 overflowed by 4 bytes\Z
+
+Memory\s+Configuration
+
+Name\s+Origin\s+Length\s+Attributes
+bss\s+0x0+0000\s+0x0+0000\s+xrw
+r1\s+0x0+1000\s+0x0+0008\s+xrw
+r2\s+0x0+2000\s+0x0+0008\s+xrw
+\*default\*\s+0x0+0000\s+0xf+ffff
+
+Linker\s+script\s+and\s+memory\s+map
+
+\s*0x0+1000\s+_start\s+=\s+0x1000
+
+\s*\.bss\s+0x0+0000\s+0x0
+\s*\*\(\.bss\)
+\s*\.bss\s+0x0+0000\s+0x0\s+.*?
+
+\s*\.text\s+0x0+1000\s+0xc
+\s*\*\(\.text\)
+\s*\.text\s+0x0+1000\s+0xc\s+.*?
+
+\s*\.data\s+0x0+2000\s+0xc
+\s*\*\(\.data\)
+\s*\.data\s+0x0+2000\s+0xc\s+.*?
+
+LOAD\s+.*?
+OUTPUT\(.*?\)
===================================================================
Index: testsuite/ld-scripts/rgn-over3.t
--- testsuite/ld-scripts/rgn-over3.t 1 Jan 1970 00:00:00 -0000
+++ testsuite/ld-scripts/rgn-over3.t 18 Jul 2007 21:31:43 -0000
@@ -0,0 +1,14 @@
+/* Memory region overflow tests: two regions, each too small for the single
+ section placed there. */
+
+MEMORY {
+ bss (rwx) : ORIGIN = 0, LENGTH = 0
+ r1 (rwx) : ORIGIN = 0x1000, LENGTH = 8
+ r2 (rwx) : ORIGIN = 0x2000, LENGTH = 8
+}
+_start = 0x1000;
+SECTIONS {
+ .bss : { *(.bss) } > bss
+ .text : { *(.text) } > r1
+ .data : { *(.data) } > r2
+}
===================================================================
Index: testsuite/ld-scripts/rgn-over4.d
--- testsuite/ld-scripts/rgn-over4.d 1 Jan 1970 00:00:00 -0000
+++ testsuite/ld-scripts/rgn-over4.d 18 Jul 2007 21:31:43 -0000
@@ -0,0 +1,31 @@
+# name: rgn-over4
+# source: rgn-over.s
+# ld: -T rgn-over4.t -Map tmpdir/rgn-over4.map
+# error: \A[^:\n]*?ld[^:\n]*?: [^:\n]*?section \.text will not fit in region r1\n[^:\n]*?ld[^:\n]*?: region r1 overflowed by 16 bytes\Z
+
+Memory\s+Configuration
+
+Name\s+Origin\s+Length\s+Attributes
+bss\s+0x0+0000\s+0x0+0000\s+xrw
+r1\s+0x0+1000\s+0x0+0008\s+xrw
+v1\s+0x0+2000\s+0x0+0018\s+xrw
+\*default\*\s+0x0+0000\s+0xf+ffff
+
+Linker\s+script\s+and\s+memory\s+map
+
+\s*0x0+1000\s+_start\s+=\s+0x1000
+
+\s*\.bss\s+0x0+0000\s+0x0
+\s*\*\(\.bss\)
+\s*\.bss\s+0x0+0000\s+0x0\s+.*?
+
+\s*\.text\s+0x0+1000\s+0xc\s+load\s+address\s+0x0+2000
+\s*\*\(\.text\)
+\s*\.text\s+0x0+1000\s+0xc\s+.*?
+
+\s*\.data\s+0x0+100c\s+0xc\s+load\s+address\s+0x0+200c
+\s*\*\(\.data\)
+\s*\.data\s+0x0+100c\s+0xc\s+.*?
+
+LOAD\s+.*?
+OUTPUT\(.*?\)
===================================================================
Index: testsuite/ld-scripts/rgn-over4.t
--- testsuite/ld-scripts/rgn-over4.t 1 Jan 1970 00:00:00 -0000
+++ testsuite/ld-scripts/rgn-over4.t 18 Jul 2007 21:31:43 -0000
@@ -0,0 +1,13 @@
+/* Memory region overflow tests: overflow VMA but not LMA. */
+
+MEMORY {
+ bss (rwx) : ORIGIN = 0, LENGTH = 0
+ r1 (rwx) : ORIGIN = 0x1000, LENGTH = 8
+ v1 (rwx) : ORIGIN = 0x2000, LENGTH = 24
+}
+_start = 0x1000;
+SECTIONS {
+ .bss : { *(.bss) } > bss
+ .text : { *(.text) } > r1 AT> v1
+ .data : { *(.data) } > r1 AT> v1
+}
===================================================================
Index: testsuite/ld-scripts/rgn-over5.d
--- testsuite/ld-scripts/rgn-over5.d 1 Jan 1970 00:00:00 -0000
+++ testsuite/ld-scripts/rgn-over5.d 18 Jul 2007 21:31:43 -0000
@@ -0,0 +1,31 @@
+# name: rgn-over5
+# source: rgn-over.s
+# ld: -T rgn-over5.t -Map tmpdir/rgn-over5.map
+# error: \A[^:\n]*?ld[^:\n]*?: [^\n]*?section \.text will not fit in region v1\n[^:\n]*?ld[^:\n]*?: region v1 overflowed by 16 bytes\Z
+
+Memory\s+Configuration
+
+Name\s+Origin\s+Length\s+Attributes
+bss\s+0x0+0000\s+0x0+0000\s+xrw
+r1\s+0x0+1000\s+0x0+0018\s+xrw
+v1\s+0x0+2000\s+0x0+0008\s+xrw
+\*default\*\s+0x0+0000\s+0xf+ffff
+
+Linker\s+script\s+and\s+memory\s+map
+
+\s*0x0+1000\s+_start\s+=\s+0x1000
+
+\s*\.bss\s+0x0+0000\s+0x0
+\s*\*\(\.bss\)
+\s*\.bss\s+0x0+0000\s+0x0\s+.*?
+
+\s*\.text\s+0x0+1000\s+0xc\s+load\s+address\s+0x0+2000
+\s*\*\(\.text\)
+\s*\.text\s+0x0+1000\s+0xc\s+.*?
+
+\s*\.data\s+0x0+100c\s+0xc\s+load\s+address\s+0x0+200c
+\s*\*\(\.data\)
+\s*\.data\s+0x0+100c\s+0xc\s+.*?
+
+LOAD\s+.*?
+OUTPUT\(.*?\)
===================================================================
Index: testsuite/ld-scripts/rgn-over5.t
--- testsuite/ld-scripts/rgn-over5.t 1 Jan 1970 00:00:00 -0000
+++ testsuite/ld-scripts/rgn-over5.t 18 Jul 2007 21:31:43 -0000
@@ -0,0 +1,13 @@
+/* Memory region overflow tests: overflow LMA but not VMA. */
+
+MEMORY {
+ bss (rwx) : ORIGIN = 0, LENGTH = 0
+ r1 (rwx) : ORIGIN = 0x1000, LENGTH = 24
+ v1 (rwx) : ORIGIN = 0x2000, LENGTH = 8
+}
+_start = 0x1000;
+SECTIONS {
+ .bss : { *(.bss) } > bss
+ .text : { *(.text) } > r1 AT> v1
+ .data : { *(.data) } > r1 AT> v1
+}
===================================================================
Index: testsuite/ld-scripts/rgn-over6.d
--- testsuite/ld-scripts/rgn-over6.d 1 Jan 1970 00:00:00 -0000
+++ testsuite/ld-scripts/rgn-over6.d 18 Jul 2007 21:31:43 -0000
@@ -0,0 +1,31 @@
+# name: rgn-over6
+# source: rgn-over.s
+# ld: -T rgn-over6.t -Map tmpdir/rgn-over6.map
+# error: \A[^:\n]*?ld[^:\n]*?: [^\n]*?section \.text will not fit in region r1\n[^:\n]*?ld[^:\n]*?: [^\n]*?section \.text will not fit in region v1\n[^:\n]*?ld[^:\n]*?: region r1 overflowed by 16 bytes\n[^:\n]*?ld[^:\n]*?: region v1 overflowed by 16 bytes\Z
+
+Memory\s+Configuration
+
+Name\s+Origin\s+Length\s+Attributes
+bss\s+0x0+0000\s+0x0+0000\s+xrw
+r1\s+0x0+1000\s+0x0+0008\s+xrw
+v1\s+0x0+2000\s+0x0+0008\s+xrw
+\*default\*\s+0x0+0000\s+0xf+ffff
+
+Linker\s+script\s+and\s+memory\s+map
+
+\s*0x0+1000\s+_start\s+=\s+0x1000
+
+\s*\.bss\s+0x0+0000\s+0x0
+\s*\*\(\.bss\)
+\s*\.bss\s+0x0+0000\s+0x0\s+.*?
+
+\s*\.text\s+0x0+1000\s+0xc\s+load\s+address\s+0x0+2000
+\s*\*\(\.text\)
+\s*\.text\s+0x0+1000\s+0xc\s+.*?
+
+\s*\.data\s+0x0+100c\s+0xc\s+load\s+address\s+0x0+200c
+\s*\*\(\.data\)
+\s*\.data\s+0x0+100c\s+0xc\s+.*?
+
+LOAD\s+.*?
+OUTPUT\(.*?\)
===================================================================
Index: testsuite/ld-scripts/rgn-over6.t
--- testsuite/ld-scripts/rgn-over6.t 1 Jan 1970 00:00:00 -0000
+++ testsuite/ld-scripts/rgn-over6.t 18 Jul 2007 21:31:43 -0000
@@ -0,0 +1,13 @@
+/* Memory region overflow tests: overflow LMA and VMA. */
+
+MEMORY {
+ bss (rwx) : ORIGIN = 0, LENGTH = 0
+ r1 (rwx) : ORIGIN = 0x1000, LENGTH = 8
+ v1 (rwx) : ORIGIN = 0x2000, LENGTH = 8
+}
+_start = 0x1000;
+SECTIONS {
+ .bss : { *(.bss) } > bss
+ .text : { *(.text) } > r1 AT> v1
+ .data : { *(.data) } > r1 AT> v1
+}
===================================================================
Index: testsuite/ld-scripts/rgn-over7.d
--- testsuite/ld-scripts/rgn-over7.d 1 Jan 1970 00:00:00 -0000
+++ testsuite/ld-scripts/rgn-over7.d 18 Jul 2007 21:31:43 -0000
@@ -0,0 +1,31 @@
+# name: rgn-over7
+# source: rgn-over.s
+# ld: -T rgn-over7.t -Map tmpdir/rgn-over7.map
+# error: \A[^:\n]*?ld[^:\n]*?: [^\n]*?section \.text will not fit in region r1\n[^:\n]*?ld[^:\n]*?: section \.data \[0+1008 -> 0+1013\] overlaps section \.text \[0+1000 -> 0+100b\]\n[^:\n]*?ld[^:\n]*?: region r1 overflowed by 4 bytes\Z
+
+Memory\s+Configuration
+
+Name\s+Origin\s+Length\s+Attributes
+bss\s+0x0+0000\s+0x0+0000\s+xrw
+r1\s+0x0+1000\s+0x0+0008\s+xrw
+r2\s+0x0+1008\s+0x0+000c\s+xrw
+\*default\*\s+0x0+0000\s+0xf+ffff
+
+Linker\s+script\s+and\s+memory\s+map
+
+\s*0x0+1000\s+_start\s+=\s+0x1000
+
+\s*\.bss\s+0x0+0000\s+0x0
+\s*\*\(\.bss\)
+\s*\.bss\s+0x0+0000\s+0x0\s+.*?
+
+\s*\.text\s+0x0+1000\s+0xc
+\s*\*\(\.text\)
+\s*\.text\s+0x0+1000\s+0xc\s+.*?
+
+\s*\.data\s+0x0+1008\s+0xc
+\s*\*\(\.data\)
+\s*\.data\s+0x0+1008\s+0xc\s+.*?
+
+LOAD\s+.*?
+OUTPUT\(.*?\)
===================================================================
Index: testsuite/ld-scripts/rgn-over7.t
--- testsuite/ld-scripts/rgn-over7.t 1 Jan 1970 00:00:00 -0000
+++ testsuite/ld-scripts/rgn-over7.t 18 Jul 2007 21:31:43 -0000
@@ -0,0 +1,13 @@
+/* Memory region overflow tests: overflow r1 plus text/data collision. */
+
+MEMORY {
+ bss (rwx) : ORIGIN = 0, LENGTH = 0
+ r1 (rwx) : ORIGIN = 0x1000, LENGTH = 8
+ r2 (rwx) : ORIGIN = 0x1008, LENGTH = 12
+}
+_start = 0x1000;
+SECTIONS {
+ .bss : { *(.bss) } > bss
+ .text : { *(.text) } > r1
+ .data : { *(.data) } > r2
+}