~ubuntu-branches/ubuntu/utopic/binutils-arm64-cross/utopic

« back to all changes in this revision

Viewing changes to binutils-2.23.52.20130611/ld/testsuite/ld-elfvers/vers.exp

  • Committer: Package Import Robot
  • Author(s): Matthias Klose
  • Date: 2013-06-20 17:38:09 UTC
  • Revision ID: package-import@ubuntu.com-20130620173809-app8lzgvymy5fg6c
Tags: 0.7
Build-depend on binutils-source (>= 2.23.52.20130620-1~).

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Expect script for ld-version tests
 
2
#   Copyright 1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
 
3
#   2009, 2010, 2011, 2012 Free Software Foundation, Inc.
 
4
#
 
5
# This file is part of the GNU Binutils.
 
6
#
 
7
# This program is free software; you can redistribute it and/or modify
 
8
# it under the terms of the GNU General Public License as published by
 
9
# the Free Software Foundation; either version 3 of the License, or
 
10
# (at your option) any later version.
 
11
#
 
12
# This program is distributed in the hope that it will be useful,
 
13
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
14
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
15
# GNU General Public License for more details.
 
16
#
 
17
# You should have received a copy of the GNU General Public License
 
18
# along with this program; if not, write to the Free Software
 
19
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
 
20
# MA 02110-1301, USA.
 
21
#
 
22
# Written by Eric Youngdale (eric@andante.jic.com)
 
23
 
 
24
#
 
25
 
 
26
# This test can only be run if ld generates native executables.
 
27
if ![isnative] then {return}
 
28
 
 
29
# This test can only be run on a couple of ELF platforms.
 
30
# Square bracket expressions seem to confuse istarget.
 
31
# This is similar to the test that is used in ld-shared, BTW.
 
32
if { ![istarget hppa*64*-*-hpux*]
 
33
     && ![istarget hppa*-*-linux*]
 
34
     && ![istarget i?86-*-sysv4*]
 
35
     && ![istarget i?86-*-unixware]
 
36
     && ![istarget i?86-*-elf*]
 
37
     && ![istarget i?86-*-linux*]
 
38
     && ![istarget i?86-*-gnu*]
 
39
     && ![istarget i?86-*-nacl*]
 
40
     && ![istarget ia64-*-elf*]
 
41
     && ![istarget ia64-*-linux*]
 
42
     && ![istarget m68k-*-linux*]
 
43
     && ![istarget mips*-*-irix5*]
 
44
     && ![istarget powerpc*-*-elf*]
 
45
     && ![istarget powerpc*-*-linux*]
 
46
     && ![istarget powerpc*-*-sysv4*]
 
47
     && ![istarget sparc*-*-elf]
 
48
     && ![istarget sparc*-*-solaris2*]
 
49
     && ![istarget sparc*-*-linux*]
 
50
     && ![istarget aarch64*-*-linux*]
 
51
     && ![istarget arm*-*-linux*]
 
52
     && ![istarget mips*-*-linux*]
 
53
     && ![istarget alpha*-*-linux*]
 
54
     && ![istarget s390*-*-linux*]
 
55
     && ![istarget sh\[34\]*-*-linux*]
 
56
     && ![istarget x86_64-*-linux*]
 
57
     && ![istarget x86_64-*-nacl*] } {
 
58
    return
 
59
}
 
60
 
 
61
if { [istarget *-*-linux*aout*]
 
62
     || [istarget *-*-linux*oldld*] } {
 
63
    return
 
64
}
 
65
 
 
66
if { [istarget rs6000*-*-aix*] || [istarget powerpc*-*-aix*] } {
 
67
    return
 
68
}
 
69
 
 
70
set diff diff
 
71
set tmpdir tmpdir
 
72
set VOBJDUMP_FLAGS --private-headers
 
73
set DOBJDUMP_FLAGS --dynamic-syms
 
74
set SOBJDUMP_FLAGS --syms
 
75
set shared "--shared --no-undefined-version"
 
76
set script --version-script
 
77
 
 
78
# Old version of GCC for MIPS default to enabling -fpic
 
79
# and get confused if it is used on the command line.
 
80
if { [istarget mips*-*-*] && ! [at_least_gcc_version 4 3] } then {
 
81
    set picflag ""
 
82
} else {
 
83
    # Unfortunately, the gcc argument is -fpic and the cc argument is
 
84
    # -KPIC.  We have to try both.
 
85
    set picflag "-fpic"
 
86
    send_log "$CC $picflag\n"
 
87
    verbose "$CC $picflag"
 
88
    catch "exec $CC $picflag" exec_output
 
89
    send_log "$exec_output\n"
 
90
    verbose "--" "$exec_output"
 
91
    if { [string match "*illegal option*" $exec_output]
 
92
         || [string match "*option ignored*" $exec_output]
 
93
         || [string match "*unrecognized option*" $exec_output]
 
94
         || [string match "*passed to ld*" $exec_output] } {
 
95
        if [istarget *-*-sunos4*] {
 
96
            set picflag "-pic"
 
97
        } else {
 
98
            set picflag "-KPIC"
 
99
        }
 
100
    }
 
101
}
 
102
 
 
103
case $target_triplet in {
 
104
    { ia64-*-* } { set as_options "-x" }
 
105
    { sparc-*-* } { set as_options "-Av9a" }
 
106
    default { set as_options "" }
 
107
}
 
108
 
 
109
proc test_ar { test lib object expect } {
 
110
    global ar
 
111
    global nm
 
112
    global tmpdir
 
113
    global srcdir
 
114
    global subdir
 
115
    global diff
 
116
 
 
117
    verbose -log "$ar -cr $tmpdir/$lib $tmpdir/$object"
 
118
    catch "exec $ar -cr $tmpdir/$lib $tmpdir/$object" exec_output
 
119
    set exec_output [prune_warnings $exec_output]
 
120
    if ![string match "" $exec_output] {
 
121
        verbose -log "$exec_output"
 
122
        unresolved "$test"
 
123
        return
 
124
    }
 
125
 
 
126
    verbose -log "$nm --print-armap $tmpdir/$lib | grep \" in \" | egrep \"VERS\\|bar\\|foo\" | sort > $tmpdir/nm.out"
 
127
 
 
128
    catch "exec $nm --print-armap $tmpdir/$lib | grep \\\ in\\\  | egrep VERS\\\|bar\\\|foo | sort > $tmpdir/nm.out" exec_output
 
129
    if [string match "" $exec_output] then {
 
130
        catch "exec sort $srcdir/$subdir/$expect | $diff $tmpdir/nm.out -" exec_output
 
131
        set exec_output [prune_warnings $exec_output]
 
132
        if [string match "" $exec_output] then {
 
133
            pass $test
 
134
            return
 
135
        } else {
 
136
            verbose -log "$exec_output"
 
137
            fail "$test"
 
138
            return
 
139
        }
 
140
    } else {
 
141
        verbose -log "$exec_output"
 
142
        fail "$test"
 
143
    }
 
144
}
 
145
 
 
146
#
 
147
# objdump_emptysymstuff
 
148
#       Check non-dynamic symbols and make sure there are none with '@'.
 
149
#
 
150
proc objdump_emptysymstuff { objdump object } {
 
151
    global SOBJDUMP_FLAGS
 
152
    global version_output
 
153
    global diff
 
154
 
 
155
    if ![info exists SOBJDUMP_FLAGS] { set SOBJDUMP_FLAGS "" }
 
156
 
 
157
    verbose -log "$objdump $SOBJDUMP_FLAGS $object | sed -n /\@/p"
 
158
 
 
159
    catch "exec $objdump $SOBJDUMP_FLAGS $object | sed -n /\@/p" exec_output
 
160
    set exec_output [prune_warnings $exec_output]
 
161
    if [string match "" $exec_output] then {
 
162
# We shouldn't get anything here.
 
163
        return 1
 
164
    } else {
 
165
# it is not normal to come here - we have no output to compare.
 
166
        verbose -log "$exec_output"
 
167
        verbose -log "objdump_emptysymstuff: did not expect any output from objdump"
 
168
        return 0
 
169
    }
 
170
 
 
171
}
 
172
 
 
173
#
 
174
# objdump_emptydynsymstuff
 
175
#       Check dynamic symbols and make sure there are none with '@'.
 
176
#
 
177
proc objdump_emptydynsymstuff { objdump object } {
 
178
    global DOBJDUMP_FLAGS
 
179
    global version_output
 
180
    global diff
 
181
 
 
182
    if ![info exists VOBJDUMP_FLAGS] { set VOBJDUMP_FLAGS "" }
 
183
 
 
184
    verbose -log "$objdump $DOBJDUMP_FLAGS $object | sed -n /VERS/p\\\;/show/p"
 
185
 
 
186
    catch "exec $objdump $DOBJDUMP_FLAGS $object | sed -n /VERS/p\\\;/show/p" exec_output
 
187
    set exec_output [prune_warnings $exec_output]
 
188
    if [string match "" $exec_output] then {
 
189
# We shouldn't get anything here.
 
190
        return 1
 
191
    } else { if [string match "*objdump: *: not a dynamic object" $exec_output] then {
 
192
        return 1
 
193
    } else {
 
194
# it is not normal to come here - we have no output to compare.
 
195
        verbose -log "$exec_output"
 
196
        verbose -log "objdump_emptydynsymstuff: did not expect any output from objdump"
 
197
        return 0
 
198
    } }
 
199
}
 
200
 
 
201
#
 
202
# objdump_emptyverstuff
 
203
#       Make sure there is no version information
 
204
#
 
205
proc objdump_emptyverstuff { objdump object } {
 
206
    global VOBJDUMP_FLAGS
 
207
    global version_output
 
208
    global diff
 
209
    global tmpdir
 
210
 
 
211
    if {[which $objdump] == 0} then {
 
212
        perror "$objdump does not exist"
 
213
        return 0
 
214
    }
 
215
 
 
216
    if ![info exists VOBJDUMP_FLAGS] { set VOBJDUMP_FLAGS "" }
 
217
 
 
218
    verbose -log "$objdump $VOBJDUMP_FLAGS $object | sed -n /Version/,\\\$p > $tmpdir/objdump.out"
 
219
 
 
220
    catch "exec $objdump $VOBJDUMP_FLAGS $object | sed -n /Version/,\\\$p" exec_output
 
221
    set exec_output [prune_warnings $exec_output]
 
222
    if [string match "" $exec_output] then {
 
223
# it is normal to fail here - we have no output to compare.
 
224
        return 1
 
225
    } else { if { [string match "*libc*" $exec_output] } then {
 
226
# this probably means that there is version information in libc, so we
 
227
# can't really perform this test.
 
228
        return 1
 
229
    } else {
 
230
        verbose -log "$exec_output"
 
231
        verbose -log "objdump_emptyverstuff: did not expect any output from objdump"
 
232
        return 0
 
233
    } }
 
234
 
 
235
}
 
236
 
 
237
#
 
238
# objdump_symstuff
 
239
#       Dump non-dynamic symbol stuff and make sure that it is sane.
 
240
#
 
241
proc objdump_symstuff { objdump object expectfile } {
 
242
    global SOBJDUMP_FLAGS
 
243
    global version_output
 
244
    global diff
 
245
    global tmpdir
 
246
 
 
247
    if ![info exists SOBJDUMP_FLAGS] { set SOBJDUMP_FLAGS "" }
 
248
 
 
249
    verbose -log "$objdump $SOBJDUMP_FLAGS $object | grep \@ | sort -k 6  > $tmpdir/objdump.out"
 
250
 
 
251
    catch "exec $objdump $SOBJDUMP_FLAGS $object | grep \@ | sort -k 6 > $tmpdir/objdump.out" exec_output
 
252
    set exec_output [prune_warnings $exec_output]
 
253
    if [string match "" $exec_output] then {
 
254
 
 
255
# Now do a line-by-line comparison to effectively diff the darned things
 
256
# The stuff coming from the expectfile is actually a regex, so we can
 
257
# skip over the actual addresses and so forth.  This is currently very
 
258
# simpleminded - it expects a one-to-one correspondence in terms of line
 
259
# numbers.
 
260
 
 
261
        if [file exists $expectfile] then {
 
262
            set file_a [open $expectfile r]
 
263
        } else {
 
264
            perror "$expectfile doesn't exist"
 
265
            return 0
 
266
        }
 
267
 
 
268
        if [file exists $tmpdir/objdump.out] then {
 
269
            set file_b [open $tmpdir/objdump.out r]
 
270
        } else {
 
271
            perror "$tmpdir/objdump.out doesn't exist"
 
272
            return 0
 
273
        }
 
274
 
 
275
        verbose "# Diff'ing: $expectfile $tmpdir/objdump.out" 2
 
276
 
 
277
        set eof -1
 
278
        set differences 0
 
279
 
 
280
        while { [gets $file_a line] != $eof } {
 
281
            if [regexp "^#.*$" $line] then {
 
282
                continue
 
283
            } else {
 
284
                lappend list_a $line
 
285
            }
 
286
        }
 
287
        close $file_a
 
288
 
 
289
        while { [gets $file_b line] != $eof } {
 
290
            if [regexp "^#.*$" $line] then {
 
291
                continue
 
292
            } else {
 
293
                lappend list_b $line
 
294
            }
 
295
        }
 
296
        close $file_b
 
297
 
 
298
        for { set i 0 } { $i < [llength $list_a] } { incr i } {
 
299
            set line_a [lindex $list_a $i]
 
300
            set line_b [lindex $list_b $i]
 
301
 
 
302
 
 
303
            verbose "\t$expectfile: $i: $line_a" 3
 
304
            verbose "\t/tmp/objdump.out: $i: $line_b" 3
 
305
            if [regexp $line_a $line_b] then {
 
306
                continue
 
307
            } else {
 
308
                verbose -log "\t$expectfile: $i: $line_a"
 
309
                verbose -log "\t$tmpdir/objdump.out: $i: $line_b"
 
310
 
 
311
                return 0
 
312
            }
 
313
        }
 
314
 
 
315
        if { [llength $list_a] != [llength $list_b] } {
 
316
            verbose -log "Line count"
 
317
            return 0
 
318
        }
 
319
 
 
320
        if $differences<1 then {
 
321
            return 1
 
322
        }
 
323
 
 
324
        return 0
 
325
    } else {
 
326
        verbose -log "$exec_output"
 
327
        return 0
 
328
    }
 
329
 
 
330
}
 
331
 
 
332
#
 
333
# objdump_dymsymstuff
 
334
#       Dump dynamic symbol stuff and make sure that it is sane.
 
335
#
 
336
proc objdump_dynsymstuff { objdump object expectfile } {
 
337
    global DOBJDUMP_FLAGS
 
338
    global version_output
 
339
    global diff
 
340
    global tmpdir
 
341
 
 
342
    if ![info exists DOBJDUMP_FLAGS] { set DOBJDUMP_FLAGS "" }
 
343
 
 
344
    verbose -log "$objdump $DOBJDUMP_FLAGS $object | sed -n /VERS/p\\\;/show/p | sort | uniq  > $tmpdir/objdump.out"
 
345
 
 
346
    catch "exec $objdump $DOBJDUMP_FLAGS $object | sed -n /VERS/p\\\;/show/p | sort | uniq  > $tmpdir/objdump.out" exec_output
 
347
    set exec_output [prune_warnings $exec_output]
 
348
    if [string match "" $exec_output] then {
 
349
 
 
350
# Now do a line-by-line comparison to effectively diff the darned things
 
351
# The stuff coming from the expectfile is actually a regex, so we can
 
352
# skip over the actual addresses and so forth.  This is currently very
 
353
# simpleminded - it expects a one-to-one correspondence in terms of line
 
354
# numbers.
 
355
 
 
356
        if [file exists $expectfile] then {
 
357
            set file_a [open $expectfile r]
 
358
        } else {
 
359
            warning "$expectfile doesn't exist"
 
360
            return 0
 
361
        }
 
362
 
 
363
        if [file exists $tmpdir/objdump.out] then {
 
364
            set file_b [open $tmpdir/objdump.out r]
 
365
        } else {
 
366
            fail "$tmpdir/objdump.out doesn't exist"
 
367
            return 0
 
368
        }
 
369
 
 
370
        verbose "# Diff'ing: $expectfile $tmpdir/objdump.out" 2
 
371
 
 
372
        set eof -1
 
373
        set differences 0
 
374
 
 
375
        while { [gets $file_a line] != $eof } {
 
376
            if [regexp "^#.*$" $line] then {
 
377
                continue
 
378
            } else {
 
379
                lappend list_a $line
 
380
            }
 
381
        }
 
382
        close $file_a
 
383
 
 
384
        while { [gets $file_b line] != $eof } {
 
385
            if [regexp "^#.*$" $line] then {
 
386
                continue
 
387
            } else {
 
388
                lappend list_b $line
 
389
            }
 
390
        }
 
391
        close $file_b
 
392
 
 
393
        # Support empty files.
 
394
        if { ![info exists list_a] && ![info exists list_b] } then {
 
395
            return 1
 
396
        }
 
397
 
 
398
        for { set i 0 } { $i < [llength $list_b] } { incr i } {
 
399
            set line_b [lindex $list_b $i]
 
400
 
 
401
# The tests are rigged so that we should never export a symbol with the
 
402
# word 'hide' in it.  Thus we just search for it, and bail if we find it.
 
403
            if [regexp "hide" $line_b] then {
 
404
                verbose -log "\t$tmpdir/objdump.out: $i: $line_b"
 
405
 
 
406
                return 0
 
407
            }
 
408
 
 
409
            verbose "\t$expectfile: $i: $line_b" 3
 
410
 
 
411
            # We can't assume that the sort is consistent across
 
412
            # systems, so we must check each regexp.  When we find a
 
413
            # regexp, we null it out, so we don't match it twice.
 
414
            for { set j 0 } { $j < [llength $list_a] } { incr j } {
 
415
                set line_a [lindex $list_a $j]
 
416
 
 
417
                if [regexp $line_a $line_b] then {
 
418
                    lreplace $list_a $j $j "CAN NOT MATCH"
 
419
                    break
 
420
                }
 
421
            }
 
422
 
 
423
            if { $j >= [llength $list_a] } {
 
424
                verbose -log "\t$tmpdir/objdump.out: $i: $line_b"
 
425
 
 
426
                return 0
 
427
            }
 
428
        }
 
429
 
 
430
        if { [llength $list_a] != [llength $list_b] } {
 
431
            verbose -log "Line count"
 
432
            return 0
 
433
        }
 
434
 
 
435
        if $differences<1 then {
 
436
            return 1
 
437
        }
 
438
 
 
439
        return 0
 
440
    } else {
 
441
        verbose -log "$exec_output"
 
442
        return 0
 
443
    }
 
444
 
 
445
}
 
446
 
 
447
#
 
448
# objdump_versionstuff
 
449
#       Dump version definitions/references and make sure that it is sane.
 
450
#
 
451
proc objdump_versionstuff { objdump object expectfile } {
 
452
    global VOBJDUMP_FLAGS
 
453
    global version_output
 
454
    global diff
 
455
    global tmpdir
 
456
 
 
457
    if {[which $objdump] == 0} then {
 
458
        perror "$objdump does not exist"
 
459
        return 0
 
460
    }
 
461
 
 
462
    if ![info exists VOBJDUMP_FLAGS] { set VOBJDUMP_FLAGS "" }
 
463
 
 
464
    verbose -log "$objdump $VOBJDUMP_FLAGS $object | sed -n /Version/,\\\$p > $tmpdir/objdump.out"
 
465
 
 
466
    catch "exec $objdump $VOBJDUMP_FLAGS $object | sed -n /Version/,\\\$p > $tmpdir/objdump.out" exec_output
 
467
    set exec_output [prune_warnings $exec_output]
 
468
    if [string match "" $exec_output] then {
 
469
 
 
470
        # It's OK if there are extra lines in the actual output; they
 
471
        # may come from version information in libc.  We require that
 
472
        # every line in EXPECTFILE appear in the output in any order.
 
473
 
 
474
        set f2 [open $expectfile r]
 
475
        while { [gets $f2 l2] != -1 } {
 
476
            if { ![regexp "^#.*$" $l2] } then {
 
477
                set f1 [open $tmpdir/objdump.out r]
 
478
                while { [gets $f1 l1] != -1 } {
 
479
                    if { [string match $l2 $l1] } then {
 
480
                        break
 
481
                    }
 
482
                }
 
483
                close $f1
 
484
 
 
485
                if { ![string match $l2 $l1] } then {
 
486
                    verbose -log "Did not find \"$l2\""
 
487
                    set f1 [open $tmpdir/objdump.out r]
 
488
                    while { [gets $f1 l1] != -1 } {
 
489
                        verbose -log $l1
 
490
                    }
 
491
                    close $f1
 
492
                    close $f2
 
493
                    return 0
 
494
                }
 
495
            }
 
496
        }
 
497
        close $f2
 
498
        return 1
 
499
    } else {
 
500
        verbose -log "$exec_output"
 
501
        return 0
 
502
    }
 
503
}
 
504
 
 
505
proc build_binary { shared pic test source libname other mapfile verexp versymexp symexp ldargs } {
 
506
    global ld
 
507
    global srcdir
 
508
    global subdir
 
509
    global exec_output
 
510
    global host_triplet
 
511
    global tmpdir
 
512
    global as
 
513
    global as_options
 
514
    global objdump
 
515
    global CC
 
516
    global CFLAGS
 
517
    global script
 
518
 
 
519
    if ![ld_compile "$CC -S $pic $CFLAGS" $srcdir/$subdir/$source $tmpdir/$libname.s]     {
 
520
        unresolved "$test"
 
521
        return
 
522
    }
 
523
 
 
524
    if ![ld_assemble $as "$as_options $tmpdir/$libname.s" $tmpdir/$libname.o ]     {
 
525
        unresolved "$test"
 
526
        return
 
527
    }
 
528
 
 
529
    set other_lib ""
 
530
    if ![string match "" $other] then {
 
531
        foreach o $other {
 
532
            set other_lib "$other_lib $tmpdir/$o"
 
533
        }
 
534
    }
 
535
 
 
536
    if [string match "" $mapfile] then {
 
537
        set script_arg ""
 
538
    } else {
 
539
        set script_arg "$script $srcdir/$subdir/$mapfile"
 
540
    }
 
541
 
 
542
    if {![ld_simple_link $ld $tmpdir/$libname.so "$shared $tmpdir/$libname.o $other_lib $script_arg $ldargs"]}     {
 
543
        fail "$test"
 
544
        return
 
545
    }
 
546
 
 
547
    if {![objdump_versionstuff $objdump $tmpdir/$libname.so $srcdir/$subdir/$verexp ]}     {
 
548
        fail "$test"
 
549
        return
 
550
    }
 
551
 
 
552
    if {![objdump_dynsymstuff $objdump $tmpdir/$libname.so $srcdir/$subdir/$versymexp ]}     {
 
553
        fail "$test"
 
554
        return
 
555
    }
 
556
 
 
557
    if [string match "" $symexp] then {
 
558
        if {![objdump_emptysymstuff $objdump $tmpdir/$libname.o ]}     {
 
559
            fail "$test"
 
560
            return
 
561
        }
 
562
    } else {
 
563
        if {![objdump_symstuff $objdump $tmpdir/$libname.o $srcdir/$subdir/$symexp ]}     {
 
564
            fail "$test"
 
565
            return
 
566
        }
 
567
    }
 
568
 
 
569
    pass $test
 
570
 
 
571
}
 
572
 
 
573
proc build_executable { test source libname other mapfile verexp versymexp symexp } {
 
574
  build_binary "" "" $test $source $libname $other $mapfile $verexp $versymexp $symexp ""
 
575
}
 
576
 
 
577
proc build_vers_lib_no_pic { test source libname other mapfile verexp versymexp symexp } {
 
578
  global shared
 
579
  build_binary $shared "" $test $source $libname $other $mapfile $verexp $versymexp $symexp ""
 
580
}
 
581
 
 
582
proc build_vers_lib_pic { test source libname other mapfile verexp versymexp symexp } {
 
583
  global picflag
 
584
  global shared
 
585
  build_binary $shared $picflag $test $source $libname $other $mapfile $verexp $versymexp $symexp ""
 
586
}
 
587
 
 
588
proc build_vers_lib_pic_flags { test source libname other mapfile verexp versymexp symexp ldargs } {
 
589
  global picflag
 
590
  global shared
 
591
  build_binary $shared $picflag $test $source $libname $other $mapfile $verexp $versymexp $symexp $ldargs
 
592
}
 
593
 
 
594
proc test_ldfail { test flag source execname other mapfile whyfail } {
 
595
    global srcdir
 
596
    global subdir
 
597
    global exec_output
 
598
    global host_triplet
 
599
    global tmpdir
 
600
    global as
 
601
    global as_options
 
602
    global objdump
 
603
    global CC
 
604
    global CFLAGS
 
605
    global script
 
606
 
 
607
    if [string match "" $other] then {
 
608
        set other_lib ""
 
609
    } else {
 
610
        set other_lib $tmpdir/$other
 
611
    }
 
612
 
 
613
    if ![ld_compile "$CC -S $flag $CFLAGS" $srcdir/$subdir/$source $tmpdir/$execname.s]     {
 
614
        unresolved "$test"
 
615
        return
 
616
    }
 
617
 
 
618
    if ![ld_assemble $as "$as_options $tmpdir/$execname.s" $tmpdir/$execname.o ]     {
 
619
        unresolved "$test"
 
620
        return
 
621
    }
 
622
 
 
623
    verbose -log "This link should fail because of $whyfail"
 
624
 
 
625
    if [string match "" $mapfile] then {
 
626
        set script_arg ""
 
627
    } else {
 
628
        set script_arg "-Wl,$script $srcdir/$subdir/$mapfile"
 
629
    }
 
630
 
 
631
    if {![ld_simple_link $CC $tmpdir/$execname "$tmpdir/$execname.o $other_lib $script_arg"]}     {
 
632
        pass "$test"
 
633
        return
 
634
    }
 
635
    fail "$test"
 
636
}
 
637
 
 
638
proc test_asfail { test flag source execname whyfail } {
 
639
    global srcdir
 
640
    global subdir
 
641
    global tmpdir
 
642
    global as
 
643
    global CC
 
644
    global CFLAGS
 
645
 
 
646
    if ![ld_compile "$CC -S $flag $CFLAGS" $srcdir/$subdir/$source $tmpdir/$execname.s]     {
 
647
        unresolved "$test"
 
648
        return
 
649
    }
 
650
 
 
651
    verbose -log "This assemble should fail because of $whyfail"
 
652
    catch "exec $as -o $tmpdir/$execname.o $tmpdir/$execname.s" exec_output
 
653
    set exec_output [prune_warnings $exec_output]
 
654
    if [string match "" $exec_output] then {
 
655
        fail "$test"
 
656
        return
 
657
    }
 
658
    verbose -log "$exec_output"
 
659
    pass "$test"
 
660
}
 
661
 
 
662
proc test_strip_vers_lib { test srclib libname verexp versymexp } {
 
663
    global strip
 
664
    global srcdir
 
665
    global subdir
 
666
    global exec_output
 
667
    global host_triplet
 
668
    global tmpdir
 
669
    global objdump
 
670
 
 
671
    verbose -log "cp $tmpdir/$srclib $tmpdir/$libname.so"
 
672
    exec cp $tmpdir/$srclib $tmpdir/$libname.so
 
673
 
 
674
    verbose -log "$strip $tmpdir/$libname.so"
 
675
    catch "exec $strip $tmpdir/$libname.so" exec_output
 
676
    if [string match "" $exec_output] then {
 
677
 
 
678
# If strip went OK, then run the usual tests on the thing to make sure that
 
679
# it is sane.
 
680
        if {![objdump_versionstuff $objdump $tmpdir/$libname.so $srcdir/$subdir/$verexp ]}     {
 
681
            fail "$test"
 
682
            return
 
683
        }
 
684
 
 
685
        if {![objdump_dynsymstuff $objdump $tmpdir/$libname.so $srcdir/$subdir/$versymexp ]}     {
 
686
            fail "$test"
 
687
            return
 
688
        }
 
689
 
 
690
    } else {
 
691
        verbose -log "$exec_output"
 
692
        fail "$test"
 
693
        return
 
694
    }
 
695
    pass $test
 
696
}
 
697
 
 
698
 
 
699
proc build_exec { test source execname flags solibname verexp versymexp symexp } {
 
700
    global srcdir
 
701
    global subdir
 
702
    global exec_output
 
703
    global host_triplet
 
704
    global tmpdir
 
705
    global as
 
706
    global as_options
 
707
    global objdump
 
708
    global CC
 
709
    global CFLAGS
 
710
 
 
711
    set shared "--shared --no-undefined-version"
 
712
    set script --version-script
 
713
    if ![ld_compile "$CC -S $CFLAGS" $srcdir/$subdir/$source $tmpdir/$execname.s]     {
 
714
        unresolved "$test"
 
715
        return
 
716
    }
 
717
 
 
718
    if ![ld_assemble $as "$as_options $tmpdir/$execname.s" $tmpdir/$execname.o ]     {
 
719
        unresolved "$test"
 
720
        return
 
721
    }
 
722
 
 
723
    if [string match "" $solibname] then {
 
724
        set solibname_lib ""
 
725
    } else {
 
726
        set solibname_lib $tmpdir/$solibname
 
727
    }
 
728
 
 
729
    if {![ld_simple_link $CC $tmpdir/$execname "$flags $tmpdir/$execname.o $solibname_lib"]}     {
 
730
        fail "$test"
 
731
        return
 
732
    }
 
733
 
 
734
    if [string match "" $verexp] then {
 
735
#
 
736
# Make sure we get nothing back.
 
737
#
 
738
        if {![objdump_emptyverstuff $objdump $tmpdir/$execname ]}     {
 
739
            fail "$test"
 
740
            return
 
741
        }
 
742
    } else {
 
743
        if {![objdump_versionstuff $objdump $tmpdir/$execname $srcdir/$subdir/$verexp ]}     {
 
744
            fail "$test"
 
745
            return
 
746
        }
 
747
    }
 
748
 
 
749
    if [string match "" $versymexp] then {
 
750
        if {![objdump_emptydynsymstuff $objdump $tmpdir/$execname ]}     {
 
751
            fail "$test"
 
752
            return
 
753
        }
 
754
    } else {
 
755
        if {![objdump_dynsymstuff $objdump $tmpdir/$execname $srcdir/$subdir/$versymexp ]}     {
 
756
            fail "$test"
 
757
            return
 
758
        }
 
759
    }
 
760
 
 
761
    if [string match "" $symexp] then {
 
762
        if {![objdump_emptysymstuff $objdump $tmpdir/$execname.o ]}     {
 
763
            fail "$test"
 
764
            return
 
765
        }
 
766
    } else {
 
767
        if {![objdump_symstuff $objdump $tmpdir/$execname.o $srcdir/$subdir/$symexp ]}     {
 
768
            fail "$test"
 
769
            return
 
770
        }
 
771
    }
 
772
 
 
773
    pass $test
 
774
}
 
775
 
 
776
if { [istarget x86_64-*-linux*] \
 
777
     || ( [istarget mips*-*-linux*] && [at_least_gcc_version 4 3] ) } {
 
778
    # x86_64 and newer MIPS toolchains do not like non-pic shared libraries
 
779
    set pic "yes"
 
780
} else {
 
781
    set pic "no"
 
782
}
 
783
 
 
784
#
 
785
# Basic test - build a library with versioned symbols.
 
786
#
 
787
build_vers_lib_pic "vers1" vers1.c vers1 "" vers1.map vers1.ver vers1.dsym vers1.sym
 
788
 
 
789
 
 
790
#
 
791
# Test #2 - build a library, and link it against the library we built in step
 
792
# 1.
 
793
#
 
794
build_vers_lib_pic "vers2" vers2.c vers2 vers1.so vers2.map vers2.ver vers2.dsym ""
 
795
 
 
796
#
 
797
# Test #3 - build an executable, and link it against vers1.so.
 
798
#
 
799
build_exec "vers3" vers3.c vers3 "-Wl,--no-as-needed" vers1.so vers3.ver vers3.dsym ""
 
800
 
 
801
#
 
802
# Test #4 - Make sure a version implicitly defined in an executable
 
803
# causes a version node to be created.  Verify this both with and without
 
804
# --export-dynamic.
 
805
#
 
806
 
 
807
# This test fails on MIPS.  On the MIPS we must put foo in the dynamic
 
808
# symbol table, which the test does not expect.
 
809
setup_xfail "mips*-*-*"
 
810
build_exec "vers4" vers4.c vers4 "" "" "" "" vers4.sym
 
811
 
 
812
build_exec "vers4a" vers4.c vers4a "-Wl,-export-dynamic" "" vers4a.ver vers4a.dsym vers4a.sym
 
813
 
 
814
# Verify that --no-export-dynamic undoes the effect of --export-dynamic.
 
815
setup_xfail "mips*-*-*"
 
816
build_exec "vers4b" vers4.c vers4b "-Wl,-export-dynamic -Wl,--no-export-dynamic" "" "" "" vers4.sym
 
817
 
 
818
 
 
819
#
 
820
# Try multiple definitions foo@BAR and foo@@BAR and make sure the linker
 
821
# complains.
 
822
#
 
823
test_ldfail "vers5" "" vers5.c vers5 "" "" "multiple definition of foo@VERS_1.2"
 
824
 
 
825
#
 
826
#
 
827
# Now build a test that should reference a bunch of versioned symbols.
 
828
# All of them should be correctly referenced.
 
829
#
 
830
build_exec "vers6" vers6.c vers6 "-Wl,--no-as-needed" vers1.so vers6.ver vers6.dsym vers6.sym
 
831
 
 
832
#
 
833
# Another test to verify that something made local via 'local' is truly not
 
834
# accessible.
 
835
#
 
836
if [string match "yes" $pic] then {
 
837
    xfail "vers7a"
 
838
    xfail "vers7"
 
839
} else {
 
840
    build_vers_lib_no_pic "vers7a" vers7a.c vers7a "" vers7.map vers7a.ver vers7a.dsym vers7a.sym
 
841
 
 
842
    test_ldfail "vers7" "" vers7.c vers7 vers7a.so "" "undefined reference to hide_a"
 
843
}
 
844
 
 
845
 
 
846
#
 
847
# This test is designed to verify that we can pass a linker script on the
 
848
# command line as if it were a normal .o file.
 
849
#
 
850
catch "exec cp $srcdir/$subdir/vers8.map $tmpdir/" ignore_output
 
851
build_vers_lib_pic "vers8" vers1.c vers8 vers8.map "" vers8.ver vers1.dsym vers1.sym
 
852
 
 
853
#
 
854
# This test tries to make sure that version references to versioned symbols
 
855
# don't collide with default definitions with the same symbol.
 
856
#
 
857
build_exec "vers9" vers9.c vers9 "-Wl,-export-dynamic" "" vers9.ver vers9.dsym vers9.sym
 
858
 
 
859
 
 
860
#
 
861
# Try and use a non-existant version node.  The linker should fail with
 
862
# an error message.
 
863
#
 
864
test_ldfail "vers10" "-DDO_TEST10" vers1.c vers10 "" "vers1.map --shared" "invalid version"
 
865
 
 
866
#
 
867
# Try and some things the assembler should complain about.
 
868
#
 
869
test_asfail "vers11" "-DDO_TEST11" vers1.c vers11 "no @ in symver"
 
870
 
 
871
test_asfail "vers12" "-DDO_TEST12" vers1.c vers12 "extern version definition"
 
872
 
 
873
#
 
874
# Put a shared library in an archive library, and make sure the global
 
875
# archive symbol table is sane.
 
876
#
 
877
test_ar "ar with versioned solib" vers13.a vers1.so vers13.asym
 
878
 
 
879
#
 
880
# Strip a shared library, and make sure we didn't screw something up in there.
 
881
#
 
882
test_strip_vers_lib "vers14" vers1.so vers14 vers1.ver vers1.dsym
 
883
 
 
884
 
 
885
#
 
886
# Build another test with some versioned symbols.  Here we are going to
 
887
# try and override something from the library, and we shouldn't get
 
888
# any errors.
 
889
#
 
890
build_exec "vers15" vers15.c vers15 "-Wl,--no-as-needed" vers1.so vers15.ver vers15.dsym vers15.sym
 
891
 
 
892
#
 
893
# Test that when we override a versioned symbol from the library this
 
894
# symbol appears in the dynamic symbol table of the executable.
 
895
#
 
896
build_vers_lib_pic "vers16a" vers16a.c vers16a "" vers16.map vers16a.ver vers16a.dsym ""
 
897
build_exec "vers16" vers16.c vers16 "-Wl,--no-as-needed" vers16a.so "" vers16.dsym ""
 
898
 
 
899
# Test a weak versioned symbol.
 
900
build_vers_lib_pic "vers17" vers17.c vers17 "" vers17.map vers17.ver vers17.dsym ""
 
901
build_vers_lib_pic "vers18" vers18.c vers18 vers17.so vers18.map vers18.ver vers18.dsym vers18.sym
 
902
build_exec "vers19" vers19.c vers19 "-Wl,-rpath,. -Wl,-rpath-link,--no-as-needed" vers18.so vers19.ver vers19.dsym ""
 
903
 
 
904
build_vers_lib_no_pic "vers20a" vers20.c vers20a "" vers20.map vers20a.ver vers20.dsym ""
 
905
exec cp $tmpdir/vers20a.so $tmpdir/vers20b.so
 
906
build_vers_lib_no_pic "vers20" vers20.c vers20 "vers20a.so vers20b.so" vers20.map vers20.ver vers20.dsym ""
 
907
 
 
908
# Test .symver override.
 
909
build_vers_lib_pic "vers21" vers21.c vers21 "" vers21.map vers21.ver vers21.dsym vers21.sym
 
910
 
 
911
# Test moving default definition from one DSO to another.
 
912
build_vers_lib_pic "vers22a" vers22a.c vers22a "" vers22.map vers22a.ver vers22a.dsym vers22a.sym
 
913
build_vers_lib_pic "vers22b" vers22b.c vers22b "" vers22.map vers22b.ver vers22b.dsym ""
 
914
build_vers_lib_pic "vers22" vers22.c vers22 "vers22a.so vers22b.so" "" vers22.ver vers22.dsym ""
 
915
 
 
916
# Test versioned definitions in different files.
 
917
if [string match "yes" $pic] then {
 
918
    xfail "vers23a"
 
919
    xfail "vers23b"
 
920
    xfail "vers23c"
 
921
    xfail "vers23d"
 
922
    xfail "vers23"
 
923
} else {
 
924
    build_vers_lib_no_pic "vers23a" vers23a.c vers23a "" vers23a.map vers23a.ver vers23a.dsym vers23a.sym
 
925
    build_vers_lib_no_pic "vers23b" vers23b.c vers23b "" vers23b.map vers23b.ver vers23b.dsym ""
 
926
    build_vers_lib_no_pic "vers23c" vers23b.c vers23c "vers23a.so" vers23b.map vers23c.ver vers23b.dsym ""
 
927
    build_exec "vers23d" vers23.c vers23d "-Wl,--no-as-needed tmpdir/vers23a.so tmpdir/vers23c.so" "" vers23.ver vers23d.dsym ""
 
928
    build_exec "vers23" vers23.c vers23 "-Wl,--no-as-needed tmpdir/vers23a.so tmpdir/vers23b.o tmpdir/vers23b.so" "" vers23.ver vers23.dsym ""
 
929
}
 
930
 
 
931
# Test .symver x,x@VERS.0
 
932
set as_pic_flags ""
 
933
if [istarget sparc*-*-*] {
 
934
  set as_pic_flags "-K PIC"
 
935
}
 
936
run_ld_link_tests [list "\"vers24a\"
 
937
                         \"-shared --version-script $srcdir/$subdir/vers24.map\" \"\"
 
938
                         \"$as_pic_flags $as_options\" {vers24a.c vers24b.c} { { readelf -Wrs vers24.rd } }
 
939
                         \"libvers24a.so\" \"-fpic\""]
 
940
run_ld_link_tests [list "\"vers24b\"
 
941
                         \"-shared --version-script $srcdir/$subdir/vers24.map\" \"\"
 
942
                         \"$as_pic_flags $as_options\" {vers24b.c vers24a.c} { { readelf -Wrs vers24.rd } }
 
943
                         \"libvers24b.so\" \"-fpic\""]
 
944
run_ld_link_tests [list "\"vers24c\"
 
945
                         \"-shared --version-script $srcdir/$subdir/vers24.map\" \"\"
 
946
                         \"$as_pic_flags $as_options\" {vers24c.c} { { readelf -Wrs vers24.rd } }
 
947
                         \"libvers24c.so\" \"-fpic\""]
 
948
 
 
949
# Test versioned definition vs. normal definition in different files.
 
950
if [string match "yes" $pic] then {
 
951
    xfail "vers25a"
 
952
    xfail "vers25b1"
 
953
    xfail "vers25b2"
 
954
} else {
 
955
    build_vers_lib_no_pic "vers25a" vers25a.c vers25a "" vers25a.map vers25a.ver vers25a.dsym ""
 
956
    build_vers_lib_no_pic "vers25b1" vers25b.c vers25b1 "vers25a.o vers25a.so" "" vers25b.ver vers25b.dsym ""
 
957
    build_vers_lib_no_pic "vers25b2" vers25b.c vers25b2 "vers25a.so vers25a.o" "" vers25b.ver vers25b.dsym ""
 
958
}
 
959
 
 
960
build_vers_lib_pic "vers26a" vers26a.c vers26a "" vers26a.map vers26a.ver vers26a.dsym ""
 
961
build_vers_lib_pic "vers26b1" vers26b.c vers26b1 "" "" vers26b.ver vers26b.dsym ""
 
962
build_vers_lib_pic "vers26b2" vers26b.c vers26b2 "vers26a.so vers26b1.so vers26a.o" "" vers26b.ver vers26b.dsym ""
 
963
if [string match "yes" $pic] then {
 
964
    xfail "vers26b3"
 
965
} else {
 
966
    build_vers_lib_no_pic "vers26b3" vers26b.c vers26b3 "vers26a.so vers26b1.so vers26a.o" "" vers26b.ver vers26b.dsym ""
 
967
}
 
968
 
 
969
# Test versioned definition vs. hidden definition in different files.
 
970
if [string match "yes" $pic] then {
 
971
    xfail "vers27a"
 
972
    xfail "vers27b"
 
973
    xfail "vers27c1"
 
974
    xfail "vers27c2"
 
975
    xfail "vers27d1"
 
976
    xfail "vers27d2"
 
977
    xfail "vers27d3"
 
978
    xfail "vers27d4"
 
979
    xfail "vers27d5"
 
980
} else {
 
981
    build_vers_lib_no_pic "vers27a" vers27a.c vers27a "" vers27a.map vers27a.ver vers27a.dsym ""
 
982
    build_vers_lib_no_pic "vers27b" vers27b.c vers27b "" "" vers27b.ver vers27b.dsym ""
 
983
    build_vers_lib_no_pic "vers27c1" vers27c.c vers27c1 "vers27b.o vers27a.so" "" vers27c.ver vers27c.dsym ""
 
984
    build_vers_lib_no_pic "vers27c2" vers27c.c vers27c2 "vers27a.so vers27b.o" "" vers27c.ver vers27c.dsym ""
 
985
    build_vers_lib_pic "vers27d1" vers27d1.c vers27d1 "" vers27a.map vers27d.ver vers27d.dsym vers27d.sym
 
986
   build_vers_lib_pic "vers27d2" vers27d2.c vers27d2 "" "" vers27b.ver vers27b.dsym ""
 
987
    build_executable "vers27d3" vers27d3.c vers27d3 "vers27b.o vers27d2.so vers27d1.so" "" vers27b.ver vers27b.dsym ""
 
988
    build_vers_lib_pic "vers27d4" vers27d2.c vers27d4 "vers27a.so" "" vers27d4.ver vers27d4.dsym ""
 
989
    build_executable "vers27d5" vers27d3.c vers27d5 "vers27d4.so vers27b.o vers27a.so" "" vers27b.ver vers27b.dsym ""
 
990
}
 
991
 
 
992
# Test weak versioned definition vs. strong definition in different
 
993
# files.
 
994
build_vers_lib_pic "vers28a" vers28a.c vers28a "" "" vers28a.ver vers28a.dsym ""
 
995
build_vers_lib_pic "vers28b" vers28b.c vers28b "" vers28b.map vers28b.ver vers28b.dsym ""
 
996
build_vers_lib_pic "vers28c" vers28c.c vers28c "vers28b.so vers28a.so" "" vers28c.ver vers28c.dsym ""
 
997
build_vers_lib_pic_flags "vers29" vers29.c vers29 "" "" vers29.ver vers29.dsym "" "--default-symver"
 
998
 
 
999
# Test #30 - test handling of symbol names global, local and extern in the
 
1000
# version script.
 
1001
build_vers_lib_pic "vers30" vers30.c vers30 "" vers30.map vers30.ver vers30.dsym ""
 
1002
 
 
1003
# Test #31 -- quoted strings in version sections.
 
1004
build_vers_lib_pic "vers31" vers31.c vers31 "" vers31.map vers31.ver vers31.dsym ""
 
1005
 
 
1006
# Test #32 -- linker --defsym
 
1007
build_vers_lib_pic "vers32a" vers32a.c vers32a "" vers32.map vers32a.ver vers32a.dsym ""
 
1008
build_vers_lib_pic_flags "vers32b" vers32b.c vers32b "vers32a.so" vers32.map vers32b.ver vers32b.dsym "" "--defsym foo=0"