=================================================================== 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 +}