aboutsummaryrefslogtreecommitdiffstats
path: root/community/rng-tools/fix-textrels-on-PIC-x86.patch
blob: 88d0a7f90558020a1a3d2350de89697fd8a5d0af (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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
--- rng-tools/rdrand_asm.S
+++ rng-tools/rdrand_asm.S
@@ -49,6 +49,7 @@
 	ret
 ENDPROC(x86_rdrand_nlong)
 
+#define INIT_PIC()
 #define SETPTR(var,ptr)	leaq var(%rip),ptr
 #define PTR0	%rdi
 #define PTR1	%rsi
@@ -84,7 +85,16 @@
 	ret
 ENDPROC(x86_rdrand_nlong)
 
+#if defined(__PIC__)
+#undef __i686 /* gcc builtin define gets in our way */
+#define INIT_PIC() \
+	call __i686.get_pc_thunk.bx ; \
+	addl $_GLOBAL_OFFSET_TABLE_, %ebx
+#define SETPTR(var,ptr)	leal (var)@GOTOFF(%ebx),ptr
+#else
+#define INIT_PIC()
 #define SETPTR(var,ptr)	movl $(var),ptr
+#endif
 #define PTR0	%eax
 #define PTR1	%edx
 #define PTR2	%ecx
@@ -101,6 +111,7 @@
 	movl	8(%ebp), %eax
 	movl	12(%ebp), %edx
 #endif
+	INIT_PIC()
 
 	SETPTR(aes_round_keys, PTR2)
 
@@ -166,6 +177,17 @@
 #endif
 	ret
 ENDPROC(x86_aes_mangle)
+
+#if defined(__i386__) && defined(__PIC__)
+	.section .gnu.linkonce.t.__i686.get_pc_thunk.bx,"ax",@progbits
+.globl __i686.get_pc_thunk.bx
+	.hidden  __i686.get_pc_thunk.bx
+	.type    __i686.get_pc_thunk.bx,@function
+__i686.get_pc_thunk.bx:
+	movl (%esp), %ebx
+	ret
+#endif
+