| # 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. |