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 166

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