--- rdrand_asm.S.orig 2013-05-15 18:36:30.143681857 +0200 +++ rdrand_asm.S.orig 2013-05-15 18:48:13.372698103 +0200 @@ -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 + /* * AES round keys for an arbitrary key: * 00102030405060708090A0B0C0D0E0F0