]> git.ipfire.org Git - thirdparty/glibc.git/blame - elf/ifuncmod1.c
Fix /* in comment in previous commit.
[thirdparty/glibc.git] / elf / ifuncmod1.c
CommitLineData
2f083d75
L
1/* Test STT_GNU_IFUNC symbols:
2
3 1. Direct function call.
4 2. Function pointer.
5 3. Visibility.
6 */
31c759bf 7#include "ifunc-sel.h"
2f083d75 8
31c759bf 9int global __attribute__ ((visibility ("protected"))) = -1;
2f083d75
L
10
11static int
12one (void)
13{
14 return 1;
15}
16
17static int
18minus_one (void)
19{
20 return -1;
21}
22
23static int
31c759bf 24zero (void)
2f083d75
L
25{
26 return 0;
27}
28
29void * foo_ifunc (void) __asm__ ("foo");
30__asm__(".type foo, %gnu_indirect_function");
31
31c759bf 32void *
2f083d75
L
33foo_ifunc (void)
34{
31c759bf 35 return ifunc_sel (one, minus_one, zero);
2f083d75
L
36}
37
38void * foo_hidden_ifunc (void) __asm__ ("foo_hidden");
39__asm__(".type foo_hidden, %gnu_indirect_function");
40
31c759bf 41void *
2f083d75
L
42foo_hidden_ifunc (void)
43{
31c759bf 44 return ifunc_sel (minus_one, one, zero);
2f083d75
L
45}
46
47void * foo_protected_ifunc (void) __asm__ ("foo_protected");
48__asm__(".type foo_protected, %gnu_indirect_function");
49
31c759bf 50void *
2f083d75
L
51foo_protected_ifunc (void)
52{
31c759bf 53 return ifunc_sel (one, zero, minus_one);
2f083d75
L
54}
55
56/* Test hidden indirect function. */
57__asm__(".hidden foo_hidden");
58
59/* Test protected indirect function. */
60__asm__(".protected foo_protected");
61
62extern int foo (void);
63extern int foo_hidden (void);
64extern int foo_protected (void);
65extern int ret_foo;
66extern int ret_foo_hidden;
67extern int ret_foo_protected;
68
69#define FOO_P
70typedef int (*foo_p) (void);
71
72foo_p
73get_foo_p (void)
74{
75 ret_foo = foo ();
76 return foo;
77}
78
79foo_p
80get_foo_hidden_p (void)
81{
82 ret_foo_hidden = foo_hidden ();
83 return foo_hidden;
84}
85
86foo_p
87get_foo_protected_p (void)
88{
89 ret_foo_protected = foo_protected ();
90 return foo_protected;
91}