1#!/bin/sh 2 3# script_test_3.sh -- test PHDRS 4 5# Copyright (C) 2008-2016 Free Software Foundation, Inc. 6# Written by Ian Lance Taylor <iant@google.com>. 7 8# This file is part of gold. 9 10# This program is free software; you can redistribute it and/or modify 11# it under the terms of the GNU General Public License as published by 12# the Free Software Foundation; either version 3 of the License, or 13# (at your option) any later version. 14 15# This program is distributed in the hope that it will be useful, 16# but WITHOUT ANY WARRANTY; without even the implied warranty of 17# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18# GNU General Public License for more details. 19 20# You should have received a copy of the GNU General Public License 21# along with this program; if not, write to the Free Software 22# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 23# MA 02110-1301, USA. 24 25# This file goes with script_test_3.t, which is a linker script which 26# uses a PHDRS clause. We run objdump -p on a program linked with 27# that linker script. 28 29check() 30{ 31 if ! grep -q "$2" "$1" 32 then 33 echo "Did not find expected segment in $1:" 34 echo " $2" 35 echo "" 36 echo "Actual output below:" 37 cat "$1" 38 exit 1 39 fi 40} 41 42check_count() 43{ 44 if test "`grep -c "$2" "$1"`" != "$3" 45 then 46 echo "Did not find expected segment in $1:" 47 echo " $2" 48 echo "" 49 echo "Actual output below:" 50 cat "$1" 51 exit 1 52 fi 53} 54 55check_count script_test_3.stdout "^ INTERP" 1 56check_count script_test_3.stdout "^ LOAD" 3 57check_count script_test_3.stdout "^ DYNAMIC" 1 58 59# Make sure that the size of the INTERP segment is the same as the 60# size of the .interp section. 61section=`fgrep .interp script_test_3.stdout | grep PROGBITS` 62if test "$section" = ""; then 63 echo "Did not find .interp section" 64 echo "" 65 echo "Actual output below:" 66 cat script_test_3.stdout 67 exit 1 68fi 69# Remove the brackets around the section number, since they can give 70# an unpredictable number of fields. 71section=`echo "$section" | sed -e 's/[][]*//g'` 72section_size=`echo "$section" | awk '{ print $6; }'` 73 74segment=`grep '^ INTERP' script_test_3.stdout` 75# We already checked above that we have an INTERP segment. 76segment_size=`echo "$segment" | awk '{ print $5; }'` 77 78# Now $section_size looks like 000013 and $segment_size looks like 79# 0x00013. Both numbers are in hex. 80section_size=`echo "$section_size" | sed -e 's/^0*//'` 81segment_size=`echo "$segment_size" | sed -e 's/^0x//' -e 's/^0*//'` 82 83if test "$section_size" != "$segment_size"; then 84 echo ".interp size $section_size != PT_INTERP size $segment_size" 85 exit 1 86fi 87 88# At least one PT_LOAD segment should have an alignment >= 0x100000. 89found=no 90for a in `grep LOAD script_test_3.stdout | sed -e 's/^.* 0x/0x/'`; do 91 script="BEGIN { if ($a >= 0x100000) { print \"true\" } else { print \"false\" } }" 92 x=`awk "$script" < /dev/null` 93 if test "$x" = "true"; then 94 found=yes 95 fi 96done 97if test "$found" = "no"; then 98 echo "no LOAD segment has required alignment" 99 exit 1 100fi 101 102exit 0 103