summaryrefslogtreecommitdiff
path: root/ld/testsuite/ld-x86-64/gprel-1b.c
blob: 97d3b553b95835b8e8ec0843d2350b0a497428e1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <syscall.h>
#include <asm/prctl.h>

extern int foo;
extern int __gp;
extern int foo_gprel;
extern int get_foo (void);

int
setup_gp (void *p)
{
  int result;
  asm volatile ("syscall"
		: "=a" (result)
		: "0" ((unsigned long int) SYS_arch_prctl),
		  "D" ((unsigned long int) ARCH_SET_GS),
		  "S" (p)
		: "memory", "cc", "r11", "cx");
  return result;
}

int
main ()
{
  setup_gp (&__gp);
  if (foo == 0x12345678
      && *(int *) ((char *) &__gp + foo_gprel) == 0x12345678
      && get_foo () == 0x12345678)
    printf ("PASS\n");
  return 0;
}