ifuncmod1.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. /* Test STT_GNU_IFUNC symbols:
  2. 1. Direct function call.
  3. 2. Function pointer.
  4. 3. Visibility.
  5. */
  6. #include "ifunc-sel.h"
  7. int global __attribute__ ((visibility ("hidden"))) = -1;
  8. static int
  9. one (void)
  10. {
  11. return 1;
  12. }
  13. static int
  14. minus_one (void)
  15. {
  16. return -1;
  17. }
  18. static int
  19. zero (void)
  20. {
  21. return 0;
  22. }
  23. void * foo_ifunc (void) __asm__ ("foo");
  24. __asm__(".type foo, %gnu_indirect_function");
  25. void *
  26. foo_ifunc (void)
  27. {
  28. return ifunc_sel (one, minus_one, zero);
  29. }
  30. void * foo_hidden_ifunc (void) __asm__ ("foo_hidden");
  31. __asm__(".type foo_hidden, %gnu_indirect_function");
  32. void *
  33. foo_hidden_ifunc (void)
  34. {
  35. return ifunc_sel (minus_one, one, zero);
  36. }
  37. void * foo_protected_ifunc (void) __asm__ ("foo_protected");
  38. __asm__(".type foo_protected, %gnu_indirect_function");
  39. void *
  40. foo_protected_ifunc (void)
  41. {
  42. return ifunc_sel (one, zero, minus_one);
  43. }
  44. /* Test hidden indirect function. */
  45. __asm__(".hidden foo_hidden");
  46. /* Test protected indirect function. */
  47. __asm__(".protected foo_protected");
  48. extern int foo (void);
  49. extern int foo_hidden (void);
  50. extern int foo_protected (void);
  51. extern int ret_foo;
  52. extern int ret_foo_hidden;
  53. extern int ret_foo_protected;
  54. #define FOO_P
  55. typedef int (*foo_p) (void);
  56. extern foo_p get_foo_p (void);
  57. extern foo_p get_foo_hidden_p (void);
  58. extern foo_p get_foo_protected_p (void);
  59. foo_p
  60. get_foo_p (void)
  61. {
  62. ret_foo = foo ();
  63. return foo;
  64. }
  65. foo_p
  66. get_foo_hidden_p (void)
  67. {
  68. ret_foo_hidden = foo_hidden ();
  69. return foo_hidden;
  70. }
  71. foo_p
  72. get_foo_protected_p (void)
  73. {
  74. ret_foo_protected = foo_protected ();
  75. return foo_protected;
  76. }