OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [ld/] [testsuite/] [ld-elfvers/] [vers.exp] - Blame information for rev 92

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.