Update release readme after making 2.43.1 release
[binutils-gdb.git] / ld / testsuite / ld-elf / no-section-header.exp
blob02b9548e32231f547469feb12eca70a2b5694b6e
1 # Expect script for -z nosectionheader and --strip-section-headers tests
2 # Copyright (C) 2023-2024 Free Software Foundation, Inc.
4 # This file is part of the GNU Binutils.
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 3 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 # MA 02110-1301, USA.
21 # Written by H.J. Lu (hongjiu.lu@intel.com)
24 if { ![is_elf_format] } {
25     return
28 proc binutils_test { prog_name ld_options test readelf_expected nm_expected} {
29     global as
30     global ld
31     global READELF
32     global NM
33     global objcopy
34     global strip
35     global srcdir
36     global subdir
37     global link_output
39     eval set prog \$$prog_name
41     set test_name "$prog_name --strip-section-headers $ld_options ($test)"
43     if { ![ld_assemble $as $srcdir/$subdir/$test.s tmpdir/$test.o ] } {
44         unresolved "$test_name"
45         return
46     }
48     append ld_options " -z separate-code -z stack-size=0"
49     if { ![ld_link $ld tmpdir/$test "$ld_options tmpdir/$test.o"] } {
50         if { [string match "*not supported*" $link_output]
51              || [string match "*unrecognized option*" $link_output]
52              || [string match "*-z .* ignored*" $link_output] } {
53             unsupported "$ld_options is not supported by this target"
54         } else {
55             unresolved "$test_name"
56         }
57         return
58     }
60     send_log "$prog --strip-section-headers tmpdir/$test\n"
61     set got [remote_exec host "$prog --strip-section-headers tmpdir/$test"]
62     if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
63         send_log "$got\n"
64         fail "$test_name"
65         return
66     }
68     send_log "$READELF -lSDs --wide tmpdir/$test > tmpdir/$test.out\n"
69     set got [remote_exec host "$READELF -lSDs --wide tmpdir/$test" "" "/dev/null" "tmpdir/$test.out"]
70     if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
71         send_log "$got\n"
72         unresolved "$test_name"
73         return
74     }
76     if { [regexp_diff "tmpdir/$test.out" "$srcdir/$subdir/$readelf_expected"] } then {
77         fail "$test_name"
78         return
79     }
81     if { [string match "*-shared *" $ld_options] } {
82         send_log "$NM -D tmpdir/$test > tmpdir/$test.out\n"
83         set got [remote_exec host "$NM -D tmpdir/$test" "" "/dev/null" "tmpdir/$test.out"]
84         if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
85             send_log "$got\n"
86             unresolved "$test_name"
87             return
88         }
90         if { [regexp_diff "tmpdir/$test.out" "$srcdir/$subdir/$nm_expected"] } then {
91             fail "$test_name"
92             return
93         }
94     }
96     pass "$test_name"
99 if { [istarget "mips*-*-*"] } {
100     set gnu_hash_style "sysv"
101 } else {
102     set gnu_hash_style "gnu"
105 binutils_test objcopy "--hash-style=both" start start-noheader.rd \
106         start-noheader.nd
107 binutils_test objcopy "--hash-style=gnu" start start-noheader.rd \
108         start-noheader.nd
109 binutils_test objcopy "--hash-style=sysv" start start-noheader.rd \
110         start-noheader.nd
111 binutils_test objcopy "--hash-style=both -shared" start \
112         start-shared-noheader-$gnu_hash_style.rd start-shared-noheader.nd
113 binutils_test objcopy "--hash-style=gnu -shared" start \
114         start-shared-noheader-$gnu_hash_style.rd start-shared-noheader.nd
115 binutils_test objcopy "--hash-style=sysv -shared" start \
116         start-shared-noheader-sysv.rd start-shared-noheader.nd
117 binutils_test strip "--hash-style=both" start start-noheader.rd \
118         start-noheader.nd
119 binutils_test strip "--hash-style=gnu" start start-noheader.rd \
120         start-noheader.nd
121 binutils_test strip "--hash-style=sysv" start start-noheader.rd \
122         start-noheader.nd
123 binutils_test strip "--hash-style=both -shared" start \
124         start-shared-noheader-$gnu_hash_style.rd start-shared-noheader.nd
125 binutils_test strip "--hash-style=gnu -shared" start \
126         start-shared-noheader-$gnu_hash_style.rd start-shared-noheader.nd
127 binutils_test strip "--hash-style=sysv -shared" start \
128         start-shared-noheader-sysv.rd start-shared-noheader.nd
131 if { ![check_compiler_available] || ![check_shared_lib_support] } {
132     return
135 proc binutils_run_test { prog } {
136     global CC_FOR_TARGET
137     global READELF
138     global NM
139     global objcopy
140     global strip
141     global srcdir
142     global subdir
143     # Add $NOPIE_CFLAGS and $NOPIE_LDFLAGS if non-PIE is required.
144     global NOPIE_CFLAGS NOPIE_LDFLAGS
146     set sec_hdr "sec-hdr"
147     if { "$prog" == "" } {
148         set prog_name none
149     } else {
150         set prog_name $prog
151         set ld_options ""
152         switch -- $prog {
153             objcopy
154                 { set prog $objcopy }
155             strip
156                 { set prog $strip }
157             default
158                 {
159                     fail "Build pr25617-1a-no-sec-hdr.so ($prog_name)"
160                     break
161                 }
162         }
163     }
165     run_cc_link_tests [list \
166         [list \
167             "Build pr25617-1a-no-sec-hdr.so ($prog_name)" \
168             "-shared -Wl,-z,separate-code,--hash-style=sysv" \
169             "-fPIC" \
170             {pr25617-1a.c} \
171             [list \
172                 [list "readelf" "-lWSDs" "pr25617-1a-$sec_hdr.rd"] \
173                 [list "nm" "-D" "pr25617-1a-no-sec-hdr.nd"] \
174             ]\
175             "pr25617-1a-no-sec-hdr.so" \
176         ] \
177         [list \
178             "Build pr25617-1a-now-no-sec-hdr.so ($prog_name)" \
179             "-shared -Wl,-z,separate-code,-z,now,--hash-style=gnu" \
180             "-fPIC" \
181             {pr25617-1a.c} \
182             [list \
183                 [list "readelf" "-lWSDs" "pr25617-1a-$sec_hdr.rd"] \
184                 [list "nm" "-D" "pr25617-1a-no-sec-hdr.nd"] \
185             ]\
186             "pr25617-1a-now-no-sec-hdr.so" \
187         ] \
188         [list \
189             "Build pr25617-1 (-z nosectionheader, $prog_name)" \
190             "$NOPIE_LDFLAGS -Wl,-z,separate-code,--no-as-needed \
191              -Wl,--hash-style=sysv -Wl,-z,nosectionheader \
192              tmpdir/pr25617-1a-no-sec-hdr.so" \
193             "$NOPIE_CFLAGS" \
194             {pr25617-1b.c} \
195             {{readelf -lWSDs pr25617-1-no-sec-hdr.rd} \
196              {nm -D pr25617-1-no-sec-hdr.nd}} \
197             "pr25617-1-no-sec-hdr" \
198         ] \
199         [list \
200             "Build pr25617-1 (PIE, -z nosectionheader, $prog_name)" \
201             "-pie -Wl,-z,separate-code,--no-as-needed,--hash-style=gnu \
202              -Wl,-z,nosectionheader tmpdir/pr25617-1a-now-no-sec-hdr.so" \
203             "-fPIE" \
204             {pr25617-1b.c} \
205             {{readelf -lWSDs pr25617-1-no-sec-hdr.rd} \
206              {nm -D pr25617-1-no-sec-hdr.nd}} \
207             "pr25617-1-pie-no-sec-hdr" \
208         ] \
209         [list \
210             "Build pr25617-1 (static, -z nosectionheader, $prog_name)" \
211             "-static -Wl,-z,separate-code -Wl,-z,nosectionheader" \
212             "" \
213             {pr25617-1a.c pr25617-1b.c} \
214             {{readelf -lSWDs pr25617-1-static-no-sec-hdr.rd}} \
215             "pr25617-1-static-no-sec-hdr" \
216         ] \
217     ]
219     run_ld_link_exec_tests [list \
220         [list \
221             "Run pr25617-1 (-z nosectionheader, $prog_name)" \
222             "$NOPIE_LDFLAGS -Wl,-z,separate-code,--no-as-needed \
223              -Wl,--hash-style=sysv -Wl,-z,nosectionheader \
224              tmpdir/pr25617-1a-no-sec-hdr.so" \
225             "" \
226             {pr25617-1b.c} \
227             "pr25617-1-no-sec-hdr" \
228             "pass.out" \
229             "$NOPIE_CFLAGS" \
230         ] \
231         [list \
232             "Run pr25617-1 (PIE, -z nosectionheader, $prog_name)" \
233             "-pie -Wl,-z,separate-code,--no-as-needed,--hash-style=gnu \
234              -Wl,-z,nosectionheader tmpdir/pr25617-1a-now-no-sec-hdr.so" \
235             "" \
236             {pr25617-1b.c} \
237             "pr25617-1-pie-no-sec-hdr" \
238             "pass.out" \
239             "-fPIE" \
240         ] \
241         [list \
242             "Run pr25617-1 (static, -z nosectionheader, $prog_name)" \
243             "-static -Wl,-z,separate-code -Wl,-z,nosectionheader" \
244             "" \
245             {pr25617-1a.c pr25617-1b.c} \
246             "pr25617-1-static-no-sec-hdr" \
247             "pass.out" \
248         ] \
249     ]
251     if { "$prog_name" != "none" } {
252         send_log "$prog --strip-section-headers tmpdir/pr25617-1a-no-sec-hdr.so\n"
253         set got [remote_exec host "$prog --strip-section-headers tmpdir/pr25617-1a-no-sec-hdr.so"]
254         if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
255             send_log "$got\n"
256             fail "Update pr25617-1a-no-sec-hdr.so ($prog_name)"
257             return
258         }
260         send_log "$READELF -lWSDs tmpdir/pr25617-1a-no-sec-hdr.so > tmpdir/dump.out\n"
261         set got [remote_exec host "$READELF -lWSDs tmpdir/pr25617-1a-no-sec-hdr.so" "" "/dev/null" "tmpdir/dump.out"]
262         if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
263             send_log "$got\n"
264             unresolved "Update pr25617-1a-no-sec-hdr.so ($prog_name)"
265             return
266         }
268         if { [regexp_diff "tmpdir/dump.out" "$srcdir/$subdir/pr25617-1a-no-sec-hdr.rd"] } then {
269             unresolved "Update pr25617-1a-no-sec-hdr.so ($prog_name)"
270             return
271         }
273         send_log "$NM -D tmpdir/pr25617-1a-no-sec-hdr.so > tmpdir/dump.out\n"
274         set got [remote_exec host "$NM -D tmpdir/pr25617-1a-no-sec-hdr.so" "" "/dev/null" "tmpdir/dump.out"]
275         if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
276             send_log "$got\n"
277             unresolved "Update pr25617-1a-no-sec-hdr.so ($prog_name)"
278             return
279         }
281         if { [regexp_diff "tmpdir/dump.out" "$srcdir/$subdir/pr25617-1a-no-sec-hdr.nd"] } then {
282             unresolved "Update pr25617-1a-no-sec-hdr.so ($prog_name)"
283             return
284         }
286         if { [isnative] } {
287             send_log "tmpdir/pr25617-1-no-sec-hdr > tmpdir/pr25617-1.out\n"
288             catch "exec tmpdir/pr25617-1-no-sec-hdr > tmpdir/pr25617-1.out" got
289             if ![string match "" $got] then {
290                 send_log "$got\n"
291                 unresolved "Update pr25617-1a-no-sec-hdr.so ($prog_name)"
292                 return
293             }
295             send_log "diff tmpdir/pr25617-1.out $srcdir/$subdir/pass.out\n"
296             catch "exec diff tmpdir/pr25617-1.out $srcdir/$subdir/pass.out" got
297             if ![string match "" $got] then {
298                 send_log "$got\n"
299                 fail "Update pr25617-1a-no-sec-hdr.so ($prog_name)"
300                 return
301             }
302         }
304         pass "Update pr25617-1a-no-sec-hdr.so ($prog_name)"
306         send_log "$prog --strip-section-headers tmpdir/pr25617-1a-now-no-sec-hdr.so\n"
307         set got [remote_exec host "$prog --strip-section-headers tmpdir/pr25617-1a-now-no-sec-hdr.so"]
308         if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
309             send_log "$got\n"
310             fail "Update pr25617-1a-now-no-sec-hdr.so ($prog_name)"
311             return
312         }
314         send_log "$READELF -lWSDs tmpdir/pr25617-1a-now-no-sec-hdr.so > tmpdir/dump.out\n"
315         set got [remote_exec host "$READELF -lWSDs tmpdir/pr25617-1a-now-no-sec-hdr.so" "" "/dev/null" "tmpdir/dump.out"]
316         if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
317             send_log "$got\n"
318             unresolved "Update pr25617-1a-now-no-sec-hdr.so ($prog_name)"
319             return
320         }
322         if { [regexp_diff "tmpdir/dump.out" "$srcdir/$subdir/pr25617-1a-no-sec-hdr.rd"] } then {
323             unresolved "Update pr25617-1a-now-no-sec-hdr.so ($prog_name)"
324             return
325         }
327         send_log "$NM -D tmpdir/pr25617-1a-now-no-sec-hdr.so > tmpdir/dump.out\n"
328         set got [remote_exec host "$NM -D tmpdir/pr25617-1a-now-no-sec-hdr.so" "" "/dev/null" "tmpdir/dump.out"]
329         if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
330             send_log "$got\n"
331             unresolved "Update pr25617-1a-now-no-sec-hdr.so ($prog_name)"
332             return
333         }
335         if { [regexp_diff "tmpdir/dump.out" "$srcdir/$subdir/pr25617-1a-no-sec-hdr.nd"] } then {
336             unresolved "Update pr25617-1a-now-no-sec-hdr.so ($prog_name)"
337             return
338         }
340         if { [isnative] } {
341             send_log "tmpdir/pr25617-1-pie-no-sec-hdr > tmpdir/pr25617-1-pie.out\n"
342             catch "exec tmpdir/pr25617-1-pie-no-sec-hdr > tmpdir/pr25617-1-pie.out" got
343             if ![string match "" $got] then {
344                 send_log "$got\n"
345                 unresolved "Update pr25617-1a-now-no-sec-hdr.so ($prog_name)"
346                 return
347             }
349             send_log "diff tmpdir/pr25617-1-pie.out $srcdir/$subdir/pass.out\n"
350             catch "exec diff tmpdir/pr25617-1-pie.out $srcdir/$subdir/pass.out" got
351             if ![string match "" $got] then {
352                 send_log "$got\n"
353                 fail "Update pr25617-1a-now-no-sec-hdr.so ($prog_name)"
354                 return
355             }
356         }
358         set got [run_host_cmd $CC_FOR_TARGET "-o tmpdir/pr25617-1 tmpdir/pr25617-1b.o tmpdir/pr25617-1a-now-no-sec-hdr.so"]
359         if ![string match "*pr25617-1a-now-no-sec-hdr.so*file in wrong format*" $got] then {
360             send_log "$got\n"
361             fail "Update pr25617-1a-now-no-sec-hdr.so ($prog_name)"
362             return
363         }
365         pass "Update pr25617-1a-now-no-sec-hdr.so ($prog_name)"
366      }
369 binutils_run_test ""
370 binutils_run_test objcopy
371 binutils_run_test strip