1 /* Test STT_GNU_IFUNC symbols without direct function call. */ 2 #include "ifunc-sel.h" 3 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"); 11 12 static int one(void)13one (void) 14 { 15 return 1; 16 } 17 18 static int minus_one(void)19minus_one (void) 20 { 21 return -1; 22 } 23 24 static int zero(void)25zero (void) 26 { 27 return 0; 28 } 29 30 void * foo_ifunc (void) __asm__ ("foo"); 31 __asm__(".type foo, %gnu_indirect_function"); 32 33 void * 34 inhibit_stack_protector foo_ifunc(void)35foo_ifunc (void) 36 { 37 return ifunc_sel (one, minus_one, zero); 38 } 39 40 void * foo_hidden_ifunc (void) __asm__ ("foo_hidden"); 41 __asm__(".type foo_hidden, %gnu_indirect_function"); 42 43 void * 44 inhibit_stack_protector foo_hidden_ifunc(void)45foo_hidden_ifunc (void) 46 { 47 return ifunc_sel (minus_one, one, zero); 48 } 49 50 void * foo_protected_ifunc (void) __asm__ ("foo_protected"); 51 __asm__(".type foo_protected, %gnu_indirect_function"); 52 53 void * 54 inhibit_stack_protector foo_protected_ifunc(void)55foo_protected_ifunc (void) 56 { 57 return ifunc_sel (one, zero, minus_one); 58 } 59 60 /* Test hidden indirect function. */ 61 __asm__(".hidden foo_hidden"); 62 63 /* Test protected indirect function. */ 64 __asm__(".protected foo_protected"); 65