From 2e658c87813a0941392e87843427f8495dd9eecf Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Wed, 30 Jul 2008 10:28:31 +0000 Subject: [PATCH] * ld-elf/sec-to-seg.exp: New test: Checks the assignment of sections to segments. * ld-elf/sec-to-seg1.s: Test source file. * ld-elf/sec-to-seg2.s: Test source file. * ld-elf/sec-to-seg-script-same-page.t: Test linker script. * ld-elf/sec-to-seg-script-adjoining-pages.t: Test linker script. * ld-elf/sec-to-seg-script-disjoint-pages.t: Test linker script. --- ld/testsuite/ChangeLog | 10 +++ .../ld-elf/sec-to-seg-script-adjoining-pages.t | 11 +++ .../ld-elf/sec-to-seg-script-disjoint-pages.t | 11 +++ ld/testsuite/ld-elf/sec-to-seg-script-same-page.t | 10 +++ ld/testsuite/ld-elf/sec-to-seg.exp | 97 ++++++++++++++++++++++ ld/testsuite/ld-elf/sec-to-seg1.s | 9 ++ ld/testsuite/ld-elf/sec-to-seg2.s | 13 +++ 7 files changed, 161 insertions(+) create mode 100644 ld/testsuite/ld-elf/sec-to-seg-script-adjoining-pages.t create mode 100644 ld/testsuite/ld-elf/sec-to-seg-script-disjoint-pages.t create mode 100644 ld/testsuite/ld-elf/sec-to-seg-script-same-page.t create mode 100644 ld/testsuite/ld-elf/sec-to-seg.exp create mode 100644 ld/testsuite/ld-elf/sec-to-seg1.s create mode 100644 ld/testsuite/ld-elf/sec-to-seg2.s diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 6d881ca..93a5e41 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,13 @@ +2008-07-30 Nick Clifton + + * ld-elf/sec-to-seg.exp: New test: Checks the assignment of + sections to segments. + * ld-elf/sec-to-seg1.s: Test source file. + * ld-elf/sec-to-seg2.s: Test source file. + * ld-elf/sec-to-seg-script-same-page.t: Test linker script. + * ld-elf/sec-to-seg-script-adjoining-pages.t: Test linker script. + * ld-elf/sec-to-seg-script-disjoint-pages.t: Test linker script. + 2008-07-28 Alexandre Oliva * ld-i386/tlsbindesc.dd: Adjust incorrect expectations for LD to diff --git a/ld/testsuite/ld-elf/sec-to-seg-script-adjoining-pages.t b/ld/testsuite/ld-elf/sec-to-seg-script-adjoining-pages.t new file mode 100644 index 0000000..763fcb7 --- /dev/null +++ b/ld/testsuite/ld-elf/sec-to-seg-script-adjoining-pages.t @@ -0,0 +1,11 @@ +SECTIONS +{ + . = 0x1000; + .sec1 : { *sec-to-seg1.o(.rodata) } + . += CONSTANT(MAXPAGESIZE); + .sec2 : { *sec-to-seg2.o(.rodata) } + + .data : { *(.data) } /* For hppa64. */ + + /DISCARD/ : {*(*) } +} diff --git a/ld/testsuite/ld-elf/sec-to-seg-script-disjoint-pages.t b/ld/testsuite/ld-elf/sec-to-seg-script-disjoint-pages.t new file mode 100644 index 0000000..25023cc --- /dev/null +++ b/ld/testsuite/ld-elf/sec-to-seg-script-disjoint-pages.t @@ -0,0 +1,11 @@ +SECTIONS +{ + . = 0x1000; + .sec1 : { *sec-to-seg1.o(.rodata) } + . += CONSTANT(MAXPAGESIZE) * 2; + .sec2 : { *sec-to-seg2.o(.rodata) } + + .data : { *(.data) } /* For hppa64. */ + + /DISCARD/ : {*(*) } +} diff --git a/ld/testsuite/ld-elf/sec-to-seg-script-same-page.t b/ld/testsuite/ld-elf/sec-to-seg-script-same-page.t new file mode 100644 index 0000000..2b50f7e --- /dev/null +++ b/ld/testsuite/ld-elf/sec-to-seg-script-same-page.t @@ -0,0 +1,10 @@ +SECTIONS +{ + . = 0x1000; + .sec1 : { *sec-to-seg1.o(.rodata) } + .sec2 : { *sec-to-seg2.o(.rodata) } + + .data : { *(.data) } /* For hppa64. */ + + /DISCARD/ : {*(*) } +} diff --git a/ld/testsuite/ld-elf/sec-to-seg.exp b/ld/testsuite/ld-elf/sec-to-seg.exp new file mode 100644 index 0000000..a576fce --- /dev/null +++ b/ld/testsuite/ld-elf/sec-to-seg.exp @@ -0,0 +1,97 @@ +# Test the assigment of sections to segments. +# +# Copyright 2008 Free Software Foundation, Inc. +# Contributed by Red Hat. +# +# 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. + +set testname "assignment of ELF sections to segments" + +if {! [is_elf_format] } { + unsupported $testname + return +} + +if { ! [ld_assemble $as $srcdir/$subdir/sec-to-seg1.s tmpdir/sec-to-seg1.o] + || ! [ld_assemble $as $srcdir/$subdir/sec-to-seg2.s tmpdir/sec-to-seg2.o]} then { + unresolved $testname + return +} + +proc sec_to_seg_test { testname scriptname same_seg } { + global srcdir + global subdir + global ld + global exec_output + global READELF + + if {! [ld_simple_link $ld tmpdir/sec-to-seg "-T $srcdir/$subdir/$scriptname tmpdir/sec-to-seg1.o tmpdir/sec-to-seg2.o"] } then { + fail $testname + return 0 + } + + send_log "$READELF --program-headers --section-headers tmpdir/sec-to-seg\n" + set exec_output [run_host_cmd "$READELF" "--program-headers --section-headers tmpdir/sec-to-seg"] + + if { $same_seg == 1 } { + if {! [regexp ".*.sec1 .sec2" $exec_output] } { + fail $testname + return 0 + } + } else { + if { [regexp ".*.sec1 .sec2" $exec_output] } { + fail $testname + return 0 + } + } + + pass $testname + return 1 +} + +# Assuming a pagesize of 0x1000 then: +# +# Test Sec1 End Sec 2 Start Expected Result +# ---- -------- ----------- --------------- +# A 00001042 00001043 Both sections on same page: assign to same segment. +# B 00001042 00002044 Sections on adjacent pages: assign to same segment. +# C 00001042 00003044 Sections on disjoint pages: assign to separate segments. + +# These targets have a pagesize of 1, so they will always end up +# placing the two sections in separate segments in the B test. +if { [istarget avr-*-*] + || [istarget cr16-*-*] + || [istarget crx-*-*] + || [istarget dlx-*-*] + || [istarget h8300-*-*] + || [istarget ip2k-*-*] + || [istarget m32r-*-*] + || [istarget m88k-*-*] + || [istarget msp430-*-*] + } { + set B_test_same_seg 0 +} else { + set B_test_same_seg 1 +} + +sec_to_seg_test "assignment of ELF sections to segments (same page)" "sec-to-seg-script-same-page.t" 1 +sec_to_seg_test "assignment of ELF sections to segments (adjacent pages)" "sec-to-seg-script-adjoining-pages.t" $B_test_same_seg +sec_to_seg_test "assignment of ELF sections to segments (disjoint pages)" "sec-to-seg-script-disjoint-pages.t" 0 + + +# FIXME: Add more tests to check other rules of section to segment assignment. diff --git a/ld/testsuite/ld-elf/sec-to-seg1.s b/ld/testsuite/ld-elf/sec-to-seg1.s new file mode 100644 index 0000000..7c9f479 --- /dev/null +++ b/ld/testsuite/ld-elf/sec-to-seg1.s @@ -0,0 +1,9 @@ + .file "sec-to-seg1.s" + + .section .rodata + .align 2 + .ascii "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\000" + .align 2 + .ascii "00000000000000000000000000000000\000" + + diff --git a/ld/testsuite/ld-elf/sec-to-seg2.s b/ld/testsuite/ld-elf/sec-to-seg2.s new file mode 100644 index 0000000..b1dd078 --- /dev/null +++ b/ld/testsuite/ld-elf/sec-to-seg2.s @@ -0,0 +1,13 @@ + .file "sec-to-seg2.s" + + .section .rodata + .align 2 + .ascii "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz\000" + .align 2 + .ascii "55555555555555555555555555555555\000" + .align 2 + .ascii "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\000" + .align 2 + .ascii "99999999999999999999999999999999\000" + + -- 2.7.4