packaging: changed asan macro check for "bad %if condition"
[platform/upstream/prelink.git] / testsuite / quick2.sh
1 #!/bin/bash
2 . `dirname $0`/functions.sh
3
4 #exit 77 # requires -fPIE
5
6 check_one() {
7   cnt=0
8   log=$1
9   echo -n . >> quick2.log
10   text="$2"
11   shift 2
12   while [ $# -gt 0 ]; do
13     grep -q "^$text .*$1" $log || exit 40
14     cnt=$((++cnt))
15     shift
16   done
17   [ `grep "^$text " $log | wc -l` = $cnt ] || exit 41
18 }
19 check_log() {
20   log=$1
21   echo -n "Checking $1 " >> quick2.log
22   check_one $log 'Checking executable' $CHECKE
23   check_one $log 'Checking shared library' $CHECKL
24   check_one $log 'Assuming prelinked' $ASSUME
25   check_one $log 'Prelinking' $PREL
26   check_one $log 'Assuming non-prelinkable' $UNPREL
27   echo >> quick2.log
28 }
29
30 PRELINK=`echo $PRELINK \
31          | sed -e 's, \./\(prelink\.\(cache\|conf\)\), quick2.tree/etc/\1,g' \
32                -e 's,path=\.,path=quick2.tree/lib:quick2.tree/usr/lib,' \
33                -e 's,linker=\./,linker=quick2.tree/lib/,'`
34 CCLINK=`echo $CCLINK \
35         | sed -e 's,linker=\./,linker=quick2.tree/lib/,'`
36 rm -rf quick2.tree
37 rm -f quick2.log
38 mkdir -p quick2.tree/{lib,etc,usr/lib,usr/bin}
39 $CC -shared -O2 -fpic -o quick2.tree/usr/lib/lib1.so $srcdir/reloc1lib1.c
40 $CC -shared -O2 -fpic -o quick2.tree/usr/lib/lib2.so $srcdir/reloc1lib2.c \
41     -L quick2.tree/usr/lib -l1
42 $CC -shared -O2 -fpic -o quick2.tree/usr/lib/lib3.so $srcdir/quick1lib1.c
43 $CC -shared -O2 -fpic -o quick2.tree/usr/lib/lib2.later.so \
44     $srcdir/quick1lib2.c -L quick2.tree/usr/lib -l1 -l3
45 echo 'int foo;' | $CC -shared -O2 -fpic -o quick2.tree/usr/lib/lib4.so -xc -
46 $CC -shared -O2 -fpic -o quick2.tree/usr/lib/lib5.so $srcdir/quick1lib3.c \
47     -L quick2.tree/usr/lib -Wl,--rpath-link,quick2.tree/usr/lib -l2
48 $CC -shared -O2 -fpic -o quick2.tree/usr/lib/lib6.so $srcdir/quick1lib4.c \
49     -L quick2.tree/usr/lib -Wl,--rpath-link,quick2.tree/usr/lib -l5
50 echo 'int baz;' | $CC -shared -O2 -fpic -o quick2.tree/usr/lib/lib7.so -xc - \
51     -L quick2.tree/usr/lib -Wl,--rpath-link,quick2.tree/usr/lib -l6 \
52     -Wl,--spare-dynamic-tags=0
53 echo 'int baz;' | $CC -shared -O2 -fpic -o quick2.tree/usr/lib/lib7.later.so \
54     -xc - -L quick2.tree/usr/lib -Wl,--rpath-link,quick2.tree/usr/lib -l2
55 for lib in `cat syslib.list`; do
56   cp -p $lib.orig quick2.tree/lib/$lib
57   cp -p $lib.orig quick2.tree/lib/$lib.orig
58 done
59 for lib in `cat syslnk.list`; do
60   cp -dp $lib quick2.tree/lib
61 done
62 $CCLINK -o quick2.tree/usr/bin/bin1 $srcdir/reloc1.c \
63     -Wl,--rpath-link,quick2.tree/usr/lib -L quick2.tree/usr/lib -l2 -lc -l1
64 echo 'int main () { extern int foo; return foo; }' \
65   | $CCLINK -o quick2.tree/usr/bin/bin2 -xc - -xnone \
66     -L quick2.tree/usr/lib -l4
67 $CCLINK -o quick2.tree/usr/bin/bin3 $srcdir/reloc1.c \
68     -Wl,--rpath-link,quick2.tree/usr/lib -L quick2.tree/usr/lib -l7 -lc -l2 -l1
69 $CCLINK -o quick2.tree/usr/bin/bin4 $srcdir/quick1.c \
70     -Wl,--rpath-link,quick2.tree/usr/lib -L quick2.tree/usr/lib -l2 -lc -l1
71 $CCLINK -o quick2.tree/usr/bin/bin5 $srcdir/quick1.c \
72     -Wl,--rpath-link,quick2.tree/usr/lib -L quick2.tree/usr/lib -l7 -lc -l2 -l1
73 echo 'int main () { return 0; }' \
74   | $CCLINK -o quick2.tree/usr/bin/bin6 -xc - -xnone \
75     -Wl,--rpath-link,quick2.tree/usr/lib -L quick2.tree/usr/lib -l6
76 echo 'int main () { return 0; }' \
77   | $CCLINK -o quick2.tree/usr/bin/bin7 -static -xc - -xnone
78 cat > quick2.tree/usr/bin/bin8 <<EOF
79 #!/bin/sh
80 echo This is a sample shell script
81 echo used to test whether even shell scripts
82 echo and other executable non-ELF files
83 echo are cached as non-prelinkable
84 echo in /etc/prelink.cache and thus do not
85 echo need to be reread every time prelink -aq
86 echo is run.
87 exit 0
88 EOF
89 chmod 755 quick2.tree/usr/bin/bin8
90 cat > quick2.tree/usr/bin/bin9.sh <<EOF
91 #!/bin/sh
92 echo This is another sample shell script,
93 echo this time with a .sh extension.
94 echo This does not need to be even cached
95 echo as non-prelinkable, provided -b *.sh
96 echo is present in prelink.conf.
97 exit 0
98 EOF
99 chmod 755 quick2.tree/usr/bin/bin9.sh
100 cat > quick2.tree/usr/bin/bin10.py <<EOF
101 #! /usr/bin/env python
102 print "This is a sample python script."
103 print "This does not need to be even cached"
104 print "as non-prelinkable, provided -b *.py"
105 print "is present in prelink.conf."
106 EOF
107 chmod 755 quick2.tree/usr/bin/bin10.py
108 cat > quick2.tree/usr/bin/bin11.script <<EOF
109 #!/bin/sh
110 echo This is another sample shell script,
111 echo this time matching b*11*r[hijk]*t shell pattern.
112 echo This does not need to be even cached
113 echo as non-prelinkable, provided -b b*11*r[hijk]*t
114 echo is present in prelink.conf.
115 exit 0
116 EOF
117 chmod 755 quick2.tree/usr/bin/bin11.script
118 echo 'int main () { return 0; }' \
119   | $CCLINK -o quick2.tree/usr/bin/bin12 -pie -fPIE -xc - -xnone
120 cat > quick2.tree/etc/prelink.conf <<EOF
121 -b *.sh
122 -c quick2.tree/etc/prelink.conf.d/*.conf
123 EOF
124 mkdir quick2.tree/etc/prelink.conf.d
125 echo '-b *.py' > quick2.tree/etc/prelink.conf.d/py.conf
126 echo '-b b*11*r[hijk]*t' > quick2.tree/etc/prelink.conf.d/script.conf
127 cat > quick2.tree/etc/prelink.conf.d/rest.conf <<EOF
128 quick2.tree/usr/bin
129 quick2.tree/lib
130 quick2.tree/usr/lib
131 EOF
132 LIBS="quick2.tree/usr/lib/lib1.so quick2.tree/usr/lib/lib2.so"
133 LIBS="$LIBS quick2.tree/usr/lib/lib3.so quick2.tree/usr/lib/lib4.so"
134 LIBS="$LIBS quick2.tree/usr/lib/lib5.so quick2.tree/usr/lib/lib6.so"
135 LIBS="$LIBS quick2.tree/usr/lib/lib7.so"
136 LIBS="$LIBS `sed 's|^|quick2.tree/lib/|' syslib.list`"
137 BINS="quick2.tree/usr/bin/bin1 quick2.tree/usr/bin/bin2"
138 BINS="$BINS quick2.tree/usr/bin/bin3 quick2.tree/usr/bin/bin4"
139 BINS="$BINS quick2.tree/usr/bin/bin5 quick2.tree/usr/bin/bin6"
140 BINS="$BINS quick2.tree/usr/bin/bin7 quick2.tree/usr/bin/bin8"
141 savelibs
142 chmod 644 `ls $BINS | sed 's|$|.orig|'`
143 # Make sure prelinked binaries and libraries will have different ctimes
144 # than mtimes
145 sleep 3s
146 # lib2.later.so needs different timestamps than lib2.so for the tests below
147 touch quick2.tree/usr/lib/lib2.later.so
148 cp -p quick2.tree/usr/lib/lib2.later.so{,.orig}
149 # lib7.later.so needs different timestamps than lib7.so for the tests below
150 touch quick2.tree/usr/lib/lib7.later.so
151 cp -p quick2.tree/usr/lib/lib7.later.so{,.orig}
152 echo $PRELINK ${PRELINK_OPTS--vm} -avvvvv > quick2.log
153 $PRELINK ${PRELINK_OPTS--vm} -avvvvv > quick2.tree/etc/log1 2>&1 || exit 1
154 cat quick2.tree/etc/log1 >> quick2.log
155 grep -q 'lib7.so: Not enough room to add .dynamic entry' \
156   quick2.tree/etc/log1 || exit 60
157 grep -q 'Could not prelink .*bin3 because its dependency .*lib7.so could not be prelinked' \
158   quick2.tree/etc/log1 || exit 61
159 grep -q 'Could not prelink .*bin5 because its dependency .*lib7.so could not be prelinked' \
160   quick2.tree/etc/log1 || exit 62
161 echo $PRELINK ${PRELINK_OPTS--vm} -aqvvvvv >> quick2.log
162 $PRELINK ${PRELINK_OPTS--vm} -aqvvvvv > quick2.tree/etc/log2 2>&1 || exit 2
163 cat quick2.tree/etc/log2 >> quick2.log
164 stat quick2.tree/usr/lib/lib2.so >> quick2.log
165 echo chmod 644 quick2.tree/usr/lib/lib2.so >> quick2.log
166 chmod 644 quick2.tree/usr/lib/lib2.so
167 sleep 3s
168 echo chmod 755 quick2.tree/usr/lib/lib2.so >> quick2.log
169 chmod 755 quick2.tree/usr/lib/lib2.so
170 stat quick2.tree/usr/lib/lib2.so >> quick2.log
171 echo $PRELINK ${PRELINK_OPTS--vm} -aqvvvvv >> quick2.log
172 $PRELINK ${PRELINK_OPTS--vm} -aqvvvvv > quick2.tree/etc/log3 2>&1 || exit 3
173 cat quick2.tree/etc/log3 >> quick2.log
174 grep -q 'lib7.so: Not enough room to add .dynamic entry' \
175   quick2.tree/etc/log3 || exit 63
176 grep -q 'Could not prelink .*bin3 because its dependency .*lib7.so could not be prelinked' \
177   quick2.tree/etc/log3 || exit 64
178 grep -q 'Could not prelink .*bin5 because its dependency .*lib7.so could not be prelinked' \
179   quick2.tree/etc/log3 || exit 65
180 echo $PRELINK ${PRELINK_OPTS--vm} -aqvvvvv >> quick2.log
181 $PRELINK ${PRELINK_OPTS--vm} -aqvvvvv > quick2.tree/etc/log4 2>&1 || exit 4
182 cat quick2.tree/etc/log4 >> quick2.log
183 LD_LIBRARY_PATH=quick2.tree/lib:quick2.tree/usr/lib quick2.tree/usr/bin/bin1 || exit 5
184 LD_LIBRARY_PATH=quick2.tree/lib:quick2.tree/usr/lib quick2.tree/usr/bin/bin2 || exit 6
185 LD_LIBRARY_PATH=quick2.tree/lib:quick2.tree/usr/lib quick2.tree/usr/bin/bin3 || exit 7
186 LD_LIBRARY_PATH=quick2.tree/lib:quick2.tree/usr/lib quick2.tree/usr/bin/bin4 || exit 8
187 LD_LIBRARY_PATH=quick2.tree/lib:quick2.tree/usr/lib quick2.tree/usr/bin/bin5 || exit 9
188 LD_LIBRARY_PATH=quick2.tree/lib:quick2.tree/usr/lib quick2.tree/usr/bin/bin6 || exit 10
189 readelf -a quick2.tree/usr/bin/bin1 >> quick2.log 2>&1 || exit 11
190 readelf -a quick2.tree/usr/bin/bin3 >> quick2.log 2>&1 || exit 12
191 readelf -a quick2.tree/usr/bin/bin4 >> quick2.log 2>&1 || exit 13
192 readelf -a quick2.tree/usr/bin/bin5 >> quick2.log 2>&1 || exit 14
193 readelf -a quick2.tree/usr/bin/bin6 >> quick2.log 2>&1 || exit 15
194 BINS="quick2.tree/usr/bin/bin1 quick2.tree/usr/bin/bin4"
195 BINS="$BINS quick2.tree/usr/bin/bin6"
196 LIBS="quick2.tree/usr/lib/lib2.so"
197 comparelibs >> quick2.log 2>&1 || exit 16
198 for l in 2 7; do
199   mv -f quick2.tree/usr/lib/lib$l.so{,.old}
200   mv -f quick2.tree/usr/lib/lib$l.so{,.old}.orig
201   cp -p quick2.tree/usr/lib/lib$l{.later,}.so
202   cp -p quick2.tree/usr/lib/lib$l{.later,}.so.orig
203 done
204 for b in 1 3 4 5 6; do
205   cp -p quick2.tree/usr/bin/bin$b{,.old}
206   chmod 644 quick2.tree/usr/bin/bin$b.old
207 done
208 echo $PRELINK ${PRELINK_OPTS--vm} -aqvvvvv >> quick2.log
209 $PRELINK ${PRELINK_OPTS--vm} -aqvvvvv > quick2.tree/etc/log5 2>&1 || exit 17
210 cat quick2.tree/etc/log5 >> quick2.log
211 LD_LIBRARY_PATH=quick2.tree/lib:quick2.tree/usr/lib quick2.tree/usr/bin/bin1 || exit 18
212 LD_LIBRARY_PATH=quick2.tree/lib:quick2.tree/usr/lib quick2.tree/usr/bin/bin2 || exit 19
213 LD_LIBRARY_PATH=quick2.tree/lib:quick2.tree/usr/lib quick2.tree/usr/bin/bin3 || exit 20
214 LD_LIBRARY_PATH=quick2.tree/lib:quick2.tree/usr/lib quick2.tree/usr/bin/bin4 || exit 21
215 LD_LIBRARY_PATH=quick2.tree/lib:quick2.tree/usr/lib quick2.tree/usr/bin/bin5 || exit 22
216 LD_LIBRARY_PATH=quick2.tree/lib:quick2.tree/usr/lib quick2.tree/usr/bin/bin6 || exit 23
217 readelf -a quick2.tree/usr/bin/bin1 >> quick2.log 2>&1 || exit 24
218 readelf -a quick2.tree/usr/bin/bin3 >> quick2.log 2>&1 || exit 25
219 readelf -a quick2.tree/usr/bin/bin4 >> quick2.log 2>&1 || exit 26
220 readelf -a quick2.tree/usr/bin/bin5 >> quick2.log 2>&1 || exit 27
221 readelf -a quick2.tree/usr/bin/bin6 >> quick2.log 2>&1 || exit 28
222 # In both etc/log1 and etc/log3 there should be one
223 # "Not enough room" and two "Could not prelink" warnings.
224 [ $(grep ^`echo $PRELINK | sed 's/ .*$/: /'` quick2.log | wc -l) -eq 6 ] || exit 29
225 L=quick2.tree/usr/lib/lib
226 L1=${L}1.so; L2=${L}2.so; L3=${L}3.so; L4=${L}4.so
227 L5=${L}5.so; L6=${L}6.so; L7=${L}7.so
228 B=quick2.tree/usr/bin/bin
229 B1=${B}1; B2=${B}2; B3=${B}3; B4=${B}4; B5=${B}5
230 B6=${B}6; B7=${B}7; B8=${B}8; B12=${B}12
231 SL=`grep -f syslib.list quick2.tree/etc/log1 \
232     | sed -n '/^Prelinking/s|^.*\(quick2.tree/lib/\)|\1|p'`
233 CHECK_E="$B1 $B2 $B4 $B6"; CHECKE="$CHECK_E $B3 $B5 $B7"
234 CHECKL="$SL $L1 $L2 $L4 $L5 $L6 $L7"; PREL="$CHECK_E $CHECKL"; ASSUME=""; UNPREL=""
235 check_log quick2.tree/etc/log1
236 CHECKE=""; CHECKL=""; PREL=""; ASSUME="$B1 $B2 $B4 $B6 $SL $L1 $L2 $L4 $L5 $L6"
237 UNPREL="$B3 $B5 $B7 $B8 $B12 $L7"
238 check_log quick2.tree/etc/log2
239 CHECKE="$B1 $B3 $B4 $B5 $B6"; CHECKL="$SL $L1 $L2 $L5 $L6 $L7"; PREL="$L7"; ASSUME="$B2 $L4"; UNPREL="$B7 $B8 $B12"
240 check_log quick2.tree/etc/log3
241 CHECKE=""; CHECKL=""; PREL=""; ASSUME="$B1 $B2 $B4 $B6 $SL $L1 $L2 $L4 $L5 $L6"; UNPREL="$B3 $B5 $B7 $B8 $B12 $L7"
242 check_log quick2.tree/etc/log4
243 CHECKE="$B1 $B3 $B4 $B5 $B6"; CHECKL="$SL $L1 $L2 $L3 $L5 $L7 $L7"; PREL="$B1 $B3 $B4 $B5 $B6 $L2 $L3 $L5 $L6 $L7"; ASSUME="$B2 $L4"; UNPREL="$B7 $B8 $B12"
244 check_log quick2.tree/etc/log5
245 BINS="$B1 $B2 $B3 $B4 $B5 $B6"
246 LIBS="$SL $L1 $L2 $L3 $L4 $L5 $L6 $L7 $L2.old"
247 comparelibs >> quick2.log 2>&1 || exit 30
248 for i in $BINS $SL $L1 $L2 $L3 $L4 $L5 $L6 $L7; do
249   cp -p $i $i.prelinked
250 done
251 for i in $BINS; do
252   chmod 644 $i.prelinked
253 done
254 echo $PRELINK -uavvvvvv >> quick2.log
255 $PRELINK -uavvvvvv >> quick2.log 2>&1 || exit 31
256 for i in $BINS $SL $L1 $L2 $L3 $L4 $L5 $L6 $L7; do
257   cmp -s $i.orig $i || exit 32
258   mv -f $i.prelinked $i
259 done
260 chmod 755 $BINS
261 exit 0