ifuncmain7.c 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /* Test local STT_GNU_IFUNC symbols:
  2. 1. Direct function call.
  3. 2. Function pointer.
  4. */
  5. #include <stdlib.h>
  6. #include "ifunc-sel.h"
  7. extern int foo (void);
  8. static int
  9. one (void)
  10. {
  11. return -30;
  12. }
  13. static void * __attribute__ ((used)) foo_ifunc (void) __asm__ ("foo");
  14. __asm__(".type foo, %gnu_indirect_function");
  15. static void *
  16. __attribute__ ((used))
  17. foo_ifunc (void)
  18. {
  19. return ifunc_one (one);
  20. }
  21. typedef int (*foo_p) (void);
  22. extern foo_p __attribute__ ((noinline)) get_foo_p (void);
  23. extern foo_p __attribute__ ((noinline)) get_foo (void);
  24. foo_p foo_ptr = foo;
  25. foo_p
  26. __attribute__ ((noinline))
  27. get_foo_p (void)
  28. {
  29. return foo_ptr;
  30. }
  31. foo_p
  32. __attribute__ ((noinline))
  33. get_foo (void)
  34. {
  35. return foo;
  36. }
  37. int
  38. main (void)
  39. {
  40. foo_p p;
  41. p = get_foo ();
  42. if (p != foo)
  43. abort ();
  44. if ((*p) () != -30)
  45. abort ();
  46. p = get_foo_p ();
  47. if (p != foo)
  48. abort ();
  49. if ((*p) () != -30)
  50. abort ();
  51. if (foo_ptr != foo)
  52. abort ();
  53. if ((*foo_ptr) () != -30)
  54. abort ();
  55. if (foo () != -30)
  56. abort ();
  57. return 0;
  58. }