]>
Commit | Line | Data |
---|---|---|
3c30afc8 | 1 | /* Test STT_GNU_IFUNC symbols without direct function call. */ |
31c759bf | 2 | #include "ifunc-sel.h" |
3c30afc8 | 3 | |
e0ed2fb4 L |
4 | int global = -1; |
5 | /* Can't use __attribute__((visibility("protected"))) until the GCC bug: | |
6 | ||
7 | https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65248 | |
8 | ||
9 | is fixed. */ | |
10 | asm (".protected global"); | |
3c30afc8 L |
11 | |
12 | static int | |
13 | one (void) | |
14 | { | |
15 | return 1; | |
16 | } | |
17 | ||
18 | static int | |
19 | minus_one (void) | |
20 | { | |
21 | return -1; | |
22 | } | |
23 | ||
24 | static int | |
e364e6f1 | 25 | zero (void) |
3c30afc8 L |
26 | { |
27 | return 0; | |
28 | } | |
29 | ||
30 | void * foo_ifunc (void) __asm__ ("foo"); | |
31 | __asm__(".type foo, %gnu_indirect_function"); | |
32 | ||
e364e6f1 | 33 | void * |
de659123 | 34 | inhibit_stack_protector |
3c30afc8 L |
35 | foo_ifunc (void) |
36 | { | |
31c759bf | 37 | return ifunc_sel (one, minus_one, zero); |
3c30afc8 L |
38 | } |
39 | ||
40 | void * foo_hidden_ifunc (void) __asm__ ("foo_hidden"); | |
41 | __asm__(".type foo_hidden, %gnu_indirect_function"); | |
42 | ||
e364e6f1 | 43 | void * |
de659123 | 44 | inhibit_stack_protector |
3c30afc8 L |
45 | foo_hidden_ifunc (void) |
46 | { | |
31c759bf | 47 | return ifunc_sel (minus_one, one, zero); |
3c30afc8 L |
48 | } |
49 | ||
50 | void * foo_protected_ifunc (void) __asm__ ("foo_protected"); | |
51 | __asm__(".type foo_protected, %gnu_indirect_function"); | |
52 | ||
e364e6f1 | 53 | void * |
de659123 | 54 | inhibit_stack_protector |
3c30afc8 L |
55 | foo_protected_ifunc (void) |
56 | { | |
31c759bf | 57 | return ifunc_sel (one, zero, minus_one); |
3c30afc8 L |
58 | } |
59 | ||
60 | /* Test hidden indirect function. */ | |
61 | __asm__(".hidden foo_hidden"); | |
62 | ||
63 | /* Test protected indirect function. */ | |
64 | __asm__(".protected foo_protected"); |