OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [trunk/] [gnu-src/] [binutils-2.20.1/] [ld/] [testsuite/] [ld-ifunc/] [ifunc.exp] - Blame information for rev 215

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

Line No. Rev Author Line
1 205 julius
# Expect script for linker support of IFUNC symbols and relocations.
2
#
3
#   Copyright 2009  Free Software Foundation, Inc.
4
#   Contributed by Red Hat.
5
#
6
# This file is part of the GNU Binutils.
7
#
8
# This program is free software; you can redistribute it and/or modify
9
# it under the terms of the GNU General Public License as published by
10
# the Free Software Foundation; either version 3 of the License, or
11
# (at your option) any later version.
12
#
13
# This program is distributed in the hope that it will be useful,
14
# but WITHOUT ANY WARRANTY; without even the implied warranty of
15
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
# GNU General Public License for more details.
17
#
18
# You should have received a copy of the GNU General Public License
19
# along with this program; if not, write to the Free Software
20
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21
# MA 02110-1301, USA.
22
#
23
# Written by Nick Clifton 
24
 
25
 
26
# IFUNC support has only been implemented for the ix86, x86_64 and powerpc
27
# so far.
28
if {!(([istarget "i?86-*-*"]
29
       || [istarget "x86_64-*-*"]
30
       || [istarget "powerpc*-*-*"])
31
      && ([istarget "*-*-elf*"]
32
          || ([istarget "*-*-linux*"]
33
              && ![istarget "*-*-*aout*"]
34
              && ![istarget "*-*-*oldld*"]))) } {
35
    verbose "IFUNC tests not run - target does not support IFUNC"
36
    return
37
}
38
 
39
# We need a native system.  FIXME: Strictly speaking this
40
# is not true, we just need to know how to create a fully
41
# linked executable, including the C and Z libraries, using
42
# the linker that is under test.
43
if ![isnative] {
44
    verbose "IFUNC tests not run - not a native toolchain"
45
    return
46
}
47
 
48
# We need a working compiler.  (Strictly speaking this is
49
# not true, we could use target specific assembler files).
50
if { [which $CC] == 0 } {
51
    verbose "IFUNC tests not run - no compiler available"
52
    return
53
}
54
 
55
# A procedure to check the OS/ABI field in the ELF header of a binary file.
56
proc check_osabi { binary_file expected_osabi } {
57
    global READELF
58
    global READELFFLAGS
59
 
60
    catch "exec $READELF $READELFFLAGS --file-header $binary_file > readelf.out" got
61
 
62
    if ![string match "" $got] then {
63
        verbose "proc check_osabi: Readelf produced unexpected out processing $binary_file: $got"
64
        return 0
65
    }
66
 
67
    if { ![regexp "\n\[ \]*OS/ABI:\[ \]*(.+)\n\[ \]*ABI" \
68
           [file_contents readelf.out] nil osabi] } {
69
        verbose "proc check_osabi: Readelf failed to extract an ELF header from $binary_file"
70
        return 0
71
    }
72
 
73
    if { $osabi == $expected_osabi } {
74
        return 1
75
    }
76
 
77
    verbose "Expected OSABI: $expected_osabi, Obtained osabi: $osabi"
78
 
79
    return 0
80
}
81
 
82
# A procedure to confirm that a file contains the IFUNC symbol.
83
# Returns -1 upon error, 0 if the symbol was not found and 1 if it was found.
84
proc contains_ifunc_symbol { binary_file } {
85
    global READELF
86
    global READELFFLAGS
87
 
88
    catch "exec $READELF $READELFFLAGS --symbols $binary_file > readelf.out" got
89
 
90
    if ![string match "" $got] then {
91
        verbose "proc contains_ifunc_symbol: Readelf produced unexpected out processing $binary_file: $got"
92
        return -1
93
    }
94
 
95
    # Look for a line like this:
96
    #    58: 0000000000400600    30 IFUNC   GLOBAL DEFAULT   12 library_func2
97
 
98
    if { ![regexp ".*\[ \]*IFUNC\[ \]+GLOBAL\[ \]+DEFAULT\[ \]+\[UND0-9\]+\[ \]+library_func2\n" [file_contents readelf.out]] } {
99
        return 0
100
    }
101
 
102
    return 1
103
}
104
 
105
# A procedure to confirm that a file contains the R_*_IRELATIVE
106
# relocation.
107
# Returns -1 upon error, 0 if the relocation was not found and 1 if
108
# it was found.
109
proc contains_irelative_reloc { binary_file } {
110
    global READELF
111
    global READELFFLAGS
112
 
113
    catch "exec $READELF $READELFFLAGS --relocs --wide $binary_file > readelf.out" got
114
 
115
    if ![string match "" $got] then {
116
        verbose "proc contains_irelative_reloc: Readelf produced unexpected out processing $binary_file: $got"
117
        return -1
118
    }
119
 
120
    # Look for a line like this:
121
    #    0000000000600ab0  0000000000000025 R_X86_64_IRELATIVE      000000000040061c
122
    #    080496f4  0000002a R_386_IRELATIVE
123
 
124
 
125
    if { ![regexp "\[0-9a-f\]+\[ \]+\[0-9a-f\]+\[ \]+R_\[_0-9A-Z\]+_IREL(|ATIVE)\[ \]*\[0-9a-f\]*\n" [file_contents readelf.out]] } {
126
        return 0
127
    }
128
 
129
    return 1
130
}
131
 
132
# A procedure to confirm that a file contains a relocation that references an IFUNC symbol.
133
# Returns -1 upon error, 0 if the reloc was not found and 1 if it was found.
134
proc contains_ifunc_reloc { binary_file } {
135
    global READELF
136
    global READELFFLAGS
137
 
138
    catch "exec $READELF $READELFFLAGS --relocs $binary_file > readelf.out" got
139
 
140
    if ![string match "" $got] then {
141
        verbose "proc contains_ifunc_reloc: Readelf produced unexpected out processing $binary_file: $got"
142
        return -1
143
    }
144
 
145
    if [string match "" [file_contents readelf.out]] then {
146
        verbose "No relocs found in $binary_file"
147
        return 0
148
    }
149
 
150
    if { ![regexp "\\(\\)" [file_contents readelf.out]] } {
151
        return 0
152
    }
153
 
154
    return 1
155
}
156
 
157
set fails 0
158
 
159
# Create the object files, libraries and executables.
160
if ![ld_compile "$CC -c -fPIC" "$srcdir/$subdir/prog.c" "tmpdir/shared_prog.o"] {
161
    fail "Could not create a PIC object file"
162
    set fails [expr $fails + 1]
163
}
164
if ![ld_compile "$CC -c" "$srcdir/$subdir/prog.c" "tmpdir/static_prog.o"] {
165
    fail "Could not create a non-PIC object file"
166
    set fails [expr $fails + 1]
167
}
168
if ![ld_compile "$CC -c -fPIC -DWITH_IFUNC" "$srcdir/$subdir/lib.c" "tmpdir/shared_ifunc.o"] {
169
    fail "Could not create a PIC object file containing an IFUNC symbol"
170
    set fails [expr $fails + 1]
171
}
172
if ![ld_compile "$CC -c -DWITH_IFUNC" "$srcdir/$subdir/lib.c" "tmpdir/static_ifunc.o"] {
173
    fail "Could not create a non-PIC object file containing an IFUNC symbol"
174
    set fails [expr $fails + 1]
175
}
176
if ![ld_compile "$CC -c -DWITHOUT_IFUNC" "$srcdir/$subdir/lib.c" "tmpdir/static_noifunc.o"] {
177
    fail "Could not create an ordinary non-PIC object file"
178
    set fails [expr $fails + 1]
179
}
180
if ![ld_assemble $as "$srcdir/ld-elf/empty.s" "tmpdir/empty.o"] {
181
    fail "Could not create an empty object file"
182
    set fails [expr $fails + 1]
183
}
184
if ![ld_compile "$CC -c" "$srcdir/$subdir/test-1.c" "tmpdir/test-1.o"] {
185
    fail "Could not create test-1.o"
186
    set fails [expr $fails + 1]
187
}
188
if ![ld_compile "$CC -fPIC -c" "$srcdir/$subdir/test-2.c" "tmpdir/test-2.o"] {
189
    fail "Could not create test-2.o"
190
    set fails [expr $fails + 1]
191
}
192
 
193
if { $fails != 0 } {
194
    return
195
}
196
 
197
if ![ld_simple_link $ld "tmpdir/libshared_ifunc.so" "-shared tmpdir/shared_ifunc.o"] {
198
    fail "Could not create a shared library containing an IFUNC symbol"
199
    set fails [expr $fails + 1]
200
}
201
if ![ar_simple_create $ar "" "tmpdir/libifunc.a" "tmpdir/static_ifunc.o"] {
202
    fail "Could not create a static library containing an IFUNC symbol"
203
    set fails [expr $fails + 1]
204
}
205
 
206
if { $fails != 0 } {
207
    return
208
}
209
 
210
if ![default_ld_link $ld "tmpdir/dynamic_prog" "-Ltmpdir tmpdir/shared_prog.o -Bdynamic -lshared_ifunc -rpath ./tmpdir"] {
211
    fail "Could not link a dynamic executable"
212
    set fails [expr $fails + 1]
213
}
214
if ![default_ld_link $ld "tmpdir/local_prog" "-Ltmpdir tmpdir/static_prog.o -lifunc"] {
215
    fail "Could not link a dynamic executable using local ifunc"
216
    set fails [expr $fails + 1]
217
}
218
if ![default_ld_link $ld "tmpdir/static_prog" "-static -Ltmpdir tmpdir/static_prog.o -lifunc"] {
219
    fail "Could not link a static executable"
220
    set fails [expr $fails + 1]
221
}
222
if ![ld_simple_link $ld "tmpdir/static_nonifunc_prog" "-static tmpdir/empty.o"] {
223
    fail "Could not link a non-ifunc using static executable"
224
    set fails [expr $fails + 1]
225
}
226
if ![default_ld_link $ld "tmpdir/test-1" "tmpdir/test-1.o tmpdir/libshared_ifunc.so"] {
227
    fail "Could not link test-1"
228
    set fails [expr $fails + 1]
229
}
230
if ![ld_simple_link $ld "tmpdir/libtest-2.so" "-shared tmpdir/test-2.o"] {
231
    fail "Could not link libtest-2.so"
232
    set fails [expr $fails + 1]
233
}
234
 
235
if { $fails == 0 } {
236
  pass "Building ifunc binaries"
237
  set fails 0
238
} else {
239
    return
240
}
241
 
242
# Check the executables and shared libraries
243
#
244
# The linked ifunc using executables and the shared library containing
245
# ifunc should have an OSABI field of LINUX.  The linked non-ifunc using
246
# executable should have an OSABI field of NONE (aka System V).
247
 
248
if {! [check_osabi tmpdir/libshared_ifunc.so {UNIX - Linux}]} {
249
    fail "Shared libraries containing ifunc does not have an OS/ABI field of LINUX"
250
    set fails [expr $fails + 1]
251
}
252
if {! [check_osabi tmpdir/local_prog {UNIX - Linux}]} {
253
    fail "Local ifunc-using executable does not have an OS/ABI field of LINUX"
254
    set fails [expr $fails + 1]
255
}
256
if {! [check_osabi tmpdir/static_prog {UNIX - Linux}]} {
257
    fail "Static ifunc-using executable does not have an OS/ABI field of LINUX"
258
    set fails [expr $fails + 1]
259
}
260
if {! [check_osabi tmpdir/dynamic_prog {UNIX - Linux}]} {
261
    fail "Dynamic ifunc-using executable does not have an OS/ABI field of LINUX"
262
    set fails [expr $fails + 1]
263
}
264
if {! [check_osabi tmpdir/static_nonifunc_prog {UNIX - System V}]} {
265
    fail "Static non-ifunc-using executable does not have an OS/ABI field of System V"
266
    set fails [expr $fails + 1]
267
}
268
 
269
# The linked ifunc using executables and the shared library containing
270
# ifunc should contain an IFUNC symbol.  The non-ifunc using executable
271
# should not.
272
 
273
if {[contains_ifunc_symbol tmpdir/libshared_ifunc.so] != 1} {
274
    fail "Shared libraries containing ifunc does not contain an IFUNC symbol"
275
    set fails [expr $fails + 1]
276
}
277
if {[contains_ifunc_symbol tmpdir/local_prog] != 1} {
278
    fail "Local ifunc-using executable does not contain an IFUNC symbol"
279
    set fails [expr $fails + 1]
280
}
281
if {[contains_ifunc_symbol tmpdir/static_prog] != 1} {
282
    fail "Static ifunc-using executable does not contain an IFUNC symbol"
283
    set fails [expr $fails + 1]
284
}
285
if {[contains_ifunc_symbol tmpdir/dynamic_prog] != 0} {
286
    fail "Dynamic ifunc-using executable contains an IFUNC symbol"
287
    set fails [expr $fails + 1]
288
}
289
if {[contains_ifunc_symbol tmpdir/static_nonifunc_prog] != 0} {
290
    fail "Static non-ifunc-using executable contains an IFUNC symbol"
291
    set fails [expr $fails + 1]
292
}
293
if {[contains_ifunc_symbol tmpdir/test-1] != 0} {
294
    fail "test-1 contains IFUNC symbols"
295
    set fails [expr $fails + 1]
296
}
297
if {[contains_ifunc_symbol tmpdir/libtest-2.so] != 0} {
298
    fail "libtest-2.so contains IFUNC symbols"
299
    set fails [expr $fails + 1]
300
}
301
 
302
# The linked ifunc using executables and shared libraries should contain
303
# a dynamic reloc referencing the IFUNC symbol.  (Even the static
304
# executable which should have a dynamic section created for it).  The
305
# non-ifunc using executable should not.
306
 
307
if {[contains_irelative_reloc tmpdir/libshared_ifunc.so] != 1} {
308
    fail "ifunc-using shared library does not contain R_*_IRELATIVE relocation"
309
    set fails [expr $fails + 1]
310
}
311
if {[contains_irelative_reloc tmpdir/local_prog] != 1} {
312
    fail "Local ifunc-using executable does not contain R_*_IRELATIVE relocation"
313
    set fails [expr $fails + 1]
314
}
315
if {[contains_irelative_reloc tmpdir/static_prog] != 1} {
316
    fail "Static ifunc-using executable does not contain R_*_IRELATIVE relocation"
317
    set fails [expr $fails + 1]
318
}
319
if {[contains_ifunc_reloc tmpdir/dynamic_prog] != 0} {
320
    fail "Dynamic ifunc-using executable contains a reloc against an IFUNC symbol"
321
    set fails [expr $fails + 1]
322
}
323
if {[contains_ifunc_reloc tmpdir/static_nonifunc_prog] == 1} {
324
    fail "Static non-ifunc-using executable contains a reloc against an IFUNC symbol!"
325
    set fails [expr $fails + 1]
326
}
327
 
328
if { $fails == 0 } {
329
  pass "Checking ifunc binaries"
330
}
331
 
332
# Clean up, unless we are being verbose, in which case we leave the files available.
333
if { $verbose < 1 } {
334
    remote_file host delete "tmpdir/shared_prog.o"
335
    remote_file host delete "tmpdir/static_prog.o"
336
    remote_file host delete "tmpdir/shared_ifunc.o"
337
    remote_file host delete "tmpdir/static_ifunc.o"
338
    remote_file host delete "tmpdir/static_noifunc.o"
339
    remote_file host delete "tmpdir/libshared_ifunc.so"
340
    remote_file host delete "tmpdir/libifunc.a"
341
    remote_file host delete "tmpdir/dynamic_prog"
342
    remote_file host delete "tmpdir/local_prog"
343
    remote_file host delete "tmpdir/static_prog"
344
    remote_file host delete "tmpdir/static_nonifunc_prog"
345
}
346
 
347
set test_list [lsort [glob -nocomplain $srcdir/$subdir/*.d]]
348
foreach t $test_list {
349
    # We need to strip the ".d", but can leave the dirname.
350
    verbose [file rootname $t]
351
    run_dump_test [file rootname $t]
352
}

powered by: WebSVN 2.1.0

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