1 /* Test 3 STT_GNU_IFUNC symbols. */ 2 3 #include "ifunc-sel.h" 4 5 int global = -1; 6 /* Can't use __attribute__((visibility("protected"))) until the GCC bug: 7 8 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65248 9 10 is fixed. */ 11 asm (".protected global"); 12 13 static int one(void)14one (void) 15 { 16 return 1; 17 } 18 19 static int minus_one(void)20minus_one (void) 21 { 22 return -1; 23 } 24 25 static int zero(void)26zero (void) 27 { 28 return 0; 29 } 30 31 void * foo1_ifunc (void) __asm__ ("foo1"); 32 __asm__(".type foo1, %gnu_indirect_function"); 33 34 void * 35 inhibit_stack_protector foo1_ifunc(void)36foo1_ifunc (void) 37 { 38 return ifunc_sel (one, minus_one, zero); 39 } 40 41 void * foo2_ifunc (void) __asm__ ("foo2"); 42 __asm__(".type foo2, %gnu_indirect_function"); 43 44 void * 45 inhibit_stack_protector foo2_ifunc(void)46foo2_ifunc (void) 47 { 48 return ifunc_sel (minus_one, one, zero); 49 } 50 51 void * foo3_ifunc (void) __asm__ ("foo3"); 52 __asm__(".type foo3, %gnu_indirect_function"); 53 54 void * 55 inhibit_stack_protector foo3_ifunc(void)56foo3_ifunc (void) 57 { 58 return ifunc_sel (one, zero, minus_one); 59 } 60